Merge pull request #921 from steveseguin/v20.x-dev-patches

V20.1 patches
This commit is contained in:
Steve Seguin 2021-12-28 15:17:48 -05:00 committed by GitHub
commit 4a62065e81
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 203 additions and 61 deletions

View File

@ -67,7 +67,7 @@
<link itemprop="url" href="./media/vdoNinja_logo_full.png" /> <link itemprop="url" href="./media/vdoNinja_logo_full.png" />
</span> </span>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=35"></script> <script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=35"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=338"></script> <script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=339"></script>
<input id="zoomSlider" type="range" style="display: none;" /> <input id="zoomSlider" type="range" style="display: none;" />
<div id="header"> <div id="header">
@ -783,7 +783,7 @@
<font style="color:#daad09;">Welcome to VDO Ninja! We've rebranded! Nothing else is changing and we're staying 100% free.</font> <font style="color:#daad09;">Welcome to VDO Ninja! We've rebranded! Nothing else is changing and we're staying 100% free.</font>
</h4> </h4>
<br /> <br />
🎁 Welcome to v20, updated December 24th. 🎄 <a target="_blank" href="https://docs.vdo.ninja/release-notes/v20">Release notes are here</a>. The previous version is <a href="https://vdo.ninja/v19/">available here</a> if you have new issues. 🎁 Welcome to v20, released December 24th. 🎄 <a target="_blank" href="https://docs.vdo.ninja/release-notes/v20">Release notes are here</a>. The previous version is <a href="https://vdo.ninja/v19/">available here</a> if you have new issues.
<br /> <br />
<br /> <br />
@ -1840,7 +1840,7 @@
var session = WebRTC.Media; // session is a required global variable if configuring manually. Run before loading main.js but after webrtc.js. var session = WebRTC.Media; // session is a required global variable if configuring manually. Run before loading main.js but after webrtc.js.
session.version = "20.0-beta"; session.version = "20.1";
session.streamID = session.generateStreamID(); // randomly generates a streamID for this session. You can set your own programmatically if needed 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 session.defaultPassword = "someEncryptionKey123"; // Change this password if self-deploying for added security/privacy
@ -1905,11 +1905,11 @@
// session.introOnClean = true; // this will load the page with the webcam selection screen if &push or &room is in the URL; no need to use &webcam. // session.introOnClean = true; // this will load the page with the webcam selection screen if &push or &room is in the URL; no need to use &webcam.
</script> </script>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/aes.js"></script> <script type="text/javascript" crossorigin="anonymous" src="./thirdparty/aes.js"></script>
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=246"></script> <script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=247"></script>
<!-- <!--
// If you wish to change branding, blank offers a good clean start. // 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" id="main-js" src="./main.js" data-translation="blank"></script>
--> -->
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=287"></script> <script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=288"></script>
</body> </body>
</html> </html>

174
lib.js
View File

@ -627,7 +627,7 @@ async function confirmAlt(inputText, block=false){
return result; return result;
} }
var warnUserTimeout=null; var modalTimeout=null;
function warnUser(message, timeout=false){ function warnUser(message, timeout=false){
// Allows for multiple alerts to stack better. // Allows for multiple alerts to stack better.
// Every modal and backdrop has an increasing z-index // Every modal and backdrop has an increasing z-index
@ -657,9 +657,9 @@ function warnUser(message, timeout=false){
document.getElementById("modalBackdrop").addEventListener("click", closeModal); document.getElementById("modalBackdrop").addEventListener("click", closeModal);
clearTimeout(warnUserTimeout); clearTimeout(modalTimeout);
if (timeout){ if (timeout){
warnUserTimeout = setTimeout(closeModal, timeout); modalTimeout = setTimeout(closeModal, timeout);
} }
getById("alertModal").addEventListener("click", function(e) { getById("alertModal").addEventListener("click", function(e) {
e.stopPropagation(); e.stopPropagation();
@ -668,6 +668,7 @@ function warnUser(message, timeout=false){
} }
function closeModal(){ function closeModal(){
clearTimeout(modalTimeout);
getById("modalBackdrop").innerHTML = ''; // Delete modal getById("modalBackdrop").innerHTML = ''; // Delete modal
getById("modalBackdrop").remove(); getById("modalBackdrop").remove();
getById("alertModal").innerHTML = ''; // Delete modal getById("alertModal").innerHTML = ''; // Delete modal
@ -691,8 +692,8 @@ var sanitizeStreamID = function(streamID) {
warnUser(miscTranslations["alphanumeric-only"]); warnUser(miscTranslations["alphanumeric-only"]);
} }
} }
if (streamID_sanitized.length > 44) { if (streamID_sanitized.length >= 49) {
streamID_sanitized = streamID_sanitized.substring(0, 44); streamID_sanitized = streamID_sanitized.substring(0, 50);
if (!(session.cleanOutput)) { if (!(session.cleanOutput)) {
warnUser(miscTranslations["stream-id-too-long"]); warnUser(miscTranslations["stream-id-too-long"]);
} }
@ -5213,14 +5214,16 @@ function printMyStats(menu) { // see: setupStatsMenu
if (session.streamSrc && session.streamSrc){ if (session.streamSrc && session.streamSrc){
session.streamSrc.getVideoTracks().forEach(function(track) { session.streamSrc.getVideoTracks().forEach(function(track) {
if (obscam && (parseInt(track.getSettings().frameRate) == 30)) { session.currentCameraConstraints = track.getSettings();
session.stats.video_settings =(track.getSettings().width || 0) + "x" + (track.getSettings().height || 0);
if (obscam && (parseInt(session.currentCameraConstraints.frameRate) == 30)) {
session.stats.video_settings =(session.currentCameraConstraints.width || 0) + "x" + (session.currentCameraConstraints.height || 0);
} else { } else {
var framerateFPS = track.getSettings().frameRate; var framerateFPS = session.currentCameraConstraints.frameRate;
if (framerateFPS){ if (framerateFPS){
session.stats.video_settings = (track.getSettings().width || 0) + "x" + (track.getSettings().height || 0) + " @ " + (parseInt(framerateFPS * 100) / 100.0) + "fps"; session.stats.video_settings = (session.currentCameraConstraints.width || 0) + "x" + (session.currentCameraConstraints.height || 0) + " @ " + (parseInt(framerateFPS * 100) / 100.0) + "fps";
} else { } else {
session.stats.video_settings = (track.getSettings().width || 0) + "x" + (track.getSettings().height || 0); session.stats.video_settings = (session.currentCameraConstraints.width || 0) + "x" + (session.currentCameraConstraints.height || 0);
} }
} }
}); });
@ -5806,7 +5809,7 @@ function updateStats(obsvc = false) {
} }
try { try {
getById(wcs).innerHTML = ""; getById(wcs).innerHTML = "";
ele.srcObject.getVideoTracks().forEach( ele.srcObject.getVideoTracks().forEach(
function(track) { function(track) {
if ((obsvc) && (parseInt(track.getSettings().frameRate) == 30)) { if ((obsvc) && (parseInt(track.getSettings().frameRate) == 30)) {
@ -7052,40 +7055,48 @@ function loadDirectorSettings(){
if (settings.customizeLinks1){ if (settings.customizeLinks1){
var customizeLinks1 = getById("customizeLinks1"); var customizeLinks1 = getById("customizeLinks1");
Object.keys(settings.customizeLinks1).forEach((key, index) => { Object.keys(settings.customizeLinks1).forEach((key, index) => {
if (customizeLinks1.querySelector('[data-param="'+key+'"]').checked != settings.customizeLinks1[key]){ try {
customizeLinks1.querySelector('[data-param="'+key+'"]').checked = settings.customizeLinks1[key]; if (customizeLinks1.querySelector('[data-param="'+key+'"]').checked != settings.customizeLinks1[key]){
customizeLinks1.querySelector('[data-param="'+key+'"]').onchange(); customizeLinks1.querySelector('[data-param="'+key+'"]').checked = settings.customizeLinks1[key];
} customizeLinks1.querySelector('[data-param="'+key+'"]').onchange();
}
} catch(e){errorlog(e);}
}); });
} }
if (settings.customizeLinks3){ if (settings.customizeLinks3){
var customizeLinks3 = getById("customizeLinks3"); var customizeLinks3 = getById("customizeLinks3");
Object.keys(settings.customizeLinks3).forEach((key, index) => { Object.keys(settings.customizeLinks3).forEach((key, index) => {
if (customizeLinks3.querySelector('[data-param="'+key+'"]').checked == settings.customizeLinks3[key]){ try {
customizeLinks3.querySelector('[data-param="'+key+'"]').checked = settings.customizeLinks3[key]; if (customizeLinks3.querySelector('[data-param="'+key+'"]').checked == settings.customizeLinks3[key]){
customizeLinks3.querySelector('[data-param="'+key+'"]').onchange(); customizeLinks3.querySelector('[data-param="'+key+'"]').checked = settings.customizeLinks3[key];
} customizeLinks3.querySelector('[data-param="'+key+'"]').onchange();
}
} catch(e){errorlog(e);}
}); });
} }
if (settings.directorLinks1){ if (settings.directorLinks1){
var directorLinks1 = getById("directorLinks1"); var directorLinks1 = getById("directorLinks1");
Object.keys(settings.directorLinks1).forEach((key, index) => { Object.keys(settings.directorLinks1).forEach((key, index) => {
if (directorLinks1.querySelector('[data-param="'+key+'"]').checked == settings.directorLinks1[key]){ try {
directorLinks1.querySelector('[data-param="'+key+'"]').checked = settings.directorLinks1[key]; if (directorLinks1.querySelector('[data-param="'+key+'"]').checked == settings.directorLinks1[key]){
directorLinks1.querySelector('[data-param="'+key+'"]').onchange(); directorLinks1.querySelector('[data-param="'+key+'"]').checked = settings.directorLinks1[key];
} directorLinks1.querySelector('[data-param="'+key+'"]').onchange();
}
} catch(e){errorlog(e);}
}); });
} }
if (settings.directorLinks2){ if (settings.directorLinks2){
var directorLinks2 = getById("directorLinks2"); var directorLinks2 = getById("directorLinks2");
Object.keys(settings.directorLinks2).forEach((key, index) => { Object.keys(settings.directorLinks2).forEach((key, index) => {
if (directorLinks2.querySelector('[data-param="'+key+'"]').checked == settings.directorLinks2[key]){ try {
directorLinks2.querySelector('[data-param="'+key+'"]').checked = settings.directorLinks2[key]; if (directorLinks2.querySelector('[data-param="'+key+'"]').checked == settings.directorLinks2[key]){
directorLinks2.querySelector('[data-param="'+key+'"]').onchange(); directorLinks2.querySelector('[data-param="'+key+'"]').checked = settings.directorLinks2[key];
} directorLinks2.querySelector('[data-param="'+key+'"]').onchange();
}
} catch(e){errorlog(e);}
}); });
} }
} }
@ -7309,6 +7320,7 @@ function updateForceRotate(){
const settings = track.getSettings(); const settings = track.getSettings();
session.currentCameraConstraints = settings;
if ("width" in settings){ if ("width" in settings){
if ("height" in settings){ if ("height" in settings){
if (settings.width < settings.height){ if (settings.width < settings.height){
@ -8279,7 +8291,7 @@ function activeSpeaker(border=false) {
} else if (lastActiveSpeaker){ } else if (lastActiveSpeaker){
session.rpcs[lastActiveSpeaker].defaultSpeaker=true; session.rpcs[lastActiveSpeaker].defaultSpeaker=true;
changed=true; changed=true;
} else if (session.scene===false || (session.nopreview===false & session.minipreview!==1)){ } else if (session.scene===false || (session.nopreview===false && session.minipreview!==1)){
// we don't need to care. // we don't need to care.
} else { } else {
for (var UUID in session.rpcs) { for (var UUID in session.rpcs) {
@ -8335,7 +8347,7 @@ function activeSpeaker(border=false) {
} else if (lastActiveSpeaker){ } else if (lastActiveSpeaker){
session.rpcs[lastActiveSpeaker].defaultSpeaker=true; session.rpcs[lastActiveSpeaker].defaultSpeaker=true;
changed=true; changed=true;
} else if (session.scene===false || (session.nopreview===false & session.minipreview!==1)){ } else if (session.scene===false || (session.nopreview===false && session.minipreview!==1)){
// we don't need to care. // we don't need to care.
} else { } else {
for (var UUID in session.rpcs) { for (var UUID in session.rpcs) {
@ -8630,6 +8642,7 @@ async function toggleCoDirector(ele){
ele.checked=false; ele.checked=false;
return; return;
} }
session.directorPassword = sanitizePassword(session.directorPassword)
} }
updateURL("codirector="+session.directorPassword, true, false); updateURL("codirector="+session.directorPassword, true, false);
getById("coDirectorEnableSpan").style.display = "none"; getById("coDirectorEnableSpan").style.display = "none";
@ -12070,12 +12083,12 @@ async function grabScreen(quality = 0, audio = true, videoOnEnd = false) {
function toggleRoomSettings(){ function toggleRoomSettings(){
toggle(getById('roomSettings')); toggle(getById('roomSettings'));
if (getById('roomSettings').style.display=="none"){
if (document.getElementById("modalBackdrop")){
getById("modalBackdrop").innerHTML = ''; // Delete modal getById("modalBackdrop").innerHTML = ''; // Delete modal
getById("modalBackdrop").remove(); getById("modalBackdrop").remove();
} else { } else {
getById("modalBackdrop").innerHTML = ''; // Delete modal
getById("modalBackdrop").remove();
zindex = 25; zindex = 25;
getById('roomSettings').style.zIndex = 25; getById('roomSettings').style.zIndex = 25;
var modalTemplate = `<div id="modalBackdrop" style="z-index:24"></div>`; var modalTemplate = `<div id="modalBackdrop" style="z-index:24"></div>`;
@ -12629,8 +12642,28 @@ async function grabVideo(quality = 0, eleName = 'previewWebcam', selector = "sel
} }
if ((eleName == "previewWebcam") && document.getElementById("previewWebcam")){ if ((eleName == "previewWebcam") && document.getElementById("previewWebcam")){
session.videoElement.controls = true; session.videoElement.controls = true;
try {
var track0 = session.streamSrc.getVideoTracks();
if (track0.length) {
track0 = track0[0];
if (track0.getCapabilities) {
session.cameraConstraints = track0.getCapabilities();
} else {
session.cameraConstraints = {};
}
log(session.cameraConstraints);
if (track0.getSettings) {
session.currentCameraConstraints = track0.getSettings();
} else {
session.currentCameraConstraints = {};
}
log(session.currentCameraConstraints);
}
} catch (e) {
errorlog(e);
}
} else { } else {
updateConstraintSliders(); updateConstraintSliders();
} }
if (callback3){ if (callback3){
try { try {
@ -15618,6 +15651,7 @@ function updateDirectorsAudio(dataN, UUID) {
} }
if ((i === "height") || (i === "width")){ if ((i === "height") || (i === "width")){
input.title = "Hold CTRL (or cmd) to lock width and height together when changing them"; input.title = "Hold CTRL (or cmd) to lock width and height together when changing them";
input.min = 16;
} }
if ("step" in data.audioConstraints[i]) { if ("step" in data.audioConstraints[i]) {
@ -15836,6 +15870,7 @@ function updateDirectorsVideo(data, UUID) {
if ((i === "height") || (i === "width")){ if ((i === "height") || (i === "width")){
input.title = "Hold CTRL (or cmd) to lock width and height together when changing them"; input.title = "Hold CTRL (or cmd) to lock width and height together when changing them";
input.min = 16;
} }
@ -16239,6 +16274,7 @@ function listAudioSettings() {
if ((i === "height") || (i === "width")){ if ((i === "height") || (i === "width")){
input.title = "Hold CTRL (or cmd) to lock width and height together when changing them"; input.title = "Hold CTRL (or cmd) to lock width and height together when changing them";
input.min = 16;
} }
if ("step" in session.audioConstraints[i]) { if ("step" in session.audioConstraints[i]) {
@ -16637,6 +16673,8 @@ function listCameraSettings() {
try { try {
if (track0.getSettings) { if (track0.getSettings) {
session.currentCameraConstraints = track0.getSettings(); session.currentCameraConstraints = track0.getSettings();
} else {
session.currentCameraConstraints = {};
} }
} catch (e) { } catch (e) {
errorlog(e); errorlog(e);
@ -16684,6 +16722,7 @@ function listCameraSettings() {
} }
if ((i === "height") || (i === "width")){ if ((i === "height") || (i === "width")){
input.title = "Hold CTRL (or cmd) to lock width and height together when changing them"; input.title = "Hold CTRL (or cmd) to lock width and height together when changing them";
input.min = 16;
} }
if ("step" in session.cameraConstraints[i]) { if ("step" in session.cameraConstraints[i]) {
input.step = session.cameraConstraints[i].step; input.step = session.cameraConstraints[i].step;
@ -17481,6 +17520,16 @@ function createIframePopup() {
extras += "&privacy"; extras += "&privacy";
} }
if (session.meshcast){
extras += "&meshcast";
}
if (session.meshcastBitrate){
extras += "&mcb="+session.meshcastBitrate;
}
if (session.meshcastCodec){
extras += "&mccodec="+session.meshcastCodec;
}
if (session.screensharequality!==false){ if (session.screensharequality!==false){
extras += "&q="+session.screensharequality; extras += "&q="+session.screensharequality;
} else if (session.quality){ } else if (session.quality){
@ -17492,7 +17541,6 @@ function createIframePopup() {
if (session.label){ if (session.label){
extras += "&label="+encodeURIComponent(session.label); extras += "&label="+encodeURIComponent(session.label);
} }
if (session.screensharefps!==false){ if (session.screensharefps!==false){
extras += "&maxframerate="+parseInt(session.screensharefps*100)/100.0; extras += "&maxframerate="+parseInt(session.screensharefps*100)/100.0;
} }
@ -17509,6 +17557,11 @@ function createIframePopup() {
extras += "&stereo="+session.screenshareStereo; extras += "&stereo="+session.screenshareStereo;
} }
/* if (session.noScaling){ // session.screenShareState=true already bypasses the optimization logic
extras += "&noScaling");
}
*/
if (session.muted){ if (session.muted){
iframe.src = "./?audiodevice=1&screenshare&transparent&cleanish&noheader&autostart&view&muted&room=" + session.roomid + "&push=" + iFrameID + extras; iframe.src = "./?audiodevice=1&screenshare&transparent&cleanish&noheader&autostart&view&muted&room=" + session.roomid + "&push=" + iFrameID + extras;
} else { } else {
@ -19819,10 +19872,23 @@ function addAudioPipeline(UUID, track){ // INBOUND AUDIO EFFECTS
} }
function changeGroup(ele){ function changeGroup(ele, state=null){
var group = ele.dataset.value;
group = ele.dataset.value;
var index = session.rpcs[ele.dataset.UUID].group.indexOf(group); var index = session.rpcs[ele.dataset.UUID].group.indexOf(group);
if (ele.classList.contains("pressed")){
if (state===true){
ele.classList.add("pressed");
if (index === -1){
session.rpcs[ele.dataset.UUID].group.push(group);
}
} else if (state === false){
ele.classList.remove("pressed");
if (index > -1){
session.rpcs[ele.dataset.UUID].group.splice(index, 1);
}
} else if (ele.classList.contains("pressed")){
ele.classList.remove("pressed"); ele.classList.remove("pressed");
if (index > -1){ if (index > -1){
session.rpcs[ele.dataset.UUID].group.splice(index, 1); session.rpcs[ele.dataset.UUID].group.splice(index, 1);
@ -20056,6 +20122,16 @@ function applyStyleEffect(UUID){
session.rpcs[UUID].canvasCtx.textAlign = "center"; session.rpcs[UUID].canvasCtx.textAlign = "center";
session.rpcs[UUID].canvasCtx.font = parseInt(session.rpcs[UUID].canvas.height/2.11)+"px Arial"; session.rpcs[UUID].canvasCtx.font = parseInt(session.rpcs[UUID].canvas.height/2.11)+"px Arial";
session.rpcs[UUID].canvasCtx.fillText(session.rpcs[UUID].label[0].toUpperCase(), parseInt(session.rpcs[UUID].canvas.width/2), parseInt(session.rpcs[UUID].canvas.height*2/3)); session.rpcs[UUID].canvasCtx.fillText(session.rpcs[UUID].label[0].toUpperCase(), parseInt(session.rpcs[UUID].canvas.width/2), parseInt(session.rpcs[UUID].canvas.height*2/3));
} else {
var tmp = getComputedStyle(document.querySelector(':root')).getPropertyValue('--video-background-image').split('"');
if (tmp.length===3){
var img = new Image();
img.onload = function() {
session.rpcs[UUID].canvasCtx.fillStyle = "rgb(25,0,0)";
session.rpcs[UUID].canvasCtx.drawImage(img, parseInt(session.rpcs[UUID].canvas.width/2-110), parseInt(session.rpcs[UUID].canvas.height/2-110),220,220);
}
img.src = tmp[1];
}
} }
} }
@ -20438,6 +20514,20 @@ function getGuestTargetScene(scene, id){
} }
return element; return element;
} }
function getGuestTargetGroup(group, id){
var element = document.querySelectorAll('[data-action-type="toggle-group"][data-value="'+group+'"][data-sid="'+id+'"]'); // data-sid="P5MQpia"
if (!element.length){
element = document.querySelectorAll('[data-action-type="toggle-group"][data-value="'+group+'"][data--u-u-i-d]');
if (element[id]){
element = element[id];
} else {
return false
}
} else {
element = element[0];
}
return element;
}
function targetGuest(guestslot, action, value=null){ function targetGuest(guestslot, action, value=null){
@ -20448,8 +20538,6 @@ function targetGuest(guestslot, action, value=null){
} else { } else {
guestslot=1; guestslot=1;
} }
warnlog("guestslot "+guestslot); warnlog("guestslot "+guestslot);
warnlog("action "+action); warnlog("action "+action);
warnlog("value "+value); warnlog("value "+value);
@ -20496,6 +20584,14 @@ function targetGuest(guestslot, action, value=null){
if (element) { if (element) {
remoteDisplayMute(element); remoteDisplayMute(element);
} }
} else if ((action == 8) || (action == "group")) {
if (value == "null" || value == null){
value = 1;
}
var element = getGuestTargetGroup(value, guestslot);
if (element) {
changeGroup(element, null, value);
}
} else if ((action == 12) || (action == "addScene2")) { } else if ((action == 12) || (action == "addScene2")) {
var element = getGuestTargetScene(2, guestslot); var element = getGuestTargetScene(2, guestslot);
if (element) { if (element) {

View File

@ -17,6 +17,8 @@
--myvideo-max-width: min(800px,100vw); --myvideo-max-width: min(800px,100vw);
--myvideo-width:unset; --myvideo-width:unset;
--myvideo-height:auto; --myvideo-height:auto;
--myvideo-background: #FFF1;
--video-background-image: url("data:image/svg+xml,%3Csvg viewBox='-42 0 512 512.002' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m210.351562 246.632812c33.882813 0 63.222657-12.152343 87.195313-36.128906 23.972656-23.972656 36.125-53.304687 36.125-87.191406 0-33.875-12.152344-63.210938-36.128906-87.191406-23.976563-23.96875-53.3125-36.121094-87.191407-36.121094-33.886718 0-63.21875 12.152344-87.191406 36.125s-36.128906 53.308594-36.128906 87.1875c0 33.886719 12.15625 63.222656 36.132812 87.195312 23.976563 23.96875 53.3125 36.125 87.1875 36.125zm0 0'/%3E%3Cpath d='m426.128906 393.703125c-.691406-9.976563-2.089844-20.859375-4.148437-32.351563-2.078125-11.578124-4.753907-22.523437-7.957031-32.527343-3.308594-10.339844-7.808594-20.550781-13.371094-30.335938-5.773438-10.15625-12.554688-19-20.164063-26.277343-7.957031-7.613282-17.699219-13.734376-28.964843-18.199219-11.226563-4.441407-23.667969-6.691407-36.976563-6.691407-5.226563 0-10.28125 2.144532-20.042969 8.5-6.007812 3.917969-13.035156 8.449219-20.878906 13.460938-6.707031 4.273438-15.792969 8.277344-27.015625 11.902344-10.949219 3.542968-22.066406 5.339844-33.039063 5.339844-10.972656 0-22.085937-1.796876-33.046874-5.339844-11.210938-3.621094-20.296876-7.625-26.996094-11.898438-7.769532-4.964844-14.800782-9.496094-20.898438-13.46875-9.75-6.355468-14.808594-8.5-20.035156-8.5-13.3125 0-25.75 2.253906-36.972656 6.699219-11.257813 4.457031-21.003906 10.578125-28.96875 18.199219-7.605469 7.28125-14.390625 16.121094-20.15625 26.273437-5.558594 9.785157-10.058594 19.992188-13.371094 30.339844-3.199219 10.003906-5.875 20.945313-7.953125 32.523437-2.058594 11.476563-3.457031 22.363282-4.148437 32.363282-.679688 9.796875-1.023438 19.964844-1.023438 30.234375 0 26.726562 8.496094 48.363281 25.25 64.320312 16.546875 15.746094 38.441406 23.734375 65.066406 23.734375h246.53125c26.625 0 48.511719-7.984375 65.0625-23.734375 16.757813-15.945312 25.253906-37.585937 25.253906-64.324219-.003906-10.316406-.351562-20.492187-1.035156-30.242187zm0 0'/%3E%3C/svg%3E");
} }
* { * {
@ -460,7 +462,6 @@ hr {
.tile { .tile {
object-fit: var(--fit-style); object-fit: var(--fit-style);
background-color: black;
width: 100%; width: 100%;
height: 100%; height: 100%;
border: 0; border: 0;
@ -1737,7 +1738,7 @@ img {
margin: auto auto !important; margin: auto auto !important;
position: relative !important; position: relative !important;
top: 50% !important; top: 50% !important;
background-color: #FFF1 !important; background-color: var(--myvideo-background);
object-fit: var(--fit-style); object-fit: var(--fit-style);
max-width: var(--myvideo-max-width) !important; max-width: var(--myvideo-max-width) !important;
} }
@ -1995,7 +1996,7 @@ video {
-moz-transition: opacity .25s ease-in-out; -moz-transition: opacity .25s ease-in-out;
-webkit-transition: opacity .25s ease-in-out; -webkit-transition: opacity .25s ease-in-out;
pointer-events: auto; pointer-events: auto;
background-color: transparent !important; background-color: transparent;
border: 0; border: 0;
margin: 0; margin: 0;
user-select:none; user-select:none;
@ -2007,7 +2008,7 @@ video {
background-size: auto 50px; background-size: auto 50px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
background-image: url("data:image/svg+xml,%3Csvg viewBox='-42 0 512 512.002' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m210.351562 246.632812c33.882813 0 63.222657-12.152343 87.195313-36.128906 23.972656-23.972656 36.125-53.304687 36.125-87.191406 0-33.875-12.152344-63.210938-36.128906-87.191406-23.976563-23.96875-53.3125-36.121094-87.191407-36.121094-33.886718 0-63.21875 12.152344-87.191406 36.125s-36.128906 53.308594-36.128906 87.1875c0 33.886719 12.15625 63.222656 36.132812 87.195312 23.976563 23.96875 53.3125 36.125 87.1875 36.125zm0 0'/%3E%3Cpath d='m426.128906 393.703125c-.691406-9.976563-2.089844-20.859375-4.148437-32.351563-2.078125-11.578124-4.753907-22.523437-7.957031-32.527343-3.308594-10.339844-7.808594-20.550781-13.371094-30.335938-5.773438-10.15625-12.554688-19-20.164063-26.277343-7.957031-7.613282-17.699219-13.734376-28.964843-18.199219-11.226563-4.441407-23.667969-6.691407-36.976563-6.691407-5.226563 0-10.28125 2.144532-20.042969 8.5-6.007812 3.917969-13.035156 8.449219-20.878906 13.460938-6.707031 4.273438-15.792969 8.277344-27.015625 11.902344-10.949219 3.542968-22.066406 5.339844-33.039063 5.339844-10.972656 0-22.085937-1.796876-33.046874-5.339844-11.210938-3.621094-20.296876-7.625-26.996094-11.898438-7.769532-4.964844-14.800782-9.496094-20.898438-13.46875-9.75-6.355468-14.808594-8.5-20.035156-8.5-13.3125 0-25.75 2.253906-36.972656 6.699219-11.257813 4.457031-21.003906 10.578125-28.96875 18.199219-7.605469 7.28125-14.390625 16.121094-20.15625 26.273437-5.558594 9.785157-10.058594 19.992188-13.371094 30.339844-3.199219 10.003906-5.875 20.945313-7.953125 32.523437-2.058594 11.476563-3.457031 22.363282-4.148437 32.363282-.679688 9.796875-1.023438 19.964844-1.023438 30.234375 0 26.726562 8.496094 48.363281 25.25 64.320312 16.546875 15.746094 38.441406 23.734375 65.066406 23.734375h246.53125c26.625 0 48.511719-7.984375 65.0625-23.734375 16.757813-15.945312 25.253906-37.585937 25.253906-64.324219-.003906-10.316406-.351562-20.492187-1.035156-30.242187zm0 0'/%3E%3C/svg%3E"); background-image: var(--video-background-image);
} }
.nogb { background-image: unset !important } .nogb { background-image: unset !important }

69
main.js
View File

@ -90,6 +90,14 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
//// translation stuff ends //// //// translation stuff ends ////
if (urlParams.has('cleanoutput') || urlParams.has('clean') || urlParams.has('cleanish')) {
session.cleanOutput = true;
}
if (urlParams.has('cleanviewer') || urlParams.has('cv')) {
session.cleanViewer = true;
}
if (!isIFrame){ if (!isIFrame){
if (getStorage("redirect") == "yes") { if (getStorage("redirect") == "yes") {
@ -107,6 +115,10 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
setStorage("redirect", "yes", 1); setStorage("redirect", "yes", 1);
window.location.replace(cookieSettings); window.location.replace(cookieSettings);
} }
} else {
var cookieSettings = decodeURI(getStorage("settings"));
setStorage("redirect", "yes", 1);
window.location.replace(cookieSettings);
} }
} }
@ -138,13 +150,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
} catch(e){} } catch(e){}
} }
if (urlParams.has('cleanoutput') || urlParams.has('clean') || urlParams.has('cleanish')) {
session.cleanOutput = true;
}
if (urlParams.has('cleanviewer') || urlParams.has('cv')) {
session.cleanViewer = true;
}
if (urlParams.has('retrytimeout')) { if (urlParams.has('retrytimeout')) {
session.retryTimeout = parseInt(urlParams.get('retrytimeout')); session.retryTimeout = parseInt(urlParams.get('retrytimeout'));
@ -179,6 +185,10 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
getById("mutespeakerbutton").style.setProperty("display", "none", "important"); getById("mutespeakerbutton").style.setProperty("display", "none", "important");
} }
if (urlParams.has('noscale') || urlParams.has('noscaling')) {
session.noScaling = true;
}
if (urlParams.has('pusheffectsdata') ) { if (urlParams.has('pusheffectsdata') ) {
session.pushEffectsData=true; session.pushEffectsData=true;
} }
@ -682,6 +692,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
session.disableWebAudio = true; session.disableWebAudio = true;
session.audioEffects = false; session.audioEffects = false;
session.audioMeterGuest = false; session.audioMeterGuest = false;
session.style = 1;
} }
if (urlParams.has('autoadd')) { // the streams we want to view; if set, but let blank, we will request no streams to watch. if (urlParams.has('autoadd')) { // the streams we want to view; if set, but let blank, we will request no streams to watch.
@ -833,12 +844,13 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('showlabels') || urlParams.has('showlabel') || urlParams.has('sl')) { if (urlParams.has('showlabels') || urlParams.has('showlabel') || urlParams.has('sl')) {
session.showlabels = urlParams.get('showlabels') || urlParams.get('showlabel') || urlParams.get('sl') || ""; session.showlabels = urlParams.get('showlabels') || urlParams.get('showlabel') || urlParams.get('sl') || "";
session.showlabels = sanitizeLabel(session.showlabels.replace(/[\W]+/g, "_").replace(/_+/g, '_')); session.showlabels = sanitizeLabel(session.showlabels.replace(/[\W]+/g, "_").replace(/_+/g, '_'));
//session.style = 6;
session.showlabels = true;
if (session.showlabels == "") { if (session.showlabels == "") {
session.showlabels = true;
session.labelstyle = false; session.labelstyle = false;
} else { } else {
session.labelstyle = session.showlabels; session.labelstyle = session.showlabels;
session.showlabels = true;
} }
} }
@ -1446,6 +1458,13 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
} }
if (urlParams.has('retry')) {
session.forceRetry = parseInt(urlParams.get('retry')) || 30;
}
if (session.forceRetry){
setTimeout(function(){session.retryWatchInterval();},30000);
}
var darkmode=false; var darkmode=false;
try { try {
if (urlParams.has("darkmode") || urlParams.has("nightmode")){ if (urlParams.has("darkmode") || urlParams.has("nightmode")){
@ -1589,6 +1608,9 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('autojoin') || urlParams.has('autostart') || urlParams.has('aj') || urlParams.has('as')) { if (urlParams.has('autojoin') || urlParams.has('autostart') || urlParams.has('aj') || urlParams.has('as')) {
session.autostart = true; session.autostart = true;
}
if (session.autostart){
if (session.screenshare!==false) { if (session.screenshare!==false) {
delayedStartupFuncs.push([publishScreen]); delayedStartupFuncs.push([publishScreen]);
} }
@ -1887,6 +1909,11 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
session.meshcastBitrate = parseInt(session.meshcastBitrate); session.meshcastBitrate = parseInt(session.meshcastBitrate);
} }
if (urlParams.has('mcab') || urlParams.has('mcaudiobitrate') || urlParams.has('meshcastab')){
session.meshcastAudioBitrate = urlParams.get('mcab') || urlParams.get('mcaudiobitrate') || urlParams.get('meshcastab') || 32;
session.meshcastAudioBitrate = parseInt(session.meshcastAudioBitrate);
}
if (urlParams.has('mccodec') || urlParams.has('meshcastcodec')){ if (urlParams.has('mccodec') || urlParams.has('meshcastcodec')){
session.meshcastCodec = urlParams.get('mccodec') || urlParams.get('meshcastcodec') || false; session.meshcastCodec = urlParams.get('mccodec') || urlParams.get('meshcastcodec') || false;
} }
@ -1956,6 +1983,17 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('stats')) { if (urlParams.has('stats')) {
session.statsMenu = true; session.statsMenu = true;
} }
if (urlParams.has('datamode')) {
session.cleanOutput=true;
session.videoDevice = 0;
session.audioDevice = 0;
session.autostart = true;
session.novideo = [];
session.noaudio = [];
session.noiframe = [];
session.webcamonly = true;
}
if (urlParams.has('cleandirector') || urlParams.has('cdv')) { if (urlParams.has('cleandirector') || urlParams.has('cdv')) {
session.cleanDirector = true; session.cleanDirector = true;
@ -1972,6 +2010,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
getById("reportbutton").style.opacity = 0; getById("reportbutton").style.opacity = 0;
getById("calendarButton").style.display = "none"; getById("calendarButton").style.display = "none";
getById("calendarButton").style.opacity = 0; getById("calendarButton").style.opacity = 0;
document.documentElement.style.setProperty('--myvideo-background', '#0000');
var styleTmp = document.createElement('style'); var styleTmp = document.createElement('style');
styleTmp.innerHTML = ` styleTmp.innerHTML = `
video { video {
@ -2202,7 +2241,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('activespeaker') || urlParams.has('speakerview') || urlParams.has('sas')){ if (urlParams.has('activespeaker') || urlParams.has('speakerview') || urlParams.has('sas')){
session.activeSpeaker = urlParams.get('activespeaker') || urlParams.get('speakerview') || urlParams.get('sas') || 1; session.activeSpeaker = urlParams.get('activespeaker') || urlParams.get('speakerview') || urlParams.get('sas') || 1;
session.activeSpeaker = parseInt(session.activeSpeaker); session.activeSpeaker = parseInt(session.activeSpeaker);
session.style=6;
session.audioEffects = true; session.audioEffects = true;
session.audioMeterGuest = true; session.audioMeterGuest = true;
session.minipreview = 2; session.minipreview = 2;
@ -2258,7 +2297,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('meter') || urlParams.has('meterstyle')){ // same as also adding &style=3 if (urlParams.has('meter') || urlParams.has('meterstyle')){ // same as also adding &style=3
session.meterStyle = urlParams.get('meter') || urlParams.get('meterstyle') || 1; session.meterStyle = urlParams.get('meter') || urlParams.get('meterstyle') || 1;
session.meterStyle = parseInt(session.meterStyle); session.meterStyle = parseInt(session.meterStyle);
session.style = 3; session.style=3;
session.audioEffects = true; session.audioEffects = true;
} }
@ -2655,7 +2694,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
session.screenshareid = urlParams.get('screenshareid') || urlParams.get('ssid'); session.screenshareid = urlParams.get('screenshareid') || urlParams.get('ssid');
session.screenshareid = sanitizeStreamID(session.screenshareid); session.screenshareid = sanitizeStreamID(session.screenshareid);
} else { } else {
session.screenshareid = session.streamID + "_screenshare"; session.screenshareid = session.streamID + "_ss";
} }
} }
@ -2796,8 +2835,11 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (!session.directorPassword) { if (!session.directorPassword) {
window.focus(); window.focus();
session.directorPassword = await promptAlt(miscTranslations["enter-director-password"], true); session.directorPassword = await promptAlt(miscTranslations["enter-director-password"], true);
} else {
session.directorPassword = decodeURIComponent(session.directorPassword);
} }
if (session.directorPassword){ if (session.directorPassword){
session.directorPassword = sanitizePassword(session.directorPassword)
await generateHash(session.directorPassword + session.salt + "abc123", 12).then(function(hash) { // million to one error. await generateHash(session.directorPassword + session.salt + "abc123", 12).then(function(hash) { // million to one error.
log("dir room hash is " + hash); log("dir room hash is " + hash);
session.directorHash = hash; session.directorHash = hash;
@ -2820,6 +2862,9 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
//if (!session.activeSpeaker){ //if (!session.activeSpeaker){
session.audioMeterGuest = false; session.audioMeterGuest = false;
//} //}
if (session.style===false){
session.style = 1;
}
if (session.audioEffects === null) { if (session.audioEffects === null) {
session.audioEffects = false; session.audioEffects = false;
} }
@ -3553,7 +3598,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
try{ try{
var input = WebMidi.inputs[parseInt(session.midiOut)-1]; var input = WebMidi.inputs[parseInt(session.midiOut)-1];
input.addListener("midimessage", function(e) { input.addListener("midimessage", function(e) {
console.log(e); log(e);
var msg = {}; var msg = {};
msg.midi = {}; msg.midi = {};
msg.midi.d = e.data; msg.midi.d = e.data;

File diff suppressed because one or more lines are too long