mirror of
https://github.com/eliasstepanik/vdo.ninja.git
synced 2026-01-14 15:18:28 +00:00
v23.4
This commit is contained in:
parent
55414d1133
commit
74505e8cd0
31
index.html
31
index.html
@ -56,7 +56,7 @@
|
||||
<meta property="twitter:image" content="./media/vdoNinja_logo_full.png" />
|
||||
<meta name="msapplication-TileColor" content="#da532c" />
|
||||
<meta name="theme-color" content="#ffffff" />
|
||||
<link rel="stylesheet" href="./main.css?ver=324" />
|
||||
<link rel="stylesheet" href="./main.css?ver=329" />
|
||||
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/adapter.js"></script>
|
||||
<style id="lightbox-animations" type="text/css"></style>
|
||||
<!-- <link rel="manifest" href="manifest.json" /> -->
|
||||
@ -83,7 +83,7 @@
|
||||
|
||||
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=47"></script>
|
||||
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/aes.js"></script>
|
||||
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=631"></script>
|
||||
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=638"></script>
|
||||
<input id="zoomSlider" type="range" style="display: none;" />
|
||||
<span id="electronDragZone" style="pointer-events: none; z-index:-10; position:absolute;top:0;left:0;width:100%;height:2%;-webkit-app-region: drag;min-height:20px;"></span>
|
||||
<div id="header">
|
||||
@ -924,15 +924,12 @@
|
||||
<li>
|
||||
Samsung smartphones (A-series) may fail to publish video with some mobile browsers; try using Firefox Mobile or the native <a href='https://docs.vdo.ninja/getting-started/native-mobile-app-versions#android-download-link'>Android app</a> in these cases.
|
||||
</li>
|
||||
<li>
|
||||
Some devices that use hardware encoding can experience video issues; switching to VP8 or VP9 as a <a target='_blank' title='Jump to the documentation' href='https://docs.vdo.ninja/viewers-settings/codec'>codec</a> may help.
|
||||
</li>
|
||||
<br />
|
||||
<h4>
|
||||
<span style="color:#daad09;">Welcome to VDO Ninja! We've rebranded! Nothing else is changing and we're staying 100% free.</span>
|
||||
</h4>
|
||||
<br />
|
||||
😁 This is Version 23; it's still in development. 🧪 Please report any issues you have with it. Development <a target="_blank" href='https://updates.vdo.ninja/'>updates are here.</a>
|
||||
😁🌱 Site last updated on May 8th. If facing new problems, the previous version can still be <a href="https://vdo.ninja/v22/">accessed here</a>. Development <a target="_blank" href='https://updates.vdo.ninja/'>updates are here.</a>
|
||||
<br />
|
||||
<br />
|
||||
<h3>
|
||||
@ -1388,7 +1385,7 @@
|
||||
<!-- General Controls -->
|
||||
<div class="row two">
|
||||
<!-- Video Feed Quality -->
|
||||
<div class="row three">
|
||||
<div class="row three advanced">
|
||||
<button class="" data-action-type="change-quality1" title="Disable Video Preview" onclick="toggleQualityDirector(0, this.dataset.UUID, this);">
|
||||
<i class="las la-video-slash"></i>
|
||||
</button>
|
||||
@ -1444,10 +1441,10 @@
|
||||
<i class="las la-video-slash"></i>
|
||||
<span data-translate="mute-video-guest">Video off</span>
|
||||
</button>
|
||||
<button class="mainonly" data-action-type="toggle-remote-speaker" title="Toggle the remote guest's speaker output" onclick="remoteSpeakerMute(this, event);">
|
||||
<button class="mainonly advanced" data-action-type="toggle-remote-speaker" title="Toggle the remote guest's speaker output" onclick="remoteSpeakerMute(this, event);">
|
||||
<i class="las la-volume-off"></i> <span data-translate="toggle-remote-speaker">Deafen</span>
|
||||
</button>
|
||||
<button data-action-type="hide-guest" title="Hide this guest everywhere" onclick="remoteHideVideo(this, event);">
|
||||
<button class="advanced" data-action-type="hide-guest" title="Hide this guest everywhere" onclick="remoteHideVideo(this, event);">
|
||||
<i class="las la-user-slash"></i>
|
||||
<span data-translate="hide-guest">Hide</span>
|
||||
</button>
|
||||
@ -1459,7 +1456,7 @@
|
||||
<span data-translate="add-to-scene">add to scene 1</span>
|
||||
</button>
|
||||
</div>
|
||||
<button class="hideDropMenu" onclick="toggleByDataset('1');getById('chevarrow3').classList.toggle('bottom');getById('chevarrow3').classList.toggle('right');">
|
||||
<button class="hideDropMenu advanced" onclick="toggleByDataset('1');getById('chevarrow3').classList.toggle('bottom');getById('chevarrow3').classList.toggle('right');">
|
||||
<i id="chevarrow3" class="chevron right" aria-hidden="true"></i>
|
||||
<span data-translate="scene-options">Scene options</span>
|
||||
</button>
|
||||
@ -1519,7 +1516,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="hideDropMenu" onclick="toggleByDataset('2');getById('chevarrow4').classList.toggle('bottom');getById('chevarrow4').classList.toggle('right');">
|
||||
<button class="hideDropMenu advanced" onclick="toggleByDataset('2');getById('chevarrow4').classList.toggle('bottom');getById('chevarrow4').classList.toggle('right');">
|
||||
<i id="chevarrow4" class="chevron right" aria-hidden="true" ></i>
|
||||
<span data-translate="additional-controls">Additional Controls</span>
|
||||
</button>
|
||||
@ -1539,7 +1536,7 @@
|
||||
<i class="las la-plus"></i>
|
||||
</button>
|
||||
</span>
|
||||
<button class="mainonly" data-action-type="create-timer" title="Set a countdown timer that this guest sees. CTRL (cmd) + click to pause." onclick="directTimer(this, event);">
|
||||
<button class="mainonly advanced" data-action-type="create-timer" title="Set a countdown timer that this guest sees. CTRL (cmd) + click to pause." onclick="directTimer(this, event);">
|
||||
<i class="las la-clock"></i>
|
||||
<span data-translate="create-timer">Create Timer</span>
|
||||
</button>
|
||||
@ -1555,11 +1552,11 @@
|
||||
<i class="las la-cog"></i>
|
||||
<span data-translate="change-params">URL Params</span>
|
||||
</button>
|
||||
<button class="mainonly" data-action-type="change-url" title="Remotely reload the guest's page with a new URL" onclick="directPageReload(this, event);">
|
||||
<button class="mainonly advanced" data-action-type="change-url" title="Remotely reload the guest's page with a new URL" onclick="directPageReload(this, event);">
|
||||
<i class="las la-sync"></i>
|
||||
<span data-translate="change-url">Change URL</span>
|
||||
</button>
|
||||
<button class="mainonly" data-action-type="open-file-share" title="Allow the guest to select a file to upload to the director. Once shared, it will show in the chat as a download link." onclick="requestFileUpload(this)">
|
||||
<button class="mainonly advanced" data-action-type="open-file-share" title="Allow the guest to select a file to upload to the director. Once shared, it will show in the chat as a download link." onclick="requestFileUpload(this)">
|
||||
<i class="las la-file-upload"></i>
|
||||
<span data-translate="request-upload"> Request File</span>
|
||||
</button>
|
||||
@ -2376,7 +2373,7 @@
|
||||
|
||||
|
||||
var session = WebRTC.Media; // session is a required global variable if configuring manually. Run before loading main.js but after webrtc.js.
|
||||
session.version = "23.3b";
|
||||
session.version = "23.4";
|
||||
session.streamID = session.generateStreamID(); // randomly generates a streamID for this session. You can set your own programmatically if needed
|
||||
|
||||
session.defaultPassword = "someEncryptionKey123"; // Change this password if self-deploying for added security/privacy
|
||||
@ -2489,11 +2486,11 @@
|
||||
// session.hidehome = true; // If used, 'hide home' will make the landing page inaccessible, along with hiding a few go-home elements.
|
||||
// session.record = false; // uncomment to block users from being able to record via vdo.ninja's built in recording function
|
||||
</script>
|
||||
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=788"></script>
|
||||
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=803"></script>
|
||||
<!--
|
||||
// If you wish to change branding, blank offers a good clean start.
|
||||
<script type="text/javascript" id="main-js" src="./main.js" data-translation="blank"></script>
|
||||
-->
|
||||
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=617"></script>
|
||||
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=629"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
136
lib.js
136
lib.js
@ -118,7 +118,8 @@ var miscTranslations = {
|
||||
"token-not-director": "The request failed; the remote user did not recognize you as the director",
|
||||
"approved-as-director": "The director approved you as a co-director",
|
||||
"you-are-a-codirector": "You are a co-director of this room; you have partial director control assigned to you.",
|
||||
"this-is-you": "This is you, a co-director.<br />You are also a performer."
|
||||
"this-is-you": "This is you, a co-director.<br />You are also a performer.",
|
||||
"preview-meshcast-disabled": "You can't adjust the preview bitrate for Meshcast-based streams"
|
||||
};
|
||||
|
||||
// function log(msg){ // uncomment to enable logging.
|
||||
@ -457,6 +458,7 @@ function safariVersion() {
|
||||
try{
|
||||
var iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform); // used by main.js also
|
||||
var iPad = (navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && /MacIntel/.test(navigator.platform));
|
||||
|
||||
var macOS = navigator.userAgent.indexOf('Mac OS X') != -1;
|
||||
macOS = macOS && !(iOS || iPad);
|
||||
var Firefox = navigator.userAgent.indexOf("Firefox")>=0;
|
||||
@ -473,8 +475,18 @@ try{
|
||||
var cpuSupport = detectCPUSupport();
|
||||
log(cpuSupport);
|
||||
|
||||
var iPhone12Up = false;
|
||||
|
||||
if (iOS && !iPad){
|
||||
if ((window.devicePixelRatio.toFixed(2)>=3) && (window.screen.height>800) && (window.screen.width!=414)){ // for reference, https://www.ios-resolution.com/
|
||||
iPhone12Up = true; // iPhone SE is left out.
|
||||
}
|
||||
}
|
||||
|
||||
} catch(e){errorlog(e);}
|
||||
|
||||
|
||||
|
||||
if (isVingester){
|
||||
console.warn("If Vingester isn't able to capture audio, get a fixed version of Vingester from here: https://github.com/steveseguin/vingester/releases/");
|
||||
}
|
||||
@ -4710,6 +4722,9 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a
|
||||
}
|
||||
if (miniPerformerX !== null){
|
||||
container.style.left = miniPerformerX + "%";
|
||||
} else if (session.leftMiniPreview!==false){
|
||||
container.style.left = session.leftMiniPreview + "%";
|
||||
togglePreview.style.left = session.leftMiniPreview + "%";
|
||||
} else {
|
||||
container.style.right = "2vw";
|
||||
togglePreview.style.right = "2vw";
|
||||
@ -9424,9 +9439,13 @@ function printValues(obj) { // see: printViewStats
|
||||
}
|
||||
else if (key == 'version') {
|
||||
stat = "VDO.Ninja Version";
|
||||
} else if (key == 'platform') {
|
||||
}
|
||||
else if (key == 'platform') {
|
||||
stat = "Platform (OS)";
|
||||
}
|
||||
else if (key == 'iPhone12Up') {
|
||||
stat = "iPhone 12 and up";
|
||||
}
|
||||
else if (key == 'aec_url') {
|
||||
stat = "Echo-Cancellation";
|
||||
}
|
||||
@ -9904,10 +9923,11 @@ function printMyStats(menu) { // see: setupStatsMenu
|
||||
}
|
||||
});
|
||||
|
||||
if (session.pcs[UUID] && session.pcs[UUID].restartIce){ // only show if available
|
||||
menu.innerHTML += "<button onclick='session.pcs[\""+UUID+"\"].restartIce();'>Restart connection</button>";
|
||||
if (UUID && session.pcs[UUID] && session.pcs[UUID].restartIce){ // only show if available
|
||||
menu.innerHTML += "<button onclick='session.pcs[\""+UUID+"\"].restartIce();' title='This will trigger an ICE Restart, which may or may not help with some connection issues'>Restart connection</button>";
|
||||
}
|
||||
|
||||
|
||||
keys.forEach(key=>{
|
||||
if (typeof obj[key] !== "object") {
|
||||
if (key.startsWith("_")){return;}
|
||||
@ -9954,6 +9974,21 @@ function printMyStats(menu) { // see: setupStatsMenu
|
||||
menu.innerHTML += "<li><span>" + stat + "</span><span>" + value + "</span></li>";
|
||||
}
|
||||
});
|
||||
|
||||
if (UUID && session.pcs[UUID]){
|
||||
if (session.pcs[UUID].maxBandwidth){
|
||||
menu.innerHTML += "<li><span>max bandwidth target</span><span>" + session.pcs[UUID].maxBandwidth + "</span></li>";
|
||||
}
|
||||
if (session.pcs[UUID].setBitrate){
|
||||
menu.innerHTML += "<li><span onclick='var bitr=prompt(\"Enter a target bitrate (kbps)\");if (bitr!==null){session.limitBitrate(\""+UUID+"\", parseInt(bitr));}'>init bitrate target</span><span>" + session.pcs[UUID].setBitrate + "</span></li>";
|
||||
}
|
||||
if (session.pcs[UUID].savedBitrate){
|
||||
menu.innerHTML += "<li><span>current bitrate target</span><span>" + session.pcs[UUID].savedBitrate + "</span></li>";
|
||||
}
|
||||
if (session.room!==false){
|
||||
menu.innerHTML += "<li><span title='Only available if not in a group room'>adjust video bitrate</span><span><input class='thinSlider' title='Adjust the outbound bitrate for this stream.' type='range' value='"+(session.pcs[UUID].savedBitrate || session.pcs[UUID].setBitrate || 2500)+"' min='0' max='"+(session.pcs[UUID].setBitrate || 6000)+"' onchange='session.limitBitrate(\""+UUID+"\", parseInt(this.value));' /></span></li>";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printViewValues(session.stats);
|
||||
@ -11311,6 +11346,7 @@ async function toggleSettings(forceShow = false) { // TODO: I need to have this
|
||||
toggleSettingsState = false;
|
||||
document.getElementById('videoSettings3').style.display = "none";
|
||||
}
|
||||
pokeIframeAPI("settings-menu-state",toggleSettingsState);
|
||||
}
|
||||
|
||||
function hangup() { // TODO: I need to have this be MUTE, toggle, with volume not touched.
|
||||
@ -11966,7 +12002,7 @@ function syncGroup(groups, UUID){
|
||||
function syncSceneState(sid){
|
||||
if (!session.syncState){return;}
|
||||
if (!session.syncState[sid]){return;}
|
||||
var scenes = session.syncState[sid].scenes;
|
||||
var scenes = session.syncState[sid].scenes || [];
|
||||
for (var scene in scenes){
|
||||
try {
|
||||
var ele = document.querySelector('[data-sid="'+sid+'"][data-action-type="addToScene"][data-scene="'+scene+'"]');
|
||||
@ -11974,6 +12010,7 @@ function syncSceneState(sid){
|
||||
if (scenes[scene]){
|
||||
ele.value = 1;
|
||||
ele.classList.add("pressed"); ele.ariaPressed = "true";
|
||||
getById("container_" + ele.dataset.UUID).classList.add("containerGreen");
|
||||
if (ele.children[1]){
|
||||
ele.children[1].innerHTML = "Remove";
|
||||
}
|
||||
@ -13337,6 +13374,9 @@ function updateForceRotate(){
|
||||
updateForceRotatedCSS()
|
||||
applyMirror(session.mirrorExclude);
|
||||
}
|
||||
|
||||
session.setResolution(); // probably only triggers with mobile devices?
|
||||
|
||||
}
|
||||
|
||||
function updateForceRotatedCSS(){
|
||||
@ -15947,6 +15987,12 @@ async function createRoomCallback(passAdd, passAdd2) {
|
||||
} else if (session.chatbutton === false) {
|
||||
getById("chatbutton").classList.add("hidden");
|
||||
}
|
||||
|
||||
if (session.effect===false){
|
||||
session.effect = null; // so the director can see the effects
|
||||
}
|
||||
|
||||
getById("avatarDiv3").classList.remove("hidden"); // lets the director see the avatar option
|
||||
|
||||
clearInterval(session.updateLocalStatsInterval);
|
||||
session.updateLocalStatsInterval = setInterval(function(){updateLocalStats();},session.statsInterval);
|
||||
@ -16230,8 +16276,9 @@ async function createDirectorOnlyBox() {
|
||||
controls.id = "controls_director";
|
||||
|
||||
var container = document.createElement("div");
|
||||
container.id = "container_director"; // needed to delete on user disconnect
|
||||
container.className = "vidcon directorMargins";
|
||||
container.id = "container_director"; // needed to delete on user disconnect
|
||||
|
||||
|
||||
var buttons = "";
|
||||
if (session.slotmode){
|
||||
@ -16414,8 +16461,9 @@ async function createDirectorScreenshareOnlyBox() { // sstype=3
|
||||
controls.id = "controls_screen_director";
|
||||
|
||||
var container = document.createElement("div");
|
||||
container.id = "container_screen_director"; // needed to delete on user disconnect
|
||||
container.className = "vidcon directorMargins";
|
||||
container.id = "container_screen_director"; // needed to delete on user disconnect
|
||||
|
||||
|
||||
var buttons = "";
|
||||
if (session.slotmode){
|
||||
@ -16882,9 +16930,10 @@ function createControlBox(UUID, soloLink, streamID) {
|
||||
controls.id = "controls_" + UUID;
|
||||
|
||||
var container = document.createElement("div");
|
||||
container.className = "vidcon directorMargins";
|
||||
container.id = "container_" + UUID; // needed to delete on user disconnect
|
||||
container.UUID = UUID;
|
||||
container.className = "vidcon directorMargins";
|
||||
container.dataset.UUID = UUID;
|
||||
|
||||
if (session.orderby){
|
||||
try {
|
||||
@ -21051,6 +21100,7 @@ async function grabVideo(quality = 0, eleName = 'previewWebcam', selector = "sel
|
||||
exact: session.height
|
||||
};
|
||||
}
|
||||
|
||||
if (session.frameRate) {
|
||||
constraints.video.frameRate = {
|
||||
exact: session.frameRate
|
||||
@ -21061,13 +21111,26 @@ async function grabVideo(quality = 0, eleName = 'previewWebcam', selector = "sel
|
||||
max: session.maxframeRate
|
||||
};
|
||||
} else if ((iOS || iPad) && (SafariVersion>15)) { // iOS supports 720p60, but just 1080p30 : iphone 11 on march 2023
|
||||
if (quality === 1) {
|
||||
if (quality === 1) { // iphone 11 and older
|
||||
if (!constraints.video.frameRate){
|
||||
constraints.video.frameRate = {
|
||||
ideal: 60,
|
||||
max: 60
|
||||
};
|
||||
}
|
||||
} else if (iPhone12Up && (quality<1)){ // iphone 12 and up?
|
||||
if (!constraints.video.frameRate){
|
||||
try {
|
||||
if (videoSelect.options[videoSelect.selectedIndex].innerText.startsWith("Back ")){ // front seems to be limited to 720p60 / 1080p30
|
||||
constraints.video.frameRate = {
|
||||
ideal: 60,
|
||||
max: 60
|
||||
};
|
||||
}
|
||||
} catch(e){
|
||||
errorlog(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -21352,13 +21415,13 @@ async function grabVideo(quality = 0, eleName = 'previewWebcam', selector = "sel
|
||||
// log("16068");
|
||||
await updateCameraConstraints("aspectRatio", session.forceAspectRatio);
|
||||
//}
|
||||
} else {
|
||||
log("16072");
|
||||
session.setResolution(); // this runs already when updateCameraConstraints succeeds
|
||||
}
|
||||
}// else {
|
||||
//log("16072");
|
||||
// session.setResolution(); // this runs already when updateCameraConstraints succeeds
|
||||
//}
|
||||
|
||||
//log("16075");
|
||||
updateForceRotate();
|
||||
//log("16075");
|
||||
updateForceRotate(); // this contains session.setResolution();
|
||||
|
||||
if (iOS || iPad){
|
||||
// if we don't do this, portrait videos may be detected as horizontal
|
||||
@ -21482,9 +21545,17 @@ function updateRenderOutpipe(){ // video only.
|
||||
|
||||
if (session.streamSrc){
|
||||
var tracks = session.streamSrc.getVideoTracks();
|
||||
|
||||
|
||||
|
||||
if (!tracks.length || session.videoMuted){
|
||||
tracks = setAvatarImage(tracks);
|
||||
if (tracks.length){
|
||||
|
||||
if (tracks.length && !session.cleanOutput && !session.cleanish){
|
||||
getById("mutevideobutton").classList.remove("hidden");
|
||||
}
|
||||
|
||||
tracks.forEach(function(track) {
|
||||
session.videoElement.srcObject.addTrack(track);
|
||||
if (session.avatar && session.avatar.tracks){
|
||||
@ -21501,6 +21572,7 @@ function updateRenderOutpipe(){ // video only.
|
||||
msg.videoMuted = true;
|
||||
session.sendMessage(msg);
|
||||
session.videoElement.load();
|
||||
getById("mutevideobutton").classList.add("hidden");
|
||||
}
|
||||
} else if (tracks.length){
|
||||
applyMirror(session.mirrorExclude);
|
||||
@ -21510,6 +21582,10 @@ function updateRenderOutpipe(){ // video only.
|
||||
toggleVideoMute(true);
|
||||
pushOutVideoTrack(track); // video only
|
||||
});
|
||||
|
||||
if (tracks.length && !session.cleanOutput && !session.cleanish){
|
||||
getById("mutevideobutton").classList.remove("hidden");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -27769,7 +27845,7 @@ function setupWebcamSelection(miconly=false) {
|
||||
try {
|
||||
return enumerateDevices().then(function(dInfo){return gotDevices(dInfo, miconly)}).then(function() {
|
||||
|
||||
if (getById("webcamquality").elements && parseInt(getById("webcamquality").elements.namedItem("resolution").value) == 3) {
|
||||
if (getById("webcamquality").elements && parseInt(getById("webcamquality").elements.namedItem("resolution").value) == 3) { // this is junk??
|
||||
if (session.maxframeRate===false){
|
||||
session.maxframeRate = 30;
|
||||
session.maxframeRate_q2 = true;
|
||||
@ -29847,6 +29923,31 @@ function sendChatMessage(chatMsg = false, bc = false) { // filtered + visual
|
||||
return true;
|
||||
}
|
||||
|
||||
function disableQualityDirector(UUID){ // lets revert back to the director's quality settings after viewing the scene
|
||||
try {
|
||||
var elements = document.querySelectorAll('[data-action-type="change-quality2"][data--u-u-i-d="' + UUID + '"]');
|
||||
if (elements[0]) {
|
||||
elements[0].classList.add("disable"); elements[0].ariaPressed = "false";
|
||||
elements[0].classList.remove("pressed");
|
||||
elements[0].disabled = "true";
|
||||
elements[0].title = miscTranslations["preview-meshcast-disabled"];
|
||||
}
|
||||
var elements = document.querySelectorAll('[data-action-type="change-quality1"][data--u-u-i-d="' + UUID + '"]');
|
||||
if (elements[0]) {
|
||||
elements[0].classList.add("disable"); elements[0].ariaPressed = "false";
|
||||
elements[0].classList.remove("pressed");
|
||||
elements[0].disabled = "true";
|
||||
elements[0].title = miscTranslations["preview-meshcast-disabled"];
|
||||
}
|
||||
var elements = document.querySelectorAll('[data-action-type="change-quality3"][data--u-u-i-d="' + UUID + '"]');
|
||||
if (elements[0]) {
|
||||
elements[0].classList.add("disable"); elements[0].ariaPressed = "false";
|
||||
elements[0].classList.remove("pressed");
|
||||
elements[0].disabled = "true";
|
||||
elements[0].title = miscTranslations["preview-meshcast-disabled"];
|
||||
}
|
||||
} catch(e){errorlog(e);}
|
||||
}
|
||||
|
||||
function applyQualityDirector() { // lets revert back to the director's quality settings after viewing the scene
|
||||
var eles = document.querySelectorAll('#guestFeeds button.pressed[data-action-type="change-quality1"],#guestFeeds button.pressed[data-action-type="change-quality2"],#guestFeeds button.pressed[data-action-type="change-quality3"]');
|
||||
@ -36134,9 +36235,10 @@ function createControlBoxScreenshare(UUID, soloLink, streamID) {
|
||||
controls.id = "controls_" + UUID;
|
||||
|
||||
var container = document.createElement("div");
|
||||
container.className = "vidcon directorMargins";
|
||||
container.id = "container_" + UUID; // needed to delete on user disconnect
|
||||
container.UUID = UUID;
|
||||
container.className = "vidcon directorMargins";
|
||||
container.dataset.UUID = UUID;
|
||||
|
||||
if (session.orderby){
|
||||
try {
|
||||
|
||||
41
main.css
41
main.css
@ -1765,6 +1765,16 @@ input[type=range].inputConstraint {
|
||||
/* ////// Icon resizing for mobile subControl bar ////// */
|
||||
|
||||
|
||||
input[type=range].thinSlider {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 10px;
|
||||
top: 5px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.inMessage {
|
||||
color: #000;
|
||||
margin: 3px;
|
||||
@ -2874,6 +2884,10 @@ audio.fileshare::-webkit-media-controls-play-button, video.fileshare::-webkit-me
|
||||
display: inherit;
|
||||
}
|
||||
|
||||
video::-webkit-media-controls-panel {
|
||||
background-color: #0000;
|
||||
}
|
||||
|
||||
.mirrorControl::-webkit-media-controls-enclosure {
|
||||
padding: 0px;
|
||||
height: 30px;
|
||||
@ -3277,6 +3291,7 @@ label {
|
||||
.directorMargins {
|
||||
margin: var(--director-margin);
|
||||
}
|
||||
|
||||
.hideLinksClass {
|
||||
background-color: var(--container-color);
|
||||
width:1191px;
|
||||
@ -3381,7 +3396,13 @@ div#roomnotes2 {
|
||||
#yourDirectorStatus {
|
||||
color: var(--discord-text);
|
||||
}
|
||||
|
||||
.directorBlue{
|
||||
background-color: #5c7785 !important;
|
||||
|
||||
}
|
||||
.directorBox{
|
||||
background-color: #606383 !important;
|
||||
}
|
||||
/* ---- DIRECTORS PAGE - Guest Controls Box ---- */
|
||||
.controlsGrid {
|
||||
display: flex;
|
||||
@ -5180,7 +5201,10 @@ input[type='checkbox'], input[type='radio'] {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
|
||||
.disable {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
/* Buttons to disable due to them being a director */
|
||||
.directorBoxColor button[data-action-type="hangup"],
|
||||
@ -5248,6 +5272,9 @@ input[type='checkbox'], input[type='radio'] {
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
#popupSelector label {
|
||||
color: black;
|
||||
}
|
||||
.darktheme #popupSelector label {
|
||||
color: white;
|
||||
}
|
||||
#popupSelector .multiselect-contents label{
|
||||
@ -5270,7 +5297,15 @@ input[type='checkbox'], input[type='radio'] {
|
||||
#popupSelector_constraints_video > div, #popupSelector_constraints_audio > div {
|
||||
padding: 10px 10px 10px 0;
|
||||
}
|
||||
|
||||
#popupSelector_constraints_audio label {
|
||||
color:white;
|
||||
}
|
||||
#popupSelector_constraints_video label {
|
||||
color:white;
|
||||
}
|
||||
#popupSelector_user_settings label {
|
||||
color:white;
|
||||
}
|
||||
ul#audioSource{
|
||||
background-color: var(--lighttheme-1);
|
||||
margin-top: 7px;
|
||||
|
||||
24
main.js
24
main.js
@ -123,6 +123,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
|
||||
if (urlParams.has('director') || urlParams.has('dir')) {
|
||||
session.director = urlParams.get('director') || urlParams.get('dir') || true;
|
||||
session.effect = null; // so the director can see the effects after a page refresh
|
||||
getById("avatarDiv3").classList.remove("hidden"); // lets the director see the avatar option
|
||||
}
|
||||
|
||||
if (urlParams.has('controls') || urlParams.has('videocontrols')) {
|
||||
@ -1926,6 +1927,17 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
|
||||
session.nopreview = false;
|
||||
session.minipreview = mini;
|
||||
}
|
||||
|
||||
if (urlParams.has('minipreviewoffset') || urlParams.has('mpo')){ // 40 would be centered
|
||||
session.leftMiniPreview = urlParams.get('minipreviewoffset') || urlParams.get('mpo') || 0;
|
||||
session.leftMiniPreview = parseInt(session.leftMiniPreview) || 0;
|
||||
if (session.leftMiniPreview<-20){
|
||||
session.leftMiniPreview = -20;
|
||||
} else if (session.leftMiniPreview>120){
|
||||
session.leftMiniPreview = 120;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (urlParams.has('obsfix')) {
|
||||
session.obsfix = urlParams.get('obsfix');
|
||||
@ -4547,6 +4559,18 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
|
||||
toggleMute();
|
||||
}
|
||||
}
|
||||
|
||||
if ("toggleSettings" in e.data) { // this should work for the director's mic mute button as well. Needs to be manually enabled the first time still tho.
|
||||
|
||||
if (e.data.toggleSettings && !toggleSettingsState){
|
||||
toggleSettings();
|
||||
} else if (e.data.toggleSettings=="toggle"){
|
||||
toggleSettings();
|
||||
} else if (toggleSettingsState){
|
||||
toggleSettings();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ("camera" in e.data) { // this should work for the director's mic mute button as well. Needs to be manually enabled the first time still tho.
|
||||
if (e.data.camera === true) { // unmute
|
||||
|
||||
@ -639,7 +639,7 @@
|
||||
}
|
||||
.close-btn {
|
||||
color: #333;
|
||||
font-size: 24px;
|
||||
font-size: 42px;
|
||||
font-weight: bold;
|
||||
user-select: none;
|
||||
}
|
||||
@ -930,7 +930,7 @@
|
||||
<div>
|
||||
<a class="github" href="https://github.com/steveseguin/vdoninja" rel="noopener" target="_blank" title="Star steveseguin/vdoninja on GitHub"></a>
|
||||
</div>
|
||||
<div style="cursor:pointer;" onclick="window.open('https://vdo.ninja');">Powered by VDO.Ninja</div>
|
||||
<div style="cursor:pointer;" onclick="window.open('https://vdo.ninja');">Powered by VDO.Ninja (v23)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -84,13 +84,10 @@ video {
|
||||
#feeds {
|
||||
display: inline-block;
|
||||
width:100%;
|
||||
height:380px;
|
||||
|
||||
}
|
||||
|
||||
#feeds span {
|
||||
margin:auto;
|
||||
height: 100%;
|
||||
min-width:50%;
|
||||
display: inline-block;
|
||||
flex-direction: column;
|
||||
@ -106,7 +103,7 @@ video {
|
||||
}
|
||||
|
||||
iframe {
|
||||
height: 85%;
|
||||
height: min(85%, 385px);
|
||||
width: 100%;
|
||||
flex: 1;
|
||||
border: 0;
|
||||
@ -206,6 +203,8 @@ ol {
|
||||
|
||||
iframe {
|
||||
width: 100%;
|
||||
height:calc(100% - 100px);
|
||||
max-height: 380px;
|
||||
}
|
||||
|
||||
#feeds {
|
||||
@ -226,9 +225,8 @@ ol {
|
||||
}
|
||||
|
||||
#feeds span{
|
||||
height: :calc(100% - 100px);
|
||||
width:100%;
|
||||
display: inline-block;
|
||||
width:100%;
|
||||
}
|
||||
canvas {
|
||||
margin:auto;
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="./lineawesome/css/line-awesome.min.css" />
|
||||
<link rel="stylesheet" href="./speedtest.css?ver=1" />
|
||||
<link rel="stylesheet" href="./speedtest.css?ver=7" />
|
||||
<meta charset="utf8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>VDON Speed Test</title>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user