bug fix for capped mobile bandwidth + &optimize=0 failing

This commit is contained in:
steveseguin 2022-12-10 17:31:26 -05:00
parent 87dc9e98a7
commit 60822c80a8
22 changed files with 191 additions and 108 deletions

View File

@ -57,7 +57,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=238" />
<link rel="stylesheet" href="./main.css?ver=239" />
<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 @@
</span>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=45"></script>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/aes.js"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=552"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=554"></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">
@ -386,7 +386,7 @@
</span>
<div id="consentWarning" class="startupWarning hidden">
<i class="las la-exclamation-circle"></i>
<p><span data-translate="privacy-disabled">Privacy warning: The director will be able to remotely change your camera and microphone.</span></p>
<p><span data-translate="privacy-disabled">Privacy warning: The director will be able to remotely change your camera, microphone, and URL.</span></p>
</div>
<div id="guestTips" style="display:none">
<p data-translate="for-the-best-possible-experience-make-sure">For the best possible experience, make sure</p>
@ -575,7 +575,7 @@
</center>
<div id="consentWarning2" class="startupWarning hidden">
<i class="las la-exclamation-circle"></i>
<p><span data-translate="privacy-disabled">Privacy warning: The director will be able to remotely change which camera and microphone is being used while this page is open, if you continue.</span></p>
<p><span data-translate="privacy-disabled">Privacy warning: The director will be able to remotely change your camera, microphone, and URL while this page is open, if you continue.</span></p>
</div>
<div id="audioScreenShare1">
<i class="las la-microphone-alt"></i>
@ -1831,7 +1831,8 @@
<button class='hidden drawActive' onclick="drawOnScreenObject.color(this);" data-color='black' style="background-color:black; margin: 0 0 0 4px; border-radius: 5px; padding: 3px 3px;">✏️</button>
<button class='hidden drawActive' onclick="drawOnScreenObject.color(this);" data-color='white' style="background-color:white; margin: 0 0 0 4px; border-radius: 5px; padding: 3px 3px;">🎨</button>
<br /><br />
<button onclick="cycleStyleOptions();" id='toggleWaveformButton' title="Audio-only sources can be stylized in different ways" style="margin: 0 0 0 4px; border-radius: 5px; padding: 3px 3px;">Cycle between several audio-visualizations styles</button>
<button class="generalButton" onclick="cycleStyleOptions();" id='toggleWaveformButton' title="Audio-only sources can be stylized in different ways">Cycle between several audio-visualizations styles</button>
<button class="generalButton" onclick="clearStorage();" title="Clear site's local storage and settings">Clear site's local browser storage and saved settings</button>
</span>
</div>
@ -2256,7 +2257,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 = "22.9"; // nov 18th
session.version = "22.10"; // nov 18th
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
@ -2328,11 +2329,11 @@
// session.defaultBackgroundImages = ["./media/bg_sample1.webp", "./media/bg_sample2.webp"]; // for &effects=5 (virtual backgrounds)
// session.hidehome = true; // If used, 'hide home' will make the landing page inaccessible, along with hiding a few go-home elements.
</script>
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=587"></script>
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=595"></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=504"></script>
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=510"></script>
</body>
</html>

90
lib.js
View File

@ -57,7 +57,7 @@ var miscTranslations = {
"transfer" : "transfer",
"armed" : "armed",
"transfer-guest-to-room" : "Transfer guests to room:\n\n(Please note: rooms must share the same password)",
"transfer-guest-to-url" :"Transfer guests to new website URL.\n\n(Guests will be prompted to accept)",
"transfer-guest-to-url" :"Transfer guests to new website URL.\n\nGuests will be prompted to accept unless they are using &consent",
"change-url" : "change URL",
"mute-in-scene" : "mute in scene",
"unmute-guest": "un-mute guest",
@ -1780,6 +1780,7 @@ function applySceneState(){ // guest side; tally light, etc.
getById("obsState").classList.remove("recording");
getById("obsState").classList.remove("ondeck");
getById("obsState").innerHTML = "INACTIVE";
getById("obsState").classList.add("hidden"); // I don't think most people care to see inactive.
}
if (visibility){ // BASIC TALLY LIGHT (on deck disabled)
@ -2124,6 +2125,13 @@ function removeStorage(cname){
localStorage.removeItem(cname);
}
function clearStorage(){
localStorage.clear();
if (!session.cleanOutput){
warnUser("The local storage and saved settings have been cleared", 1000);
}
}
function setStorage(cname, cvalue, hours=9999){ // not actually a cookie
var now = new Date();
var item = {
@ -2303,6 +2311,11 @@ function setupIncomingScreenTracking(v, UUID){ // SCREEN element.
}
v.onpause = (event) => { // prevent things from pausing; human or other
if (v.dataset.UUID && session.rpcs[v.dataset.UUID] && (session.rpcs[v.dataset.UUID].manualBandwidth === 0)){
return true;
}
if (!((event.ctrlKey) || (event.metaKey) )){
warnlog("Video paused; force it to play again");
//return;
@ -2638,6 +2651,10 @@ function setupIncomingVideoTracking(v, UUID){ // video element.
}
v.onpause = (event) => { // prevent things from pausing; human or other
if (v.dataset.UUID && session.rpcs[v.dataset.UUID] && (session.rpcs[v.dataset.UUID].manualBandwidth === 0)){
return true;
}
if (!CtrlPressed){
warnlog("Video paused; force it to play again");
@ -3885,9 +3902,11 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a
}
}
var sssid = false;
var sscount = 0;
var mpl = session.slots || mediaPool.length;
var playarea = getById("gridlayout");
var skip = false;
@ -3899,6 +3918,22 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a
mediaPool.sort(compare_vids);
}
if (session.fakeFeeds && session.fakeFeeds.length && (mediaPool.length < session.fakeFeeds.length)){
for (let i=0;i<session.fakeFeeds.length;i++){
if (mediaPool.length < session.fakeFeeds.length){
mediaPool.push(session.fakeFeeds[i]);
} else {
try{
session.fakeFeeds[i].remove();
} catch(e){errorlog(e)}
}
}
}
var mpl = session.slots || mediaPool.length;
if (mpl>1){
var BB = 0;
var rw = 1;
@ -4136,6 +4171,7 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a
togglePreview.style.top = "calc("+hi+"px + 2vh)";
togglePreview.style.maxHeight = parseInt(getById("gridlayout").offsetHeight)+"px";
} catch(e){
errorlog(e);
container.style.top = hi+"px";
togglePreview.style.top = hi+"px";
}
@ -4960,6 +4996,7 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a
}
}
} catch(e) {
errorlog(e);
var bigPlayButton = document.getElementById("bigPlayButton");
if (bigPlayButton){
bigPlayButton.parentNode.removeChild(bigPlayButton);
@ -13831,13 +13868,13 @@ function joinRoom(roomname) {
}
}
function createRoom(roomname = false) {
async function createRoom(roomname = false) {
if (roomname == false) {
roomname = getById("videoname1").value;
roomname = sanitizeRoomName(roomname);
clearDirectorSettings();
clearDirectorSettings();
if (roomname.length != 0) {
if (urlParams.has('dir')){
@ -13886,12 +13923,12 @@ function createRoom(roomname = false) {
if ((session.defaultPassword === false) && (session.password)) {
passAdd2 = "&password=" + session.password;
return generateHash(session.password + session.salt, 4).then(function(hash) {
return generateHash(session.password + session.salt, 4).then(async function(hash) {
passAdd = "&hash=" + hash;
createRoomCallback(passAdd, passAdd2);
await createRoomCallback(passAdd, passAdd2);
}).catch(errorlog);
} else {
createRoomCallback(passAdd, passAdd2);
await createRoomCallback(passAdd, passAdd2);
}
pokeIframeAPI("create-room", roomname);
@ -13979,7 +14016,7 @@ async function toggleCoDirector(ele){
getById("codirectorSettings").style.display = "block";
}
function createRoomCallback(passAdd, passAdd2) {
async function createRoomCallback(passAdd, passAdd2) {
if (!session.switchMode){
getById("directorlayout").classList.remove("hidden");
@ -14136,7 +14173,6 @@ function createRoomCallback(passAdd, passAdd2) {
}, 200);};
getById("reshare").parentNode.removeChild(getById("reshare"));
//getById("mutespeakerbutton").style.display = null;
if (session.speakerMuted_default===false){
//session.speakerMuted = false; // the director will start with audio playback muted.
@ -14252,6 +14288,14 @@ function createRoomCallback(passAdd, passAdd2) {
joinRoom(session.roomid);
try {
if (!gotDevices2AlreadyRan){
await enumerateDevices().then(gotDevices2); // this is needed for iOS; was previous set to timeout at 100ms, but would be useful everywhere I think
}
}catch(e){
errorlog(e);
}
if (session.autostart){
setTimeout(function(){press2talk(true);},400);
} else {
@ -16291,6 +16335,7 @@ function gotDevices2(deviceInfos) {
option.selected = "true";
} else if (!session.sink && SelectedAudioOutputDevices && (SelectedAudioOutputDevices == option.value)){
option.selected = "true";
session.sink = option.value; // added 8-dec-22, as the director's saved mic wasn't applying otherwise.
}
option.text = deviceInfo.label || `Speaker ${audioOutputSelect.length + 1}`;
audioOutputSelect.appendChild(option);
@ -20068,6 +20113,7 @@ async function press2talk(clean = false) {
session.videoElement.title = "This is the preview of the Director's audio and video output.";
session.videoElement.onpause = (event) => { // prevent things from pausing; human or other
if (!((event.ctrlKey) || (event.metaKey) )){
log("Video paused; auto playing");
event.currentTarget.play().then(_ => {
@ -26188,12 +26234,17 @@ function updateLink(arg, input, solo=false) {
function changeURL(changeURL){
window.focus();
confirmAlt(miscTranslations["director-redirect-1"]+changeURL+miscTranslations["director-redirect-2"]).then(res=>{
if (res){
hangup();
window.location.href = changeURL;
};
});
if (session.consent){
hangup();
window.location.href = changeURL;
} else {
confirmAlt(miscTranslations["director-redirect-1"]+changeURL+miscTranslations["director-redirect-2"]).then(res=>{
if (res){
hangup();
window.location.href = changeURL;
};
});
}
}
function updateLinkInverse(arg, input) {
@ -26513,6 +26564,11 @@ function unPauseVideo(videoEle, update=true){
else if (!("prePausedBandwidth" in session.rpcs[videoEle.dataset.UUID])){return;} // not paused; useless to have, but might as well
session.rpcs[videoEle.dataset.UUID].manualBandwidth = false;
//session.rpcs[videoEle.dataset.UUID].manualAudioBandwidth = false;
if (session.rpcs[videoEle.dataset.UUID].videoElement){
session.rpcs[videoEle.dataset.UUID].videoElement.play();
}
delete(session.rpcs[videoEle.dataset.UUID].prePausedBandwidth);
session.requestRateLimit(false, videoEle.dataset.UUID, false); // passing a bitrate of false forces the saved existing bitrate to be requested.
videoEle.classList.remove("paused");
@ -26528,6 +26584,10 @@ function pauseVideo(videoEle, update=true){
else if (!(videoEle.dataset.UUID in session.rpcs)){return;}
session.rpcs[videoEle.dataset.UUID].prePausedBandwidth = session.rpcs[videoEle.dataset.UUID].manualBandwidth; // useless, but whatever
session.rpcs[videoEle.dataset.UUID].manualBandwidth = 0;
if (session.rpcs[videoEle.dataset.UUID].videoElement){
session.rpcs[videoEle.dataset.UUID].videoElement.pause();
}
//session.rpcs[videoEle.dataset.UUID].manualAudioBandwidth = 0;
session.requestRateLimit(false, videoEle.dataset.UUID, true); // passing a bitrate of false forces the saved existing bitrate to be requested.
videoEle.classList.add("paused");

View File

@ -1824,6 +1824,11 @@ h2 {
label {
color: #000;
}
.generalButton{
border-radius: 3px;
padding: 5px;
margin: 0 0 10px 0;
}
.inner:before,
.inner:after {

91
main.js
View File

@ -1012,7 +1012,6 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
session.autostart = true;
}
if (urlParams.has('datamode') || urlParams.has('dataonly')) { // this disables all media in/out.
session.dataMode = true;
}
@ -1683,6 +1682,24 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
}
}
if (urlParams.has('fakeguests') || urlParams.has('fakefeeds')) {
var total = parseInt(urlParams.get('fakeguests')) || parseInt(urlParams.get('fakefeeds')) || 4;
session.fakeFeeds = [];
log("Creating "+total+" fake feeds");
for (var i=0;i<total;i++){
let fakeElement = document.createElement("video");
fakeElement.autoplay = true;
fakeElement.loop = true;
fakeElement.muted = true;
fakeElement.src = "./media/fakesteve.webm";
fakeElement.id = parseInt(Math.random() * 10000000000);
session.fakeFeeds.push(fakeElement);
}
if (session.view!==false){
setTimeout(function(){updateMixer();},1000);
}
}
if (urlParams.has('directoronly') || urlParams.has('directorsonly') || urlParams.has('do')){
session.viewDirectorOnly = true;
}
@ -2559,6 +2576,10 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('mixminus')){
session.mixMinus = true;
}
if (urlParams.has('clearstorage') || urlParams.has('clear')){
clearStorage();
}
if (urlParams.has('videobitrate') || urlParams.has('bitrate') || urlParams.has('vb')) {
session.bitrate = urlParams.get('videobitrate') || urlParams.get('bitrate') || urlParams.get('vb');
@ -3809,7 +3830,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
}
}
createRoom(director_room_input);
setTimeout(function(director_room_input){createRoom(director_room_input);},20, director_room_input);
}
if (session.chatbutton === true) {
getById("chatbutton").classList.remove("hidden");
@ -3919,39 +3940,41 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('waittimeout')){
session.waitImageTimeout = parseInt(urlParams.get('waittimeout')) || 0;
}
session.waitImageTimeoutObject = setTimeout(function() {
session.waitImageTimeoutObject = true;
try {
if ((session.view)) {
if (document.getElementById("mainmenu")) {
if (session.waitImage){
getById("mainmenu").innerHTML += '<img id="retryimage"/>';
getById("retryimage").src = decodeURIComponent(session.waitImage);
getById("retryimage").onerror = function(){this.style.display='none';};
if (session.cover) {
getById("retryimage").style.objectFit = "cover";
}
} else if (!(session.cleanOutput)){
getById("mainmenu").innerHTML += '<div class="retry-spinner" id="retrySpinner"></div>';
getById("retrySpinner").onclick = function(){
updateURL("cleanoutput");
location.reload();
if (!session.fakeFeeds){
session.waitImageTimeoutObject = setTimeout(function() {
session.waitImageTimeoutObject = true;
try {
if ((session.view)) {
if (document.getElementById("mainmenu")) {
if (session.waitImage){
getById("mainmenu").innerHTML += '<img id="retryimage"/>';
getById("retryimage").src = decodeURIComponent(session.waitImage);
getById("retryimage").onerror = function(){this.style.display='none';};
if (session.cover) {
getById("retryimage").style.objectFit = "cover";
}
} else if (!(session.cleanOutput)){
getById("mainmenu").innerHTML += '<div class="retry-spinner" id="retrySpinner"></div>';
getById("retrySpinner").onclick = function(){
updateURL("cleanoutput");
location.reload();
}
getById("retrySpinner").title = miscTranslations["waiting-for-the-stream"]
}
if (urlParams.has('waitmessage')){
getById("mainmenu").innerHTML += '<div id="retrymessage"></div>';
getById("retrymessage").innerText = urlParams.get('waitmessage');
getById("retrySpinner").title = urlParams.get('waitmessage');
}
getById("retrySpinner").title = miscTranslations["waiting-for-the-stream"]
}
if (urlParams.has('waitmessage')){
getById("mainmenu").innerHTML += '<div id="retrymessage"></div>';
getById("retrymessage").innerText = urlParams.get('waitmessage');
getById("retrySpinner").title = urlParams.get('waitmessage');
}
}
} catch (e) {
errorlog(e);
}
} catch (e) {
errorlog(e);
}
}, session.waitImageTimeout);
}, session.waitImageTimeout);
}
log("auto playing");
if ((iPad || iOS) && navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1 && SafariVersion > 13) { // Modern iOS doesn't need pop up
@ -4072,9 +4095,9 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('flagship')) {
session.flagship = true;
}
if (!session.flagship && session.mobile && (session.limitTotalBitrate===false)){
session.limitTotalBitrate = session.totalRoomBitrate_default; // 500, with the max per guest stream out at maxMobileBitrate (350kbps) or 35-kbps if more than X in the room.
}
//if (!session.flagship && session.mobile && (session.limitTotalBitrate===false)){
// session.limitTotalBitrate = session.totalRoomBitrate_default; // 500, with the max per guest stream out at maxMobileBitrate (350kbps) or 35-kbps if more than X in the room.
//}
if (urlParams.has('maxmobilebitrate')) {
session.maxMobileBitrate = parseInt(urlParams.has('maxmobilebitrate')) || 0;

View File

@ -222,7 +222,6 @@
"joining-room": "You are in room",
"push-to-talk-enable": " enable director`s microphone or video<br>(only guests can see this feed)",
"hide-the-links": " LINKS (GUEST INVITES &amp; SCENES)",
"click-for-quick-room-overview": "\n<i class=\"las la-question-circle\"></i> <span data-translate=\"click-here-for-help\">Click Here for a quick overview and help</span>\n",
"click-here-for-help": "Click Here for a quick overview and help",
"welcome-to-control-room": "\n<b>Welcome. This is the director's control-room for the group-chat.</b><br><br>\nYou can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.\n<br><br>\nA group room can handle normally around 6 to 20 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room\n",
"invite-users-to-join": "Guests can use the link to join the group room",
@ -266,9 +265,9 @@
"vertical-aspect-ratio": "Vertical video mode",
"learn-more-about-params": "Learn more about URL parameters at ",
"forward-to-room": "Transfer",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Message",
"send-direct-chat": "Message",
"disconnect-guest": "Hangup",
"voice-chat": "<i class=\"las la-microphone\" style=\"color:#090\"></i> Solo Talk",
"voice-chat": " Solo Talk",
"add-to-scene": "add to scene 1",
"mute-guest": "mute guest",
"More-scene-options": "More scene options",
@ -281,24 +280,19 @@
"hide-guest": "hide guest",
"toggle-remote-speaker": "Deafen Guest",
"toggle-remote-display": "Blind Guest",
"order-down": "<i class=\"las la-minus\"></i>",
"order-up": "<i class=\"las la-plus\"></i>",
"change-url": "Change URL",
"change-params": "URL Params",
"record-local": " Record Local",
"record-remote": " Record Remote",
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"advanced-audio-settings": "<i class=\"las la-sliders-h\"></i> Audio Settings",
"advanced-camera-settings": "<i class=\"las la-sliders-h\"></i> Video Settings",
"advanced-audio-settings": "Audio Settings",
"advanced-camera-settings": "Video Settings",
"user-raised-hand": "Lower Raised Hand",
"unmute": "un-mute",
"unhide-guest": "un-hide",
"undeafen": "un-deafen",
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"send-message": "send message",
"record-director-local": " Record",
"video-source": " Video Source ",
"max-resolution": "Max Resolution",
@ -379,7 +373,7 @@
"prefix-screenshare": "Prefix screenshare IDs",
"more-than-four-can-join": "These four guest slots are just for demonstration. More than four guests can actually join a room.",
"welcome-to-vdo-ninja-chat": "\nWelcome! You can send text messages directly to connected peers from here.\n",
"privacy-disabled": "Privacy warning: The director will be able to remotely change which camera and microphone is being used while this page is open, if you continue.",
"privacy-disabled": "Privacy warning: The director will be able to remotely change your camera, microphone, and URL while this page is open, if you continue.",
"face-mesh": "Face mesh (slow load)",
"anonymous-mask": "Anonymous mask",
"dog-face": "Dog ears and nose",
@ -498,7 +492,7 @@
"transfer": "transfer",
"armed": "armed",
"transfer-guest-to-room": "Transfer guests to room:\n\n(Please note rooms must share the same password)",
"transfer-guest-to-url": "Transfer guests to new website URL.\n\n(Guests will be prompted to accept)",
"transfer-guest-to-url": "Transfer guests to new website URL.\n\nGuests will be prompted to accept unless they are using &consent",
"change-url": "change URL",
"mute-in-scene": "mute in scene",
"unmute-guest": "un-mute guest",

View File

@ -282,9 +282,9 @@
"vertical-aspect-ratio": "竖屏视频模式",
"learn-more-about-params": "了解有关 URL 参数的详细信息,请访问 ",
"forward-to-room": "转移",
"send-direct-chat": "<i class=\"las la-envelope\"></i> 信息",
"send-direct-chat": "信息",
"disconnect-guest": "挂断",
"voice-chat": "<i class=\"las la-microphone\" style=\"color:#090\"></i> 单人发言",
"voice-chat": " 单人发言",
"add-to-scene": "添加到场景1",
"mute-guest": "静音客人",
"More-scene-options": "更多场景选项",
@ -314,7 +314,7 @@
"undeafen": "开启声音",
"unblind": "开启视频",
"close": "关闭",
"send-message": "发送信息<s pan=\"\"> </s>",
"send-message": "发送信息",
"record-director-local": " 录制",
"video-source": " 视频源 ",
"max-resolution": "最大分辨率",

View File

@ -279,7 +279,7 @@
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Chatovat",
"send-direct-chat": "Chatovat",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Pokročilé",
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"open-in-new-tab": "Otevřít v nové záložce",
@ -391,7 +391,7 @@
"undeafen": "un-deafen",
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"send-message": "send message",
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",

View File

@ -279,7 +279,7 @@
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Message",
"send-direct-chat": "Message",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Erweitert",
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"open-in-new-tab": "In neuem Tab öffnen.",
@ -391,7 +391,7 @@
"undeafen": "un-deafen",
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"send-message": "send message",
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",

View File

@ -322,9 +322,9 @@
"learn-more-about-params": "Learn more about URL parameters at ",
"more-than-four-can-join": "These four guest slots are just for demonstration. More than four guests can actually join a room.",
"forward-to-room": "Transfer",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Message",
"send-direct-chat": "Message",
"disconnect-guest": "Hangup",
"voice-chat": "<i class=\"las la-microphone\" style=\"color:#090\"></i> Solo Talk",
"voice-chat": " Solo Talk",
"add-to-scene": "add to scene 1",
"mute-guest": "mute guest",
"More-scene-options": "More scene options",

View File

@ -320,9 +320,9 @@
"learn-more-about-params": "Aprende sobre los parámetros URL en ",
"more-than-four-can-join": "Estos espacios para invitados son sólo un ejemplo. Pueden unirse más de cuatro invitados.",
"forward-to-room": "Transferir",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Mensaje",
"send-direct-chat": "Mensaje",
"disconnect-guest": "Colgar",
"voice-chat": "<i class=\"las la-microphone\" style=\"color:#090\"></i> Hablar solo",
"voice-chat": " Hablar solo",
"add-to-scene": "Añadir a escena 1",
"mute-guest": "Silenciar invitado",
"More-scene-options": "Más opciones de escena",
@ -376,7 +376,7 @@
"undeafen": "No ensordecer",
"unblind": "Permitir ver video",
"close": "Cerrar",
"send-message": "enviar mensaje<s pan=\"\"> </s>",
"send-message": "enviar mensaje",
"record-director-local": " Grabar",
"logo-header": "\n<font id=\"qos\">V</font>DO.Ninja \n",
"only-director-can-hear-you": "Solo el direcctor puede escucharte actualmente.",

View File

@ -320,9 +320,9 @@
"learn-more-about-params": "URL parametroez gehiago ikasi hemen ",
"more-than-four-can-join": "Lau gonbidatu hauen lekuak adibidea besterik ez dira. Lau gonbidatu baino gehiago batu daitezke.",
"forward-to-room": "Bidali",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Mezua",
"send-direct-chat": "Mezua",
"disconnect-guest": "Eskegi",
"voice-chat": "<i class=\"las la-microphone\" style=\"color:#090\"></i> Bakarrik hitz egin",
"voice-chat": " Bakarrik hitz egin",
"add-to-scene": "Gehitu 1.eszenara",
"mute-guest": "Mututu gonbidatua",
"More-scene-options": "Eszena aukera gehiago",
@ -375,7 +375,7 @@
"undeafen": "entzun",
"unblind": "ikusarazi",
"close": "itxi",
"send-message": "bidali mezua<s pan=\"\"> </s>",
"send-message": "bidali mezua",
"record-director-local": " Grabazioa",
"director-muted-you": "Zuzendariak isildu zaitu.",
"mirror-video": "Ispilua",

View File

@ -279,7 +279,7 @@
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Message",
"send-direct-chat": "Message",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Advanced",
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"open-in-new-tab": "Ouvrir dans un nouvel onglet",
@ -391,7 +391,7 @@
"undeafen": "un-deafen",
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"send-message": "send message",
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",

View File

@ -279,7 +279,7 @@
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Message",
"send-direct-chat": "Message",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Advanced",
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"open-in-new-tab": "Apri in una nuova Tab",
@ -391,7 +391,7 @@
"undeafen": "un-deafen",
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"send-message": "send message",
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",

View File

@ -279,7 +279,7 @@
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Message",
"send-direct-chat": "Message",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Advanced",
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"open-in-new-tab": "新しいタブで開く",
@ -391,7 +391,7 @@
"undeafen": "un-deafen",
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"send-message": "send message",
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",

View File

@ -279,7 +279,7 @@
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Bericht",
"send-direct-chat": "Bericht",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Geavanceerd",
"voice-chat": "<i class=\"las la-microphone\"></i> Geluids Chat",
"open-in-new-tab": "Open in nieuw tabblad",
@ -391,7 +391,7 @@
"undeafen": "un-deafen",
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"send-message": "send message",
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",

View File

@ -279,7 +279,7 @@
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Erehay ouyay ancay epray-enerategay",
"send-direct-chat": "Erehay ouyay ancay epray-enerategay",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Erehay ouyay ancay epray-enerategay",
"voice-chat": "<i class=\"las la-microphone\"></i> Erehay ouyay ancay epray-enerategay",
"open-in-new-tab": "Openway inway ewnay Abtay",
@ -391,7 +391,7 @@
"undeafen": "un-deafen",
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"send-message": "send message",
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",

View File

@ -171,8 +171,8 @@
"select-screen-to-share": "SELECIONAR A TELA PARA COMPARTILHAR",
"select-the-video-files-to-share": "SELECIONE OS ARQUIVOS DE VÍDEO PARA COMPARTILHAR",
"send-chat": "Enviar",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Mensagem",
"send-message": "enviar mensagem<s pan=\"\"> </s>",
"send-direct-chat": "Mensagem",
"send-message": "enviar mensagem",
"share-local-video-file": "Arquivo de mídia de transmissão",
"share-screen-with-room": "Compartilhamento de tela com sala",
"share-website-iframe": "Compartilhar site",
@ -213,7 +213,7 @@
"video-source": " Fonte de vídeo ",
"virtual-background": "Plano de fundo virtual",
"virtual-backgrounds": "Planos de fundo virtuais",
"voice-chat": "<i class=\"las la-microphone\" style=\"color:#090\"></i> Conversa individual",
"voice-chat": " Conversa individual",
"waiting-for-camera": "Aguardando o carregamento da câmera",
"waiting-for-camera-to-load": "Aguardando a câmera carregar",
"waiting-for-mic-to-load": "Aguardando o microfone carregar",

View File

@ -279,7 +279,7 @@
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Enviar mensagem",
"send-direct-chat": "Enviar mensagem",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Avançadas",
"voice-chat": "<i class=\"las la-microphone\"></i> Chat de voz",
"open-in-new-tab": "Abrir num novo separador",
@ -391,7 +391,7 @@
"undeafen": "devolver som",
"unblind": "devolver imagem",
"close": "fechar",
"send-message": "enviar mensagem<s pan=\"\"> </s>",
"send-message": "enviar mensagem",
"record-director-local": " Gravar",
"only-director-can-hear-you": "Apenas o realizador o pode ouvir de momento.",
"director-muted-you": "O realizador desativou o seu microfone.",

View File

@ -303,9 +303,9 @@
"vertical-aspect-ratio": "Портретный режим",
"learn-more-about-params": "Узнать больше о возможных параметрах на ",
"forward-to-room": "Перевести",
"send-direct-chat": "<i class=\"las la-envelope\"></i> личное сообщение",
"send-direct-chat": "личное сообщение",
"disconnect-guest": "Отключить",
"voice-chat": "<i class=\"las la-microphone\" style=\"color:#090\"></i> разговор тет-а-тет",
"voice-chat": " разговор тет-а-тет",
"add-to-scene": "Добавить в 1 сцену",
"mute-guest": "Выкл микрофоны гостям",
"More-scene-options": "Больше настроек сцены",
@ -335,7 +335,7 @@
"unblind": "Вкл. видео на стороне гостя",
"undeafen": "Вкл. звук на стороне гостя",
"close": "Закрыть",
"send-message": "Сообщение <s pan=\"\"> </s>",
"send-message": "Сообщение ",
"record-director-local": " Запись",
"video-source": "Источник видео ",
"max-resolution": "Лучшее качество",

View File

@ -300,7 +300,7 @@
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Message",
"send-direct-chat": "Message",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Advanced",
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"open-in-new-tab": "Yeni Sekmede Aç",
@ -412,7 +412,7 @@
"undeafen": "un-deafen",
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"send-message": "send message",
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",

View File

@ -302,7 +302,7 @@
"this-is-obs-browser-source-link": "Використовуйте OBS чи інший софт для захоплення групового чату",
"more-than-four-can-join": "Це місця для гостей як приклад, їх може бути більше",
"forward-to-room": "Трансфер",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Повідомлення",
"send-direct-chat": "Повідомлення",
"add-to-scene": "Add to Scene",
"mute-scene": "не давати звук у сцені",
"mute-guest": "відключити мікрофон",
@ -383,7 +383,7 @@
"undeafen": "un-deafen",
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"send-message": "send message",
"record-director-local": " Record",
"select-digital-effect": " Digital Video Effects: ",
"no-effects-applied": "No effects applied",

File diff suppressed because one or more lines are too long