Version 17.2

More bug fixes; &optimize command logic made more visible

I may do a v17.3 within the next week and a few more iterations after that, before working on v18
This commit is contained in:
Steve Seguin 2021-04-25 21:27:19 -04:00 committed by GitHub
parent bb1061f22f
commit a843d3d04d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 236 additions and 90 deletions

View File

@ -55,7 +55,7 @@
}
</style>
<link rel="stylesheet" href="./lineawesome/css/line-awesome.min.css" />
<link rel="stylesheet" href="./main.css?ver=56" />
<link rel="stylesheet" href="./main.css?ver=57" />
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/adapter.min.js"></script>
</head>
<body id="main" class="hidden">
@ -67,7 +67,7 @@
<link itemprop="url" href="./media/obsNinja_logo_full.png" />
</span>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=31"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=184"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=185"></script>
<input id="zoomSlider" type="range" style="display: none;" />
<div id="header">
@ -1085,27 +1085,25 @@
</button>
<span id="sceneGroup1" class="hidden" data-cluster="1" >
<button style="width: 35.2px" data-scene="3" data-action-type="add-scene-3" title="Add to Scene 3" onclick="directEnable(this, event, 3);">
<button style="width: 35.2px" data-action-type="addToScene" data-scene="3" data-action-type="add-scene-3" title="Add to Scene 3" onclick="directEnable(this, event, 3);">
<span >S3</span>
</button>
<button style="width:35.2px;" data-scene="4" data-action-type="add-scene-4" title="Add to Scene 4" onclick="directEnable(this, event, 4);">
<button style="width:35.2px;" data-action-type="addToScene" data-scene="4" data-action-type="add-scene-4" title="Add to Scene 4" onclick="directEnable(this, event, 4);">
<span >S4</span>
</button>
<button style="width: 35.2px" data-scene="5" data-action-type="add-scene-5" title="Add to Scene 5" onclick="directEnable(this, event, 5);">
<button style="width: 35.2px" data-action-type="addToScene" data-scene="5" data-action-type="add-scene-5" title="Add to Scene 5" onclick="directEnable(this, event, 5);">
<span >S5</span>
</button>
</span>
<span id="sceneGroup2" class="hidden" data-cluster="1">
<button style="width: 35.2px" data-scene="6" data-action-type="add-scene-6" title="Add to Scene 6" onclick="directEnable(this, event, 6);">
<button style="width: 35.2px" data-action-type="addToScene" data-scene="6" data-action-type="add-scene-6" title="Add to Scene 6" onclick="directEnable(this, event, 6);">
<span >S6</span>
</button>
<button style="width: 35.2px" data-scene="7" data-action-type="add-scene-7" title="Add to Scene 7" onclick="directEnable(this, event, 7);">
<button style="width: 35.2px" data-action-type="addToScene" data-scene="7" data-action-type="add-scene-7" title="Add to Scene 7" onclick="directEnable(this, event, 7);">
<span >S7</span>
</button>
<button style="width: 35.2px" data-scene="8" data-action-type="add-scene-8" title="Add to Scene 8" onclick="directEnable(this, event, 8);">
<button style="width: 35.2px" data-action-type="addToScene" data-scene="8" data-action-type="add-scene-8" title="Add to Scene 8" onclick="directEnable(this, event, 8);">
<span >S8</span>
</button>
</span>
@ -1235,31 +1233,31 @@
<i class="las la-plus-square"></i>
<span data-translate="add-to-scene">add to scene 1</span>
</button>
<button data-action-type="mute-scene" title="Remotely Mute this Audio in all remote '&scene' views" onclick="directMute(this, event);">
<button data-action-type="mute-scene" title="Remotely Mute this Audio in all remote '&scene' views" onclick="directMute(this, event);">
<i class="las la-microphone-slash"></i>
<span data-translate="mute-scene" >mute in scene</span>
</button>
<span id="sceneGroup1">
<button style="width: 35.2px" data-scene="2" data-action-type="add-scene-2" title="Add to Scene 2" onclick="directEnable(this, event, 2);">
<button style="width: 35.2px" data-scene="2" data-action-type="addToScene" data-action-type="add-scene-2" title="Add to Scene 2" onclick="directEnable(this, event, 2);">
<span >S2</span>
</button>
<button style="width:35.2px;" data-scene="3" data-action-type="add-scene-3" title="Add to Scene 3" onclick="directEnable(this, event, 3);">
<button style="width:35.2px;" data-scene="3" data-action-type="addToScene" data-action-type="add-scene-3" title="Add to Scene 3" onclick="directEnable(this, event, 3);">
<span >S3</span>
</button>
<button style="width: 35.2px" data-scene="4" data-action-type="add-scene-4" title="Add to Scene 4" onclick="directEnable(this, event, 4);">
<button style="width: 35.2px" data-scene="4" data-action-type="addToScene" data-action-type="add-scene-4" title="Add to Scene 4" onclick="directEnable(this, event, 4);">
<span >S4</span>
</button>
</span>
<span id="sceneGroup2">
<button style="width: 35.2px" data-scene="5" data-action-type="add-scene-5" title="Add to Scene 5" onclick="directEnable(this, event, 5);">
<button style="width: 35.2px" data-scene="5" data-action-type="addToScene" data-action-type="add-scene-5" title="Add to Scene 5" onclick="directEnable(this, event, 5);">
<span >S5</span>
</button>
<button style="width: 35.2px" data-scene="6" data-action-type="add-scene-6" title="Add to Scene 6" onclick="directEnable(this, event, 6);">
<button style="width: 35.2px" data-scene="6" data-action-type="addToScene" data-action-type="add-scene-6" title="Add to Scene 6" onclick="directEnable(this, event, 6);">
<span >S6</span>
</button>
<button style="width: 35.2px" data-scene="7" data-action-type="add-scene-7" title="Add to Scene 7" onclick="directEnable(this, event, 7);">
<button style="width: 35.2px" data-scene="7" data-action-type="addToScene" data-action-type="add-scene-7" title="Add to Scene 7" onclick="directEnable(this, event, 7);">
<span >S7</span>
</button>
</span>
@ -1489,6 +1487,8 @@
<div id="voiceMeterTemplate" class="video-meter">
</div>
<div id="voiceMeterTemplate2" class="video-meter2">
</div>
<div id="muteStateTemplate" style="display:none;" class="video-mute-state">
<i class="las la-microphone-slash"></i>
</div>
@ -1554,7 +1554,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 = "17.1";
session.version = "17.2";
session.streamID = session.generateStreamID(); // randomly generates a streamID for this session. You can set your own programmatically if needed
session.defaultPassword = "someEncryptionKey123"; // Disabling improves compatibility and is helpful for debugging.
@ -1624,7 +1624,7 @@
<script type="text/javascript" id="main-js" src="./main.js" data-translation="blank"></script>
<script type="text/javascript" crossorigin="anonymous" id="mixer-js" src="./mixer.js?ver=2"></script>
-->
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=192"></script>
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=194"></script>
<script type="text/javascript">
setTimeout(function(){ // lazy load
var script = document.createElement('script');

View File

@ -2395,10 +2395,33 @@ span#guestTips {
pointer-events:none;
border: 1px black solid;
}
.video-meter-director {
width: 10px;
height: 10px;
top: 8px;
right: 10px;
}
.video-meter2 {
padding:0;
width: 4px;
height:0%;
min-width:2px;
bottom: 1px;
right: 5px;
background-color:#0000;
position:absolute;
border-radius: 2vh;
pointer-events:none;
border: 1px black solid;
transition: height 0.1s ease, background-color 0.1s ease;
}
#voiceMeterTemplate{
display:none;
}
#voiceMeterTemplate2{
display:none;
}
#userList{
line-height: 1.3em;

256
main.js
View File

@ -550,8 +550,60 @@ if (window.obsstudio) {
});
});
window.obsstudio.onVisibilityChange = function obsvisibility(visibility){
try {
log("OBS VISIBILITY:"+visibility);
if (session.disableOBS===false){
var bundle = {};
bundle.sceneUpdate = [];
for (var UUID in session.rpcs){
if (session.rpcs[UUID].visibility!==visibility){ // only move forward if there is a change; the event likes to double fire you see.
session.rpcs[UUID].visibility = visibility;
var msg = {};
msg.visibility = visibility;
if (session.rpcs[UUID].videoElement.style.display == "none"){ // Flag will be left alone, but message will say its disabled.
msg.visibility = false;
}
if (session.optimize){
////////////// bandwidth stuff
var bandwidth = parseInt(session.rpcs[UUID].targetBandwidth); // we don't want to change the target bandwidth, as that's still the real goal and are point of reference for reverting this change.
log("bandwidth:"+bandwidth);
if (visibility==false){ // limit bandwidth if not visible
if ((bandwidth > session.optimize) || (bandwidth<0)){ // limit to optimized bitrate
bandwidth = session.optimize;
}
}
if (session.rpcs[UUID].bandwidth !== bandwidth){ // bandwidth already set correctly. don't resend.
msg.bitrate = bandwidth;
if (session.sendRequest(msg, UUID)){
session.rpcs[UUID].bandwidth=bandwidth; // this is letting the system know what the actual bandwidth is, even if it isn't the real target.
} else {
errorlog("Unable to set update OBS Visibility");
}
} else {
session.sendRequest(msg, UUID);
msg.UUID = UUID;
bundle.sceneUpdate.push(msg)
}
///////////////// end bandwidth stuff
} else {
session.sendRequest(msg, UUID);
msg.UUID = UUID;
bundle.sceneUpdate.push(msg)
}
}
}
for (var UUID in session.rpcs){
session.sendRequest(bundle, UUID);
}
}
} catch (e){errorlog(e)};
};
}
window.onload = function winonLoad() { // This just keeps people from killing the live stream accidentally. Also give me a headsup that the stream is ending
window.addEventListener("beforeunload", function(e) {
try {
@ -2373,7 +2425,10 @@ if (urlParams.has('activespeaker') || urlParams.has('speakerview') || urlParams
session.audioEffects = true;
session.audioMeterGuest = true;
setInterval(function(){activeSpeaker(false)},100);
}
if (urlParams.has('meter') || urlParams.has('meterstyle')){
session.meterStyle = urlParams.get('meter') || urlParams.get('meterstyle') || 1;
}
if (urlParams.has('style') || urlParams.has('st')) {
@ -5883,7 +5938,7 @@ function directEnable(ele, event, scene=1, director=false) { // A directing room
if (!((event.ctrlKey) || (event.metaKey))) {
if (ele.dataset.value == 1) {
ele.dataset.value = 0;
ele.className = "";
ele.classList.remove("pressed");
if (ele.children[1]){
ele.children[1].innerHTML = "Add to Scene "+scene;
if (director){
@ -5894,7 +5949,7 @@ function directEnable(ele, event, scene=1, director=false) { // A directing room
}
} else {
ele.dataset.value = 1;
ele.className = "pressed";
ele.classList.add("pressed");
if (ele.children[1]){
ele.children[1].innerHTML = "Remove";
if (director){
@ -5906,14 +5961,25 @@ function directEnable(ele, event, scene=1, director=false) { // A directing room
}
}
var msg = {};
msg.request = "sendroom";
msg.scene = scene;
msg.action = "display";
msg.value = ele.dataset.value;
msg.target = ele.dataset.sid;
//session.anysend(msg);
session.sendMsg(msg); // send to everyone in the room, so they know if they are on air or not.
for (var uuid in session.pcs){
if (session.pcs[uuid].stats.info && ("version" in session.pcs[uuid].stats.info) && (session.pcs[uuid].stats.info.version < 17.2)){
msg.request = "sendroom";
session.sendMsg(msg);
return;
}
}
for (var uuid in session.pcs){
if (session.pcs[uuid].scene!==false){ // send to all scenes (but scene = 0)
session.sendMessage(msg, uuid);
}
}
}
var previousURL = "";
@ -5976,24 +6042,36 @@ function directPageReload(ele, event) {
function directMute(ele, event=false) { // A directing room only is controlled by the Director, with the exception of MUTE.
log("mute");
if (!event || (!((event.ctrlKey) || (event.metaKey)))) {
if (!event || (!((event.ctrlKey) || (event.metaKey)))) {
if (ele.dataset.value == 0) {
ele.dataset.value = 1;
ele.className = "";
ele.classList.remove("pressed");
ele.children[1].innerHTML = "Mute in scene";
} else {
ele.dataset.value = 0;
ele.className = "pressed";
ele.classList.add("pressed");
ele.children[1].innerHTML = "Un-mute";
}
}
var msg = {};
msg.request = "sendroom";
msg.scene = "1";
msg.scene = true;
msg.action = "mute";
msg.value = ele.dataset.value;
msg.target = ele.dataset.sid;
session.sendMsg(msg); // send to everyone in the room, so they know if they are on air or not.
for (var uuid in session.pcs){
if (session.pcs[uuid].stats.info && ("version" in session.pcs[uuid].stats.info) && (session.pcs[uuid].stats.info.version < 17.2)){
msg.request = "sendroom";
session.sendMsg(msg);
return;
}
}
for (var uuid in session.pcs){
if (session.pcs[uuid].scene!==false){ // send to all scenes (but scene = 0)
session.sendMessage(msg, uuid);
}
}
}
function remoteSpeakerMute(ele, event=false){
@ -6001,20 +6079,20 @@ function remoteSpeakerMute(ele, event=false){
if (!event || (!((event.ctrlKey) || (event.metaKey)))) {
if (ele.dataset.value == 1) {
ele.dataset.value = 0;
ele.className = "";
ele.classList.remove("pressed");
ele.children[1].innerHTML = "deafen guest";
} else {
ele.dataset.value = 1;
ele.className = "pressed";
ele.classList.add("pressed");
ele.children[1].innerHTML = "Un-deafen";
}
}
var msg = {};
if (ele.dataset.value == 0) {
msg.speakerMute = ele.dataset.value;
msg.speakerMute = false
} else {
msg.speakerMute = ele.dataset.value;
msg.speakerMute = true;
}
msg.UUID = ele.dataset.UUID;
session.sendRequest(msg, ele.dataset.UUID);
@ -6025,7 +6103,6 @@ function updateRemoteSpeakerMute(UUID) {
if (ele[0]) {
ele[0].classList.add("pressed");
ele[0].dataset.value = 1;
ele[0].className = "pressed";
ele[0].children[1].innerHTML = "Un-deafen";
}
}
@ -6035,7 +6112,6 @@ function updateRemoteDisplayMute(UUID) {
if (ele[0]) {
ele[0].classList.add("pressed");
ele[0].dataset.value = 1;
ele[0].className = "pressed";
ele[0].children[1].innerHTML = "Un-blind";
}
}
@ -6045,11 +6121,11 @@ function remoteDisplayMute(ele, event=false) {
if (!event || (!((event.ctrlKey) || (event.metaKey)))) {
if (ele.dataset.value == 1) {
ele.dataset.value = 0;
ele.className = "";
ele.classList.remove("pressed");
ele.children[1].innerHTML = "blind guest";
} else {
ele.dataset.value = 1;
ele.className = "pressed";
ele.classList.add("pressed");
ele.children[1].innerHTML = "Un-blind";
}
}
@ -6077,11 +6153,11 @@ function remoteMute(ele, event=false) {
if (!event || (!((event.ctrlKey) || (event.metaKey)))) {
if (ele.dataset.value == 1) {
ele.dataset.value = 0;
ele.className = "";
ele.classList.remove("pressed");
ele.children[1].innerHTML = "mute guest";
} else {
ele.dataset.value = 1;
ele.className = "pressed";
ele.classList.add("pressed");
ele.children[1].innerHTML = "Un-mute guest";
}
}
@ -6116,11 +6192,11 @@ function remoteMuteVideo(ele, event=false) {
} else {
if (ele.dataset.value == 1) {
ele.dataset.value = 0;
ele.className = "";
ele.classList.remove("pressed");
ele.children[1].innerHTML = "hide guest";
} else {
ele.dataset.value = 1;
ele.className = "pressed";
ele.classList.add("pressed");
ele.children[1].innerHTML = "Unhide guest";
}
ele.style.backgroundColor = null;
@ -6150,7 +6226,7 @@ function updateDirectorVideoMute(UUID) {
var ele = document.querySelectorAll('[data-action-type="hide-guest"][data--u-u-i-d="' + UUID + '"]');
if (ele[0]) {
ele[0].dataset.value = 1;
ele[0].className = "pressed";
ele[0].classList.add("pressed");
ele[0].children[1].innerHTML = "Unhide guest";
}
}
@ -6158,12 +6234,24 @@ function updateDirectorVideoMute(UUID) {
function directVolume(ele) { // NOT USED ANYMORE
log("volume");
var msg = {};
msg.request = "sendroom";
msg.scene = "1";
msg.scene = true;
msg.action = "volume";
msg.target = ele.dataset.sid; // i want to focus on the STREAM ID, not the UUID...
msg.value = ele.value;
session.sendMsg(msg); // send to everyone in the room, so they know if they are on air or not.
for (var uuid in session.pcs){
if (session.pcs[uuid].stats.info && ("version" in session.pcs[uuid].stats.info) && (session.pcs[uuid].stats.info.version < 17.2)){
msg.request = "sendroom";
session.sendMsg(msg);
return;
}
}
for (var uuid in session.pcs){
if (session.pcs[uuid].scene!==false){ // send to all scenes (but scene = 0)
session.sendMessage(msg, uuid);
}
}
}
function remoteVolumeUI(ele){
@ -7507,7 +7595,7 @@ function getDirectorSettings(scene){
if (parseInt(eles[i].dataset.value)==1){
warnlog(eles[i]);
if (eles[i].dataset.sid){
settings.soloVideo = eles[i].dataset.sid;
settings.soloVideo = eles[i].dataset.sid; // who is solo, if someone is solo
}
}
}
@ -7531,7 +7619,22 @@ function getDirectorSettings(scene){
}
}
}
return settings
settings.mute = {};
var eles = document.querySelectorAll('[data-action-type="mute-scene"]');
for (var i=0;i<eles.length;i++) {
if (parseInt(eles[i].dataset.value)==0){ // if muted
if (eles[i].dataset.sid){
var msg = {};
msg.action = "mute";
msg.scene = true;
msg.value = eles[i].dataset.value;
msg.target = eles[i].dataset.sid;
settings.mute[eles[i].dataset.sid]=msg;
}
}
}
return settings;
}
function requestInfocus(ele) {
@ -7701,19 +7804,17 @@ function createControlBox(UUID, soloLink, streamID) {
</div>";
if (!session.rpcs[UUID].voiceMeter) {
session.rpcs[UUID].voiceMeter = getById("voiceMeterTemplate").cloneNode(true);
if (session.meterStyle==1){
session.rpcs[UUID].voiceMeter = getById("voiceMeterTemplate2").cloneNode(true);
} else {
session.rpcs[UUID].voiceMeter = getById("voiceMeterTemplate").cloneNode(true);
session.rpcs[UUID].voiceMeter.classList.add("video-meter-director");
session.rpcs[UUID].voiceMeter.style.opacity = 0;
}
session.rpcs[UUID].voiceMeter.id = "voiceMeter_" + UUID;
session.rpcs[UUID].voiceMeter.style.opacity = 0; // temporary
//session.rpcs[UUID].voiceMeter.style.display = "block";
session.rpcs[UUID].voiceMeter.dataset.level = 0;
}
session.rpcs[UUID].voiceMeter.style.width = "10px";
session.rpcs[UUID].voiceMeter.style.height = "10px";
session.rpcs[UUID].voiceMeter.style.top = "8px";
session.rpcs[UUID].voiceMeter.style.right = "10px";
session.rpcs[UUID].remoteMuteElement = getById("muteStateTemplate").cloneNode(true);
session.rpcs[UUID].remoteMuteElement.id = "";
session.rpcs[UUID].remoteMuteElement.style.top = "1vh";
@ -14706,7 +14807,7 @@ function toggleQualityDirector(bitrate, UUID, ele = null) { // ele is specific t
for (var i=0;i<eles.length;i++) {
eles[i].className = "";
}
ele.className = "pressed";
ele.classList.add("pressed");
session.requestRateLimit(bitrate, UUID);
}
@ -14761,14 +14862,7 @@ function getChatMessage(msg, label = false, director = false, overlay = false) {
label = "";
}
data.type = "recv";
messageList.push(data);
messageList = messageList.slice(-100);
if (session.beepToNotify) {
playtone();
}
updateMessages();
if (overlay) {
if (!(session.cleanOutput)){
var textOverlay = getById("overlayMsgs");
@ -14787,6 +14881,22 @@ function getChatMessage(msg, label = false, director = false, overlay = false) {
}
}
}
if (isIFrame) {
parent.postMessage({
"gotChat": data
}, "*");
}
if (session.chatbutton===false){return;} // messages can still appear as overlays ^
messageList.push(data);
messageList = messageList.slice(-100);
if (session.beepToNotify) {
playtone();
}
updateMessages();
if (session.chat == false) {
getById("chattoggle").className = "las la-comments my-float toggleSize puslate";
@ -14801,11 +14911,7 @@ function getChatMessage(msg, label = false, director = false, overlay = false) {
}
if (isIFrame) {
parent.postMessage({
"gotChat": data
}, "*");
}
if (session.broadcastChannel !== false) {
session.broadcastChannel.postMessage(data); /* send */
}
@ -14863,6 +14969,7 @@ function updateClosedCaptions(msg, label, UUID) {
}
function updateMessages() {
if (session.chatbutton===false){return;}
document.getElementById("chatBody").innerHTML = "";
for (i in messageList) {
@ -15945,21 +16052,37 @@ function audioMeterGuest(mediaStreamSource, UUID, trackid){
if (session.audioMeterGuest===false){return;} // don't show if we just want the volume levels
if (session.rpcs[UUID].voiceMeter){
if (total>15){
session.rpcs[UUID].voiceMeter.style.opacity = 100; // temporary
} else {
session.rpcs[UUID].voiceMeter.style.opacity = 0; // temporary
}
session.rpcs[UUID].voiceMeter.dataset.level = total;
} else {
session.rpcs[UUID].voiceMeter = getById("voiceMeterTemplate").cloneNode(true);
session.rpcs[UUID].voiceMeter.id = "voiceMeter_"+UUID;
if (total>15){
session.rpcs[UUID].voiceMeter.style.opacity = 100; // temporary
if (session.meterStyle==1){
session.rpcs[UUID].voiceMeter.style.height = Math.min(total,100) + "%";
if (total>75){
total = Math.min(100,(total - 75)*4);
var R = parseInt((255 * total) / 100).toString(16).padStart(2, '0');
var G = parseInt(255 * (100 - total) / 100).toString(16).padStart(2, '0');
session.rpcs[UUID].voiceMeter.style.backgroundColor = "#" + R + G + "00";
} else {
session.rpcs[UUID].voiceMeter.style.backgroundColor = "#00FF00";
}
} else {
session.rpcs[UUID].voiceMeter.style.opacity = 0; // temporary
if (total>15){
session.rpcs[UUID].voiceMeter.style.opacity = 100; // temporary
} else {
session.rpcs[UUID].voiceMeter.style.opacity = 0; // temporary
}
}
//session.rpcs[UUID].voiceMeter.style.display = "block";
} else {
if (session.meterStyle==1){
session.rpcs[UUID].voiceMeter = getById("voiceMeterTemplate2").cloneNode(true);
} else {
session.rpcs[UUID].voiceMeter = getById("voiceMeterTemplate").cloneNode(true);
if (total>15){
session.rpcs[UUID].voiceMeter.style.opacity = 100; // temporary
} else {
session.rpcs[UUID].voiceMeter.style.opacity = 0; // temporary
}
}
session.rpcs[UUID].voiceMeter.id = "voiceMeter_"+UUID;
session.rpcs[UUID].voiceMeter.dataset.level = total;
updateMixer();
}
@ -16317,7 +16440,7 @@ if (session.midiHotkeys) {
} else if (value == 3) {
var elements = document.querySelectorAll('[data-action-type="mute-guest"][data--u-u-i-d]');
if (elements[guestslot]) {
directMute(elements[guestslot], true);
remoteMute(elements[guestslot], true);
}
} else if (value == 4) {
var elements = document.querySelectorAll('[data-action-type="hangup"][data--u-u-i-d]');
@ -16329,7 +16452,6 @@ if (session.midiHotkeys) {
if (elements[guestslot]) {
session.toggleSoloChat(elements[guestslot].dataset.UUID);
}
} else if (value == 6) {
var elements = document.querySelectorAll('[data-action-type="toggle-remote-speaker"][data--u-u-i-d]');
if (elements[guestslot]) {

View File

@ -260,10 +260,11 @@
var iframe = document.createElement("iframe");
if (urlParams.has("remote")) {
var remote = urlParams.get("remote");
if (urlParams.has('remote') || urlParams.has('rem')) {
var remote = urlParams.get('remote') || urlParams.get('rem') || "nosecurity";
remote = remote.trim();
} else {
var remote="";
var remote = "";
}
if (urlParams.has("sid")) {

File diff suppressed because one or more lines are too long