Merge pull request #835 from steveseguin/steves-dev-branch

Version 17.1
This commit is contained in:
Steve Seguin 2021-04-23 03:12:57 -04:00 committed by GitHub
commit ce97e74bea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 8440 additions and 1112 deletions

159
chat.html Normal file
View File

@ -0,0 +1,159 @@
<html>
<head>
<meta charset="utf8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>OBSN Chat Overlay</title>
<style>
@font-face {
font-family: 'Cousine';
src: url('fonts/Cousine-Bold.ttf') format('truetype');
}
body {
margin:0;
padding:0 10px;
height:100%;
border: 0;
display: flex;
flex-direction: column-reverse;
position:absolute;
bottom:0;
overflow:hidden;
max-width:100%;
}
div {
margin:0;
background-color: black;
padding: 8px 8px 0px 8px;
color: white;
font-family: Cousine, monospace;
font-size: 3.2em;
line-height: 1.1em;
letter-spacing: 0.0em;
text-transform: uppercase;
text-shadow: 0.05em 0.05em 0px rgba(0,0,0,1);
max-width:100%;
word-wrap: break-word;
overflow-wrap: break-word;
word-break: break-all;
hyphens: auto;
display:inline-block;
}
a {
color:white;
font-size:1.2em;
text-transform: none;
word-wrap: break-word;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-all;
hyphens: auto;
}
</style>
<script>
(function (w) {
w.URLSearchParams =
w.URLSearchParams ||
function (searchString) {
var self = this;
self.searchString = searchString;
self.get = function (name) {
var results = new RegExp("[\?&]" + name + "=([^&#]*)").exec(
self.searchString
);
if (results == null) {
return null;
} else {
return decodeURI(results[1]) || 0;
}
};
};
})(window);
var urlParams = new URLSearchParams(window.location.search);
function loadIframe() {
var iframe = document.createElement("iframe");
var view= "";
if (urlParams.has("view")) {
view = "&view="+(urlParams.get("view") || "");
}
var room="";
if (urlParams.has("room")) {
room = "&room="+urlParams.get("room");
}
var password="";
if (urlParams.has("password")) {
password = "&password="+urlParams.get("password");
}
iframe.allow = "autoplay";
var srcString = "./?novideo&noaudio&label=chatOverlay&scene"+room+view+password;
iframe.src = srcString;
iframe.style.width="0";
iframe.style.height="0";
iframe.style.border="0";
document.body.appendChild(iframe);
//////////// LISTEN FOR EVENTS
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
/// If you have a routing system setup, you could have just one global listener for all iframes instead.
eventer(messageEvent, function (e) {
if (e.source != iframe.contentWindow){return} // reject messages send from other iframes
console.log(e);
if ("gotChat" in e.data){
logData(e.data.gotChat.label,e.data.gotChat.msg);
}
});
}
function printValues(obj) {
var out = "";
for (var key in obj) {
if (typeof obj[key] === "object") {
out += "<br />";
out += printValues(obj[key]);
} else {
if (key.startsWith("_")) {
} else {
out += "<b>" + key + "</b>: " + obj[key] + "<br />";
}
}
}
return out;
}
function logData(type, data) {
var span = document.createElement('span');
var entry = document.createElement('div');
if (type){
type = "<i>"+type.replace(/_/g, ' ')+"</i>";
}
entry.innerHTML = type + data;
span.appendChild(entry);
document.body.prepend(span);
}
</script>
</head>
<body onload="loadIframe();">
</body>
</html>

View File

@ -79,7 +79,7 @@
setVideoSearchParams(element);
}
if (type === "audiooutput") {
return;
setAudioOutputSearchParams(element);
}
/*
@ -142,6 +142,36 @@
element.className = "device selected";
}
}
/*
Only allows for a single audio output device to be selected
*/
function setAudioOutputSearchParams(info) {
// Device was already selected
if (info.className === "device selected") {
element.className = "device";
// Set the url param to the devices that are left
url.searchParams.set("od", device);
element.className = "device";
// If no devices remained, just remove the param completely
if (audioInputDevices.length === 0) {
url.searchParams.delete("od");
}
} else {
// Device is unselected
try {
element.parentElement.querySelector('.device.selected').className = "device";
} catch (error) {
console.log("There was no video device already selected.");
}
url.searchParams.set("od", device);
element.className = "device selected";
}
}
// Update UI
showDeviceIdsPopup();

View File

@ -359,6 +359,9 @@ function modURL(ele=false){
}
function gohere(){
var url = modURL(true);
if (!(document.getElementById('changeText').value.includes("obs.ninja")) && (document.getElementById('changeText').value.includes("http")) && (document.getElementById('changeText').value.includes("&sink"))){
alert("Notice: The &sink command is domain specific.\nVisit https://YOURDOMAIN.com/electron instead.");
}
window.location = url;
};
getPermssions();

File diff suppressed because it is too large Load Diff

290
main.css
View File

@ -7,6 +7,7 @@
--green-accent: #3f4f50;
--olive-accent: #535D32;
--regular-margin: 10px;
--director-margin: 15px 20px 0 0;
}
* {
@ -649,17 +650,25 @@ button.btnArmTransferRoom.selected{
@keyframes pulse {
0% {
transform: scale(0.95);
transform: scale(1);
box-shadow: 0 0 0 0 rgba(14, 19, 26, 0.7);
}
70% {
transform: scale(1);
15% {
transform: scale(1.2);
box-shadow: 0 0 0 10px rgba(2, 3, 4, 0);
}
100% {
50% {
transform: scale(1.0);
box-shadow: 0 0 0 0 rgba(14, 19, 26, 0);
}
85% {
transform: scale(0.95);
box-shadow: 0 0 0 0 rgba(14, 19, 26, 0);
}
100% {
transform: scale(1);
box-shadow: 0 0 0 0 rgba(14, 19, 26, 0);
}
}
.la-sliders-h {
@ -754,9 +763,9 @@ body {
padding: 10px 50px;
}
.gowebcam:enabled {
background-color: #3C3;
background-color: #3C3 !important;
color: black;
font-weight: bold;
font-weight: bold !important;;
}
.mainmenuclass {
@ -801,7 +810,7 @@ body {
display:none;
background-color:#EFEFEF;
padding:10px 12px 12px 2px;
margin: 10px 0px 0px 10px;
margin: 0px 0px 0px 10px;
}
.highlight {
@ -980,6 +989,16 @@ input[type=range]:focus::-ms-fill-upper {
min-width: 100% !important;
overflow: hidden !important;
}
#effectsDiv3 {
max-width: 100% !important;
min-width: 100% !important;
overflow: hidden !important;
}
#effectsDiv {
max-width: 100% !important;
min-width: 100% !important;
overflow: hidden !important;
}
#headphonesDiv {
max-width: 100% !important;
min-width: 100% !important;
@ -1068,7 +1087,7 @@ input[type=range]:focus::-ms-fill-upper {
width: 505px;
right: -400px;
overflow: auto;
z-index: 1;
z-index: 3;
}
#audioSourceScreenshare {
@ -1347,6 +1366,11 @@ img {
position: relative !important;
top: 50% !important;
}
#calendarButton {
cursor: pointer;
z-index: 6;
display:none;
}
#translateButton {
cursor: pointer;
z-index: 6;
@ -1512,6 +1536,9 @@ img {
}
video {
transition: opacity .25s ease-in-out;
-moz-transition: opacity .25s ease-in-out;
-webkit-transition: opacity .25s ease-in-out;
pointer-events: auto;
background-color: transparent !important;
border: 0;
@ -1528,6 +1555,8 @@ 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");
}
.nogb { background-image: unset !important }
video::-webkit-media-controls-timeline {
display: none;
}
@ -1599,8 +1628,8 @@ video.clean::-webkit-media-controls-timeline-container {
display: none;
align-text: center;
position: absolute;
z-index: 10 !important;
padding: 3px 0 !important;
z-index: 21 !important;
padding: 3px !important;
min-width: 180px !important;
background-color: #fff !important;
border: solid 1px #dfdfdf !important;
@ -1656,7 +1685,7 @@ video.clean::-webkit-media-controls-timeline-container {
}
#headphonesDiv3 {
text-align: left;
margin: 17px 0;
margin: 17px 0 0 0;
width: 450px;
background-color: #f3f3f3;
padding: 10px 10px;
@ -1672,6 +1701,26 @@ video.clean::-webkit-media-controls-timeline-container {
border: 1px solid #ccc;
vertical-align: middle;
}
#effectSelector3{
background-color: #FFF;
display: inline-block;
vertical-align: middle;
padding: 3px;
font-size: 93%;
max-width: 100%;
width: 90%;
}
#effectsDiv3 {
text-align: left;
width: 450px;
background-color: #f3f3f3;
padding: 10px 10px;
border: 1px solid #ccc;
vertical-align: middle;
margin: 17px 0 0 0;
}
#videoSettings {
margin: auto auto;
background-color: #f3f3f3;
@ -1695,6 +1744,12 @@ video.clean::-webkit-media-controls-timeline-container {
font-size: 100%;
max-width: 260px;
}
#effectSelector{
display: inline-block;
vertical-align: middle;
font-size: 100%;
max-width: 260px;
}
.gone {
position: absolute;
display: inline-block;
@ -1719,18 +1774,22 @@ video.clean::-webkit-media-controls-timeline-container {
color: black !important;
}
.hidden {
display:none;
visibility: hidden;
width:0px;
height:0px;
}
/* visited link */
.grabLinks a:visited {
color: black !important;
}
#videoSettings3 {
margin: auto auto;
margin: 0 auto 15px auto;
background-color: #f3f3f3;
width: 450px;
padding: 10px 0;
margin: 0 0 5px 0;
padding: 7px 10px 1px 10px;
border: 1px solid #ccc;
padding: 3px;
font-size: 90%;
}
#videoSource3 {
@ -1766,6 +1825,7 @@ video.clean::-webkit-media-controls-timeline-container {
vertical-align: middle;
text-align: left;
}
div.multiselect {
width: 450px;
white-space: nowrap;
@ -1920,6 +1980,7 @@ input[type=checkbox] {
font-size: 105%;
margin-left: 7px;
padding: 3px;
border: 3px solid black;
}
.debugStats {
font-size: 0.8rem;
@ -2039,6 +2100,9 @@ input[type=checkbox] {
font-size: 100%;
}
}
.directorMargins {
margin: var(--director-margin);
}
.hideLinksClass {
background-color: var(--container-color);
width:1191px;
@ -2065,7 +2129,7 @@ input[type=checkbox] {
}
.directorBlock {
padding: 10px 10px 5px 10px;
margin: 10px;
margin: var(--regular-margin);
color: white;
position:relative;
max-width: 100%;
@ -2327,9 +2391,26 @@ span#guestTips {
right: 2vh;
background-color:green;
position:absolute;
display:none;
border-radius: 2vh;
pointer-events:none;
border: 1px black solid;
}
#voiceMeterTemplate{
display:none;
}
#userList{
line-height: 1.3em;
}
#userList > div > .video-meter {
padding: 5px;
margin-left: 5px;
top: 0;
right: 0;
position: relative;
display: inline-block;
}
.video-mute-state {
@ -2342,6 +2423,16 @@ span#guestTips {
padding: 2px 2px 2px 1px;
}
.video-mute-state-userlist {
display:inline-block;
color:white;
border-radius: 2vh;
background-color:#b11313;
padding: 2.2px 1.5px 2px 2px;
margin: 0 0 0 5px;
}
#help_directors_room{
cursor:pointer;
}
@ -2502,7 +2593,7 @@ input:checked + .slider:before {
transform: translateX(16px);
}
.alertModal {
#promptModal {
position: absolute;
background-color: rgb(221 221 221);
box-shadow: 0 0 30px 10px #0000005c;
@ -2513,9 +2604,103 @@ input:checked + .slider:before {
transform: translate(-50%, -50%);
border-radius: 10px;
font-weight: bold;
z-index:2;
width:400px;
z-index:31;
min-width:400px;
max-width:90%;
overflow-wrap: break-word;
}
.largeTextEntry {
width:300px;
margin: 0 0 0 55px;
font-size: 1em;
padding: 0.4em;
display: block;
}
.promptModalInner {
position: relative;
padding: 1em;
}
#SafariWarning{
display:none;
width: 450px;
border-left: 4px solid #eff150;
background: #fffded;
padding: 10px;
align-items: center;
margin: 0 auto;
position: relative;
margin: 0 auto;
margin-bottom: 20px;
box-shadow: 0px 5px 10px -5px #a9a9a9;
text-align: left;
}
#SafariWarning > p {
text-align: left;
display:inline-block;
padding-left: 38px;
}
#SafariWarning > i {
position: absolute;
font-size: 2em;
padding: 2px 0 0 0;
}
#alertModal {
position: absolute;
background-color: rgb(221 221 221);
box-shadow: 0 0 30px 10px #0000005c;
color: black;
font-size: 1.2em;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 10px;
font-weight: bold;
z-index:32;
min-width:360px;
max-width:90%;
overflow-wrap: break-word;
}
#connectUsers{
float: right;
display: none;
position: absolute;
max-width: 400px;
min-width: 150px;
max-height: 80%;
background-color: #08090e;
z-index: 5;
padding: 10px;
right: 20px;
bottom: 120px;
box-shadow: 2px 2px #313131;
border-radius: 5px;
border: 1px solid #252525;
opacity: 0.7;
color: white;
}
#alertModal a:link {
color: blue;
}
/* visited link */
#alertModal a:visited {
color: blue;
}
/* mouse over link */
#alertModal a:hover {
color: blue;
}
/* selected link */
#alertModal a:active {
color: blue;
}
.alertModalInner {
@ -2523,7 +2708,7 @@ input:checked + .slider:before {
padding: 2em;
}
.alertModalClose {
.modalClose {
position: absolute;
top: -4px;
right: 4px;
@ -2532,7 +2717,7 @@ input:checked + .slider:before {
font-size: 1.8em;
}
.alertModalBackdrop {
#modalBackdrop {
background: var(--background-color);
position: fixed;
top: 0;
@ -2547,4 +2732,65 @@ input:checked + .slider:before {
.alertModal {
width: 90%;
}
}
.desktop-capturer-selection {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background: rgba(30,30,30,.75);
color: #fff;
z-index: 10000000;
display: flex;
align-items: center;
justify-content: center;
}
.desktop-capturer-selection__scroller {
width: 100%;
max-height: 100vh;
overflow-y: auto;
}
.desktop-capturer-selection__list {
max-width: calc(100% - 100px);
margin: 50px;
padding: 0;
display: flex;
flex-wrap: wrap;
list-style: none;
overflow: hidden;
justify-content: center;
}
.desktop-capturer-selection__item {
display: flex;
margin: 4px;
}
.desktop-capturer-selection__btn {
display: flex;
flex-direction: column;
align-items: stretch;
width: 145px;
margin: 0;
border: 0;
border-radius: 3px;
padding: 4px;
background: #252626;
text-align: left;
transition: background-color .15s, box-shadow .15s;
}
.desktop-capturer-selection__btn:hover,
.desktop-capturer-selection__btn:focus {
background: rgba(98,100,167,.8);
}
.desktop-capturer-selection__thumbnail {
width: 100%;
height: 81px;
object-fit: cover;
}
.desktop-capturer-selection__name {
margin: 6px 0 6px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}

5371
main.js

File diff suppressed because it is too large Load Diff

BIN
media/bg_sample.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
media/bg_sample2.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
media/streamdeck.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

567
monitor.html Normal file
View File

@ -0,0 +1,567 @@
<html>
<head>
<meta charset="utf8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>OBSN Monitoring</title>
<style>
body {
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family: "Lato", sans-serif;
padding: 0 0px;
height: 100%;
width: 100%;
font-family: Helvetica, Arial, sans-serif;
border: 0;
margin: 0;
opacity: 1;
transition: opacity .1s linear;
background-color: #141926;
}
h1 {
color: white;
margin: 5px 20px;
}
h1 small {
display: block;
margin-top: 0.5em;
font-size: 0.5em;
}
h2 {
color: #CCC;
margin-top:10px;
}
#explanation {
color: white;
font-family: sans-serif;
width: 80%;
margin: 0 auto;
margin-top: 20px;
}
#container, #graphs, #log {
width: 80%;
margin: 0 auto;
}
#explanation h2 {
border-bottom: 1px solid #383838;
margin-bottom: 10px;
padding-bottom: 5px;
}
#feeds {
display: inline-block;
width:100%;
height:380px;
}
#feeds span {
margin:auto;
height: 100%;
min-width:50%;
display: inline-block;
flex-direction: column;
}
#button_container{
margin:auto;
}
#feeds h3 {
color: whitesmoke;
margin: 10px;
}
iframe {
height: 85%;
width: 100%;
flex: 1;
}
#controls {
margin:auto;
}
#controls button {
margin: 5px;
}
#controls button.active {
background-color: #70ff70;
}
canvas {
background-color: black;
margin: 20px;
}
#log {
margin-top: 10px;
background: #313131;
padding: 20px 0px;
border: 1px solid #383838;
cursor: pointer;
max-height:300px;
}
#log ul {
margin: 20px;
list-style: none;
color: #cacaca;
max-height: 20vh;
overflow: auto;
overflow-x: hidden;
}
#graphs {
display: block;
margin-top: 20px;
background: #313131;
padding: 20px 0px;
border: 1px solid #383838;
text-align: center;
}
.graphContainer {
display: block;
margin-top: 20px;
background: #313131;
border: 1px solid #383838;
}
.graph {
display: inline-block;
position: relative;
}
.graph h2, #log h2 {
margin: 10px 20px 0 20px;
font-size: 1em;
}
.graph > span {
position: absolute;
bottom: 30px;
left: 30px;
color: #cacaca;
font-weight: bold;
}
ol {
margin-left: 20px;
margin-top: 30px;
}
@media only screen and (max-width: 800px) {
#container, #graphs, #log {
width: 100%;
margin: 0 auto;
}
#graphs {
flex-direction: column;
}
iframe {
width: 100%;
}
#feeds {
flex-direction: column;
}
#feeds h3 {
font-size:50%;
}
h1{
color: white;
margin: 2px;
font-size:70%
}
#feeds span{
height: 50%;
width:100%;
display: inline-block;
}
canvas {
margin:auto;
}
}
#statsdiv {display: none;}
</style>
<script>
function getChromeVersion() {
var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
return raw ? parseInt(raw[2], 10) : false;
}
if (!getChromeVersion()){
alert("This speedtest is optimized for Chromium-based browsers; graphs will not work for Firefox or Safari browsers.");
}
(function (w) {
w.URLSearchParams =
w.URLSearchParams ||
function (searchString) {
var self = this;
self.searchString = searchString;
self.get = function (name) {
var results = new RegExp("[\?&]" + name + "=([^&#]*)").exec(
self.searchString
);
if (results == null) {
return null;
} else {
return decodeURI(results[1]) || 0;
}
};
};
})(window);
var urlParams = new URLSearchParams(window.location.search);
var quality_reason = {};
var video_encoder={};
var resolution={};
function copyFunction(copyText) {
try {
copyText.select();
copyText.setSelectionRange(0, 99999);
document.execCommand("copy");
} catch (e) {
var dummy = document.createElement("input");
document.body.appendChild(dummy);
dummy.value = copyText;
dummy.select();
document.execCommand("copy");
document.body.removeChild(dummy);
return false;
}
}
function loadIframe() {
var iframe = document.createElement("iframe");
if (urlParams.has("remote")) {
var remote = urlParams.get("remote");
} else {
var remote="";
}
if (urlParams.has("sid")) {
var streamID = urlParams.get("sid");
} else if (urlParams.has("view")) {
var streamID = urlParams.get("view");
} else {
return;
}
if (document.getElementById("streamID_header")){
document.getElementById("streamID_header").innerText += ": "+streamID;
}
var room="";
if (urlParams.has("room")) {
room = "&room="+urlParams.get("room");
}
var password="";
if (urlParams.has("password")) {
password = "&password="+urlParams.get("password");
}
iframe.allow = "autoplay";
var srcString = "./?view=" + streamID + room + password + "&vd=0&ad=0&autostart&novideo&noaudio&remote="+remote;
iframe.src = srcString;
iframe.style.width="0";
iframe.style.height="0";
iframe.style.border="0";
document.body.appendChild(iframe);
setInterval(function () {
iframe.contentWindow.postMessage({ getRemoteStats: true }, "*");
}, 3000);
var eventMethod = window.addEventListener
? "addEventListener"
: "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
var previousResolution;
eventer(messageEvent, function (e) {
if ("remoteStats" in e.data) {
var out = "";
console.log(e.data);
for (var UUID in e.data.remoteStats) {
if (e.data.remoteStats[UUID].quality_limitation_reason){
if (quality_reason[UUID] != e.data.remoteStats[UUID].quality_limitation_reason) {
quality_reason[UUID] = e.data.remoteStats[UUID].quality_limitation_reason;
logData("Quality Limitation Reason:", quality_reason[UUID], UUID);
}
}
if (e.data.remoteStats[UUID].video_encoder){
if (video_encoder[UUID] != e.data.remoteStats[UUID].video_encoder) {
video_encoder[UUID] = e.data.remoteStats[UUID].video_encoder;
logData("Video encoder used:", video_encoder[UUID], UUID);
}
}
if (e.data.remoteStats[UUID].resolution){
if (resolution[UUID] != e.data.remoteStats[UUID].resolution) {
resolution[UUID] = e.data.remoteStats[UUID].resolution;
logData("Resolution:", resolution[UUID], UUID);
}
}
if (e.data.remoteStats[UUID].video_bitrate_kbps){
var video_bitrate_kbps = e.data.remoteStats[UUID].video_bitrate_kbps;
updateData("bitrate", video_bitrate_kbps, UUID);
} else if (document.getElementById(UUID)){
updateData("bitrate", 0, UUID);
}
if (e.data.remoteStats[UUID].nacks_per_second){
var nacks_per_second = e.data.remoteStats[UUID].nacks_per_second;
updateData("nackrate", nacks_per_second, UUID);
} else if (document.getElementById(UUID)){
updateData("nackrate", 0, UUID);
}
if (e.data.remoteStats[UUID].retransmitted_kbps){
var retransmitted_kbps = e.data.remoteStats[UUID].retransmitted_kbps;
updateData("retransmit", retransmitted_kbps, UUID);
} else if (document.getElementById(UUID)){
updateData("retransmit", 0, UUID);
}
if (e.data.remoteStats[UUID].info.label){
if (!document.getElementById("label_"+UUID)){
document.getElementById(UUID).innerHTML = "<h1 class='small' id='label_"+UUID+"'></h1>" + document.getElementById(UUID).innerHTML;
}
document.getElementById("label_"+UUID).innerText = e.data.remoteStats[UUID].info.label;
}
//updateData("buffer", buffer);
//if (packetloss != undefined) {
// packetloss = packetloss.toFixed(2);
// updateData("packetloss", packetloss);
//}
}
}
});
}
function printValues(obj) {
var out = "";
for (var key in obj) {
if (typeof obj[key] === "object") {
out += "<br />";
out += printValues(obj[key]);
} else {
if (key.startsWith("_")) {
} else {
out += "<b>" + key + "</b>: " + obj[key] + "<br />";
}
}
}
return out;
}
function logData(type, data, UUID) {
try{
var log = document.getElementById(UUID).querySelectorAll('[data-log]')[0].getElementsByTagName("ul")[0];
var entry = document.createElement('li');
entry.style.color ="white";
entry.textContent = "[" + new Date().toLocaleTimeString() + "] " + type + " : " + data;
if (log.childElementCount>10){
log.childNodes[0].parentNode.removeChild(log.childNodes[0]);
}
log.appendChild(entry);
} catch(e){}
}
</script>
</head>
<body onload="loadIframe();">
<div id="container">
<h1 >
<span id="streamID_header">OBS.Ninja Remote Monitor</span>
</h1>
</div>
<div id="graphs" style="display:none">
<div class="graph">
<h2>Bitrate (kbps)</h2>
<span>0</span>
<canvas data-bitrate-graph="true"></canvas>
</div>
<div class="graph">
<h2>Reported lost packets (per second)</h2>
<span>0</span>
<canvas data-nackrate-graph="true"></canvas>
</div>
<div class="graph">
<h2>Retransmitted (kbps)</h2>
<span>0</span>
<canvas data-retransmit-graph="true"></canvas>
</div>
<div data-log="true" onclick="copyFunction(this.innerText)" style="max-height:400px;display:inline-block;">
<ul></ul>
</div>
</div>
<script>
var bitrate = {
element: "bitrate-graph",
data: 0,
max: 6000,
target: 3000,
};
var frames;
var nackrate = {
element: "nackrate-graph",
data: 0,
max: 15,
target: 15,
};
var retransmit = {
element: "retransmit-graph",
data: 0,
max: 100,
target: 100,
};
function updateData(type, data, UUID) {
if (type == "bitrate") {
bitrate.data = data;
plotData("bitrate", bitrate, UUID);
}
if (type == "nackrate") {
nackrate.data = data;
plotData("nackrate", nackrate, UUID);
}
if (type == "retransmit") {
retransmit.data = data;
plotData("retransmit", retransmit, UUID);
}
}
function plotData(type, stat, UUID) {
var canvas;
var context;
var yScale;
var container = document.getElementById(UUID);
if (container){
canvas = container.querySelectorAll('[data-'+stat.element+']')[0];
} else {
container = document.getElementById("graphs").cloneNode(true);
container.id = UUID;
container.className = "graphContainer";
container.style.display = "block";
document.getElementById("graphs").parentNode.insertBefore(container, document.getElementById("graphs").nextSibling);
canvas = container.querySelectorAll('[data-'+stat.element+']')[0];
}
context = canvas.getContext("2d");
if (isNaN(stat.data)) {
stat.data = 0;
}
var text = (canvas.previousElementSibling.innerHTML = stat.data);
var height = context.canvas.height;
var width = context.canvas.width;
var borderWidth = 5;
var offset = borderWidth * 2;
// Create gradient
var grd = context.createLinearGradient(0, 0, 0, height);
if (type == "bitrate") {
// Higher values are green
grd.addColorStop(0, "#33C433");
grd.addColorStop(0.7, "#F3F304");
grd.addColorStop(0.9, "#F30404");
} else {
// Higher values are red
grd.addColorStop(0, "#F30404");
grd.addColorStop(0.85, "#F3F304");
grd.addColorStop(0.95, "#33C433");
}
context.strokeStyle = "white";
context.fillStyle = grd;
//context.fillStyle = "#009933";
//context.imageSmoothingEnabled = true;
yScale = height / stat.target;
if (stat.data > stat.target) {
stat.data = stat.target;
}
if (type == "retransmit" && stat.data == 0.0) {
stat.data = 0.5;
}
if (type == "nackrate" && stat.data == 0.0) {
stat.data = 0.1;
}
var x = width - 1;
var y = height - stat.data * yScale;
var w = 1;
context.fillStyle = grd;
context.fillRect(x, y, w, height);
// shift everything to the left:
var imageData = context.getImageData(1, 0, width - 1, height);
context.putImageData(imageData, 0, 0);
// now clear the right-most pixels:
context.clearRect(width - 1, 0, 1, height);
}
</script>
</body>
</html>

View File

@ -116,7 +116,15 @@ canvas {
padding: 20px 0px;
border: 1px solid #383838;
text-align: center;
}
.graphContainer {
display: block;
margin-top: 20px;
background: #313131;
padding: 20px 0px;
border: 1px solid #383838;
text-align: center;
}
.graph {

View File

@ -59,13 +59,18 @@
// this is pretty important if you want to avoid camera permission popup problems. YOu need to load the iFRAME after you load the parent body. A quick solution is like: <body onload=>loadIframe();"> !!!
var streamID = "";
var possible =
"ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789";
var possible = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789";
for (var i = 0; i < 7; i++) {
streamID += possible.charAt(
Math.floor(Math.random() * possible.length)
);
}
if (urlParams.has("sid")) {
streamID = urlParams.get("sid");
}
document.getElementById("remote").innerHTML = "<a style='color:#CCC' href='./monitor?sid="+streamID+"'>Remote Monitoring Link</a><br /><br /><br /><br />";
var iframe = document.createElement("iframe");
var iframeContainer = document.createElement("span");
@ -75,7 +80,7 @@
iframe.allowfullscreen ="true";
//iframe.allow = "autoplay";
var srcString = "./?push=" + streamID + "&cleanoutput&privacy&speedtest&webcam&audiodevice=0&fullscreen&transparent";
var srcString = "./?push=" + streamID + "&cleanoutput&privacy&speedtest&webcam&audiodevice=0&fullscreen&transparent&remote";
if (urlParams.has("turn")) {
srcString = srcString + "&turn=" + urlParams.get("turn");
@ -115,7 +120,7 @@
var iframeContainer = document.createElement("span");
iframe.allow = "autoplay";
var srcString = "./?view=" + streamID + "&cleanoutput&privacy&noaudio&scale=0";
var srcString = "./?view=" + streamID + "&cleanoutput&privacy&noaudio&speedtest&scale=0";
if (urlParams.has("turn")) {
srcString = srcString + "&turn=" + urlParams.get("turn");
@ -187,13 +192,12 @@
? "addEventListener"
: "attachEvent";
var eventer = window[eventMethod];
var messageEvent =
eventMethod === "attachEvent" ? "onmessage" : "message";
var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
var previousResolution;
eventer(messageEvent, function (e) {
if ("action" in e.data) {
logData(e.data.action, e.data.value);
logData(e.data.action, e.data.value || "");
if (e.data.action == "new-view-connection") {
buttonContainer.querySelectorAll(
@ -230,9 +234,9 @@
}
for (var streamID in e.data.stats.outbound_stats) {
if (e.data.stats.outbound_stats[streamID].quality_Limitation_Reason){
if (quality_reason != e.data.stats.outbound_stats[streamID].quality_Limitation_Reason) {
quality_reason = e.data.stats.outbound_stats[streamID].quality_Limitation_Reason;
if (e.data.stats.outbound_stats[streamID].quality_limitation_reason){
if (quality_reason != e.data.stats.outbound_stats[streamID].quality_limitation_reason) {
quality_reason = e.data.stats.outbound_stats[streamID].quality_limitation_reason;
logData("Quality Limitation Reason:", quality_reason);
}
}
@ -357,7 +361,9 @@
Change the video bitrate by pressing the buttons below the video. It
should approach 6000-kbps if the network allows.
</li>
</ol>
<div id="remote"></div>
</div>
<script>

172
status.html Normal file
View File

@ -0,0 +1,172 @@
<html>
<head>
<meta charset="utf8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>OBSN Chat Overlay</title>
<style>
@font-face {
font-family: 'Cousine';
src: url('fonts/Cousine-Bold.ttf') format('truetype');
}
body {
margin:0;
padding:0 10px;
height:100%;
border: 0;
display: flex;
flex-direction: column-reverse;
position:absolute;
bottom:0;
overflow:hidden;
max-width:100%;
}
ul {
margin:0;
background-color: #0000;
color: white;
font-family: Cousine, monospace;
font-size: 3.2em;
line-height: 1.1em;
letter-spacing: 0.0em;
text-transform: uppercase;
padding: 0em;
text-shadow: 0.05em 0.05em 0px rgba(0,0,0,1);
max-width:100%;
}
ul li {
background-color: black;
padding: 8px 8px 0px 8px;
margin:0;
word-wrap: break-word;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-all;
hyphens: auto;
max-width:100%;
}
a {
color:white;
font-size:1.2em;
text-transform: none;
word-wrap: break-word;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-all;
hyphens: auto;
}
</style>
<script>
(function (w) {
w.URLSearchParams =
w.URLSearchParams ||
function (searchString) {
var self = this;
self.searchString = searchString;
self.get = function (name) {
var results = new RegExp("[\?&]" + name + "=([^&#]*)").exec(
self.searchString
);
if (results == null) {
return null;
} else {
return decodeURI(results[1]) || 0;
}
};
};
})(window);
var urlParams = new URLSearchParams(window.location.search);
function loadIframe() {
var iframe = document.createElement("iframe");
var view= "";
if (urlParams.has("view")) {
view = "&view="+(urlParams.get("view") || "");
}
var room="";
if (urlParams.has("room")) {
room = "&room="+urlParams.get("room");
}
var password="";
if (urlParams.has("password")) {
password = "&password="+urlParams.get("password");
}
iframe.allow = "autoplay";
var srcString = "./?novideo&noaudio&label=chatOverlay&scene"+room+view+password;
iframe.src = srcString;
iframe.style.width="0";
iframe.style.height="0";
iframe.style.border="0";
document.body.appendChild(iframe);
//////////// LISTEN FOR EVENTS
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
/// If you have a routing system setup, you could have just one global listener for all iframes instead.
eventer(messageEvent, function (e) {
if (e.source != iframe.contentWindow){return} // reject messages send from other iframes
console.log(e);
if ("gotChat" in e.data){
logData(e.data.gotChat.label,e.data.gotChat.msg);
}
});
}
function printValues(obj) {
var out = "";
for (var key in obj) {
if (typeof obj[key] === "object") {
out += "<br />";
out += printValues(obj[key]);
} else {
if (key.startsWith("_")) {
} else {
out += "<b>" + key + "</b>: " + obj[key] + "<br />";
}
}
}
return out;
}
function logData(type, data) {
var log = document.body.getElementsByTagName("ul")[0];
var entry = document.createElement('li');
if (type){
type = "<i>"+type+"</i>";
}
entry.innerHTML = type + data;
//setTimeout(function(entry){ // hide message after 60 seconds
// entry.innerHTML="";
// entry.remove();
// },60000,entry);
log.appendChild(entry);
}
</script>
</head>
<body onload="loadIframe();">
<ul></ul>
</body>
</html>

View File

@ -37,6 +37,16 @@
</div>
<script>
function getChromeVersion() {
var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
return raw ? parseInt(raw[2], 10) : false;
}
if (!getChromeVersion() || getChromeVersion < 60){
alert("This tool really only works with recent Chromium based browsers; Firefox or Safari are not supported");
}
function prettyPrintJsonToId(json, element) {
var output = "<div class='prettyJson three-col'>";
@ -97,13 +107,18 @@
function changeCamera() {
var deviceId = document.getElementById("cameraSelector").value;
getCameraDetails(deviceId);
}
function getCameraDetails(deviceId) {
console.log(deviceId);
navigator.mediaDevices
.getUserMedia({
video: {
deviceId: deviceId,
deviceId: {exact: deviceId},
zoom: true,
pan: true,
tilt: true
},
audio: false,
})
@ -111,49 +126,98 @@
console.log("worked");
setTimeout(function () {
mediaStream.getVideoTracks().forEach((track) => {
const capabilities = track.getCapabilities();
const settings = track.getSettings();
prettyPrintSupportedOptions(capabilities, "cameraSupportedOptions");
document
try{
const capabilities = track.getCapabilities();
const settings = track.getSettings();
prettyPrintSupportedOptions(capabilities, "cameraSupportedOptions");
document
.querySelectorAll(".property")
.forEach((el) => el.classList.remove("ok"));
Object.entries(capabilities)
.sort()
.forEach(([key, value]) => {
document.getElementById(key).classList.add("ok");
});
prettyPrintJsonToId(settings, "cameraSettings");
} catch (e){
document
.querySelectorAll(".property")
.forEach((el) => el.classList.remove("ok"));
Object.entries(capabilities)
.sort()
.forEach(([key, value]) => {
document.getElementById(key).classList.add("ok");
});
prettyPrintJsonToId(settings, "cameraSettings");
}
});
}, 1000);
}).catch(function(e){
setTimeout(function(){getCameraDetailsFallback(deviceId)},0);
})
}
function getCameraDetailsFallback(deviceId) {
console.log(deviceId);
navigator.mediaDevices
.getUserMedia({
video: {
deviceId: deviceId
},
audio: false,
})
.then(function (mediaStream) {
console.log("worked");
setTimeout(function () {
mediaStream.getVideoTracks().forEach((track) => {
try{
const capabilities = track.getCapabilities();
const settings = track.getSettings();
prettyPrintSupportedOptions(capabilities, "cameraSupportedOptions");
document
.querySelectorAll(".property")
.forEach((el) => el.classList.remove("ok"));
Object.entries(capabilities)
.sort()
.forEach(([key, value]) => {
document.getElementById(key).classList.add("ok");
});
prettyPrintJsonToId(settings, "cameraSettings");
} catch (e){
document
.querySelectorAll(".property")
.forEach((el) => el.classList.remove("ok"));
}
});
}, 1000);
//updateDeviceList();
});
}
var supports = navigator.mediaDevices.getSupportedConstraints();
prettyPrintJsonToId(supports, "browserSupportedOptions");
document.getElementById("browserSupportedOptionsTitle").innerText +=
" (" + Object.keys(supports).length + ")";
navigator.mediaDevices
.enumerateDevices()
.then(function (devices) {
setTimeout(function () {
console.log("Listing devices");
devices.forEach(function (device) {
if (device.kind == "videoinput") {
var element = document.createElement("option");
element.setAttribute("value", device.deviceId);
element.innerText = device.label;
document.getElementById("cameraSelector").appendChild(element);
console.log(device);
}
});
getCameraDetails(devices[0]);
}, 1000);
})
.catch(function (err) {
console.log(err.name + ": " + err.message);
});
function updateDeviceList(){
navigator.mediaDevices
.enumerateDevices()
.then(function (devices) {
setTimeout(function (devices) {
console.log("Listing devices");
devices.forEach(function (device) {
if (device.kind == "videoinput") {
var element = document.createElement("option");
element.setAttribute("value", device.deviceId);
element.innerText = device.label || "No Label Available";
document.getElementById("cameraSelector").appendChild(element);
console.log(device);
}
});
setTimeout(function(){changeCamera();},10);
}, 1000, devices);
})
.catch(function (err) {
console.log(err.name + ": " + err.message);
});
}
updateDeviceList();
</script>
</body>
</html>

View File

@ -39,6 +39,10 @@ var CodecsHandler = (function() {
return sdp;
} else if (codecName === 'av1' && info.av1LineNumber === info.videoCodecNumbers[0]) {
return sdp;
} else if (codecName === 'red' && info.redLineNumber === info.videoCodecNumbers[0]) {
return sdp;
} else if (codecName === 'fec' && info.fecLineNumber === info.videoCodecNumbers[0]) {
return sdp;
}
sdp = preferCodecHelper(sdp, codecName, info);
@ -72,6 +76,18 @@ var CodecsHandler = (function() {
return sdp;
}
preferCodecNumber = info.av1LineNumber;
} else if (codec === 'red') {
if (!info.redLineNumber) {
return sdp;
}
preferCodecNumber = info.redLineNumber;
} else if (codec === 'fec') {
if (!info.fecLineNumber) {
return sdp;
}
preferCodecNumber = info.fecLineNumber;
}
var newLine = info.videoCodecNumbersOriginal.split('SAVPF')[0] + 'SAVPF ';
@ -120,6 +136,14 @@ var CodecsHandler = (function() {
if (line.indexOf('AV1X/90000') !== -1 && !info.av1LineNumber) {
info.av1LineNumber = line.replace('a=rtpmap:', '').split(' ')[0];
}
if (line.indexOf('red/90000') !== -1 && !info.redLineNumber) {
info.redLineNumber = line.replace('a=rtpmap:', '').split(' ')[0];
}
if (line.indexOf('ulpfec/90000') !== -1 && !info.fecLineNumber) {
info.fecLineNumber = line.replace('a=rtpmap:', '').split(' ')[0];
}
});
@ -136,11 +160,89 @@ var CodecsHandler = (function() {
throw 'Invalid arguments.';
}
sdp = sdp.replace('a=rtcp-fb:126 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:126 nack pli\r\n', 'a=rtcp-fb:126 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:97 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:35 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:35 nack pli\r\n', 'a=rtcp-fb:35 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:96 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:96 nack pli\r\n', 'a=rtcp-fb:96 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:97 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:97 nack pli\r\n', 'a=rtcp-fb:97 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:98 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:98 nack pli\r\n', 'a=rtcp-fb:98 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:99 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:99 nack pli\r\n', 'a=rtcp-fb:99 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:100 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:100 nack pli\r\n', 'a=rtcp-fb:100 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:102 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:102 nack pli\r\n', 'a=rtcp-fb:102 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:108 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:108 nack pli\r\n', 'a=rtcp-fb:108 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:124 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:124 nack pli\r\n', 'a=rtcp-fb:124 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:123 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:123 nack pli\r\n', 'a=rtcp-fb:123 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:125 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:125 nack pli\r\n', 'a=rtcp-fb:125 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:126 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:126 nack pli\r\n', 'a=rtcp-fb:126 pli\r\n');
sdp = sdp.replace('a=rtcp-fb:127 nack\r\n', '');
sdp = sdp.replace('a=rtcp-fb:127 nack pli\r\n', 'a=rtcp-fb:127 pli\r\n');
return sdp;
}
function disableREMB(sdp) {
if (!sdp || typeof sdp !== 'string') {
throw 'Invalid arguments.';
}
sdp = sdp.replace('a=rtcp-fb:35 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:96 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:97 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:98 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:99 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:100 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:102 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:108 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:124 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:123 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:125 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:126 goog-remb\r\n', '');
sdp = sdp.replace('a=rtcp-fb:127 goog-remb\r\n', '');
return sdp;
}
function disablePLI(sdp) {
if (!sdp || typeof sdp !== 'string') {
throw 'Invalid arguments.';
}
sdp = sdp.replace('a=rtcp-fb:35 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:35 nack pli\r\n', 'a=rtcp-fb:35 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:96 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:96 nack pli\r\n', 'a=rtcp-fb:96 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:97 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:97 nack pli\r\n', 'a=rtcp-fb:97 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:98 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:98 nack pli\r\n', 'a=rtcp-fb:98 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:99 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:99 nack pli\r\n', 'a=rtcp-fb:99 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:100 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:100 nack pli\r\n', 'a=rtcp-fb:100 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:102 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:102 nack pli\r\n', 'a=rtcp-fb:102 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:108 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:108 nack pli\r\n', 'a=rtcp-fb:108 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:124 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:124 nack pli\r\n', 'a=rtcp-fb:124 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:123 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:123 nack pli\r\n', 'a=rtcp-fb:123 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:125 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:125 nack pli\r\n', 'a=rtcp-fb:125 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:126 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:126 nack pli\r\n', 'a=rtcp-fb:126 nack\r\n');
sdp = sdp.replace('a=rtcp-fb:127 pli\r\n', '');
sdp = sdp.replace('a=rtcp-fb:127 nack pli\r\n', 'a=rtcp-fb:127 nack\r\n');
return sdp;
}
@ -175,7 +277,7 @@ var CodecsHandler = (function() {
function getVideoBitrates(sdp) {
var defaultBitrate = 2500;
var defaultBitrate = false;
var sdpLines = sdp.split('\r\n');
var mLineIndex = findLine(sdpLines, 'm=', 'video');
@ -349,23 +451,33 @@ var CodecsHandler = (function() {
}
if (typeof params.maxaveragebitrate != 'undefined') {
appendOpusNext += ';maxaveragebitrate=' + params.maxaveragebitrate; // default 32000? (kbps)
if (sdpLines[opusFmtpLineIndex].split("maxaveragebitrate=").length==1){
appendOpusNext += ';maxaveragebitrate=' + params.maxaveragebitrate; // default 32000? (kbps)
}
}
if (typeof params.maxplaybackrate != 'undefined') {
appendOpusNext += ';maxplaybackrate=' + params.maxplaybackrate; // Default should be 48000 (hz) , 8000 to 48000 are valid options
if (sdpLines[opusFmtpLineIndex].split("maxplaybackrate=").length==1){
appendOpusNext += ';maxplaybackrate=' + params.maxplaybackrate; // Default should be 48000 (hz) , 8000 to 48000 are valid options
}
}
if (typeof params.cbr != 'undefined') {
appendOpusNext += ';cbr=' + params.cbr; // default is 0 (vbr)
if (sdpLines[opusFmtpLineIndex].split("cbr=").length==1){
appendOpusNext += ';cbr=' + params.cbr; // default is 0 (vbr)
}
}
if (typeof params.useinbandfec != 'undefined') { // useful for handling packet loss
appendOpusNext += ';useinbandfec=' + params.useinbandfec; // Defaults to 0
if (sdpLines[opusFmtpLineIndex].split("useinbandfec=").length==1){
appendOpusNext += ';useinbandfec=' + params.useinbandfec; // Defaults to 0
}
}
if (typeof params.usedtx != 'undefined') { // Default is 0
appendOpusNext += ';usedtx=' + params.usedtx; // if decoder prefers the use of DTX.
if (sdpLines[opusFmtpLineIndex].split("usedtx=").length==1){
appendOpusNext += ';usedtx=' + params.usedtx; // if decoder prefers the use of DTX.
}
}
@ -376,10 +488,47 @@ var CodecsHandler = (function() {
return sdp;
}
function getOpusBitrate(sdp) {
var sdpLines = sdp.split('\r\n');
var opusIndex = findLine(sdpLines, 'a=rtpmap', 'opus/48000');
var opusPayload;
if (opusIndex) {
opusPayload = getCodecPayloadType(sdpLines[opusIndex]);
}
if (!opusPayload) {
return 0;
}
var opusFmtpLineIndex = findLine(sdpLines, 'a=fmtp:' + opusPayload.toString());
if (opusFmtpLineIndex === null) {
return 0;
}
var appendOpusNext = '';
if (sdpLines[opusFmtpLineIndex].split("maxaveragebitrate=").length>1){
var tmp = sdpLines[opusFmtpLineIndex].split("maxaveragebitrate=")[1];
tmp = tmp.split('\r')[0];
tmp = tmp.split('\n')[0];
tmp = tmp.split(';')[0];
tmp = parseInt(tmp);
return tmp;
}
return 32768;
}
return {
disableNACK: disableNACK,
disablePLI: disablePLI,
disableREMB: disableREMB,
getVideoBitrates: function(sdp) {
return getVideoBitrates(sdp);
@ -391,6 +540,10 @@ var CodecsHandler = (function() {
setOpusAttributes: function(sdp, params) {
return setOpusAttributes(sdp, params);
},
getOpusBitrate: function(sdp){
return getOpusBitrate(sdp);
},
preferCodec: preferCodec
};

File diff suppressed because one or more lines are too long

1
thirdparty/tflite/README.md vendored Normal file
View File

@ -0,0 +1 @@
The virtual-background code was initially based on the works of Google and this repo: https://github.com/Volcomix/virtual-background ; Apache-2.0 License. The Google portion was published initially with an Apache lic, although it changed to a Google Lic at a later date.

BIN
thirdparty/tflite/segm_full_v679.tflite vendored Normal file

Binary file not shown.

888
thirdparty/tflite/tflite-simd.js vendored Normal file
View File

@ -0,0 +1,888 @@
var createTFLiteSIMDModule = (function() {
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
return (
function(createTFLiteSIMDModule) {
createTFLiteSIMDModule = createTFLiteSIMDModule || {};
var Module = typeof createTFLiteSIMDModule !== "undefined" ? createTFLiteSIMDModule : {};
var readyPromiseResolve, readyPromiseReject;
Module["ready"] = new Promise(function(resolve, reject) {
readyPromiseResolve = resolve;
readyPromiseReject = reject
});
var moduleOverrides = {};
var key;
for (key in Module) {
if (Module.hasOwnProperty(key)) {
moduleOverrides[key] = Module[key]
}
}
var arguments_ = [];
var thisProgram = "./this.program";
var quit_ = function(status, toThrow) {
throw toThrow
};
var scriptDirectory = "";
function locateFile(path) {
if (Module["locateFile"]) {
return Module["locateFile"](path, scriptDirectory)
}
return scriptDirectory + path
}
var read_, readAsync, readBinary;
if (typeof document !== "undefined" && document.currentScript) {
scriptDirectory = document.currentScript.src
}
if (_scriptDir) {
scriptDirectory = _scriptDir
}
if (scriptDirectory.indexOf("blob:") !== 0) {
scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1)
} else {
scriptDirectory = ""
} {
read_ = function(url) {
var xhr = new XMLHttpRequest;
xhr.open("GET", url, false);
xhr.send(null);
return xhr.responseText
};
readAsync = function(url, onload, onerror) {
var xhr = new XMLHttpRequest;
xhr.open("GET", url, true);
xhr.responseType = "arraybuffer";
xhr.onload = function() {
if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
onload(xhr.response);
return
}
onerror()
};
xhr.onerror = onerror;
xhr.send(null)
}
}
var out = Module["print"] || console.log.bind(console);
var err = Module["printErr"] || console.warn.bind(console);
for (key in moduleOverrides) {
if (moduleOverrides.hasOwnProperty(key)) {
Module[key] = moduleOverrides[key]
}
}
moduleOverrides = null;
if (Module["arguments"]) arguments_ = Module["arguments"];
if (Module["thisProgram"]) thisProgram = Module["thisProgram"];
if (Module["quit"]) quit_ = Module["quit"];
var wasmBinary;
if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"];
var noExitRuntime;
if (Module["noExitRuntime"]) noExitRuntime = Module["noExitRuntime"];
if (typeof WebAssembly !== "object") {
abort("no native wasm support detected")
}
var wasmMemory;
var ABORT = false;
var EXITSTATUS;
function assert(condition, text) {
if (!condition) {
abort("Assertion failed: " + text)
}
}
var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : undefined;
function UTF8ArrayToString(heap, idx, maxBytesToRead) {
var endIdx = idx + maxBytesToRead;
var endPtr = idx;
while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr;
if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
return UTF8Decoder.decode(heap.subarray(idx, endPtr))
} else {
var str = "";
while (idx < endPtr) {
var u0 = heap[idx++];
if (!(u0 & 128)) {
str += String.fromCharCode(u0);
continue
}
var u1 = heap[idx++] & 63;
if ((u0 & 224) == 192) {
str += String.fromCharCode((u0 & 31) << 6 | u1);
continue
}
var u2 = heap[idx++] & 63;
if ((u0 & 240) == 224) {
u0 = (u0 & 15) << 12 | u1 << 6 | u2
} else {
u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63
}
if (u0 < 65536) {
str += String.fromCharCode(u0)
} else {
var ch = u0 - 65536;
str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023)
}
}
}
return str
}
function UTF8ToString(ptr, maxBytesToRead) {
return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""
}
function writeAsciiToMemory(str, buffer, dontAddNull) {
for (var i = 0; i < str.length; ++i) {
HEAP8[buffer++ >> 0] = str.charCodeAt(i)
}
if (!dontAddNull) HEAP8[buffer >> 0] = 0
}
function alignUp(x, multiple) {
if (x % multiple > 0) {
x += multiple - x % multiple
}
return x
}
var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
function updateGlobalBufferAndViews(buf) {
buffer = buf;
Module["HEAP8"] = HEAP8 = new Int8Array(buf);
Module["HEAP16"] = HEAP16 = new Int16Array(buf);
Module["HEAP32"] = HEAP32 = new Int32Array(buf);
Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf);
Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf);
Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf);
Module["HEAPF32"] = HEAPF32 = new Float32Array(buf);
Module["HEAPF64"] = HEAPF64 = new Float64Array(buf)
}
var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216;
var wasmTable;
var __ATPRERUN__ = [];
var __ATINIT__ = [];
var __ATMAIN__ = [];
var __ATPOSTRUN__ = [];
var runtimeInitialized = false;
var runtimeExited = false;
__ATINIT__.push({
func: function() {
___wasm_call_ctors()
}
});
function preRun() {
if (Module["preRun"]) {
if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]];
while (Module["preRun"].length) {
addOnPreRun(Module["preRun"].shift())
}
}
callRuntimeCallbacks(__ATPRERUN__)
}
function initRuntime() {
runtimeInitialized = true;
callRuntimeCallbacks(__ATINIT__)
}
function preMain() {
callRuntimeCallbacks(__ATMAIN__)
}
function exitRuntime() {
runtimeExited = true
}
function postRun() {
if (Module["postRun"]) {
if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]];
while (Module["postRun"].length) {
addOnPostRun(Module["postRun"].shift())
}
}
callRuntimeCallbacks(__ATPOSTRUN__)
}
function addOnPreRun(cb) {
__ATPRERUN__.unshift(cb)
}
function addOnPostRun(cb) {
__ATPOSTRUN__.unshift(cb)
}
var runDependencies = 0;
var runDependencyWatcher = null;
var dependenciesFulfilled = null;
function addRunDependency(id) {
runDependencies++;
if (Module["monitorRunDependencies"]) {
Module["monitorRunDependencies"](runDependencies)
}
}
function removeRunDependency(id) {
runDependencies--;
if (Module["monitorRunDependencies"]) {
Module["monitorRunDependencies"](runDependencies)
}
if (runDependencies == 0) {
if (runDependencyWatcher !== null) {
clearInterval(runDependencyWatcher);
runDependencyWatcher = null
}
if (dependenciesFulfilled) {
var callback = dependenciesFulfilled;
dependenciesFulfilled = null;
callback()
}
}
}
Module["preloadedImages"] = {};
Module["preloadedAudios"] = {};
function abort(what) {
if (Module["onAbort"]) {
Module["onAbort"](what)
}
what += "";
err(what);
ABORT = true;
EXITSTATUS = 1;
what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info.";
var e = new WebAssembly.RuntimeError(what);
readyPromiseReject(e);
throw e
}
function hasPrefix(str, prefix) {
return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0
}
var dataURIPrefix = "data:application/octet-stream;base64,";
function isDataURI(filename) {
return hasPrefix(filename, dataURIPrefix)
}
var fileURIPrefix = "file://";
function isFileURI(filename) {
return hasPrefix(filename, fileURIPrefix)
}
var wasmBinaryFile = "tflite-simd.wasm";
createTFLiteSIMDModule.simd = true;
if (!isDataURI(wasmBinaryFile)) {
wasmBinaryFile = locateFile(wasmBinaryFile)
}
function getBinary(file) {
try {
if (file == wasmBinaryFile && wasmBinary) {
return new Uint8Array(wasmBinary)
}
if (readBinary) {
return readBinary(file)
} else {
throw "both async and sync fetching of the wasm failed"
}
} catch (err) {
abort(err)
}
}
function getBinaryPromise() {
if (!wasmBinary) {
if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) {
return fetch(wasmBinaryFile, {
credentials: "same-origin"
}).then(function(response) {
if (!response["ok"]) {
throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"
}
return response["arrayBuffer"]()
}).catch(function() {
return getBinary(wasmBinaryFile)
})
} else {
if (readAsync) {
return new Promise(function(resolve, reject) {
readAsync(wasmBinaryFile, function(response) {
resolve(new Uint8Array(response))
}, reject)
})
}
}
}
return Promise.resolve().then(function() {
return getBinary(wasmBinaryFile)
})
}
function createWasm() {
var info = {
"a": asmLibraryArg
};
function receiveInstance(instance, module) {
var exports = instance.exports;
Module["asm"] = exports;
wasmMemory = Module["asm"]["q"];
updateGlobalBufferAndViews(wasmMemory.buffer);
wasmTable = Module["asm"]["D"];
removeRunDependency("wasm-instantiate")
}
addRunDependency("wasm-instantiate");
function receiveInstantiatedSource(output) {
receiveInstance(output["instance"])
}
function instantiateArrayBuffer(receiver) {
return getBinaryPromise().then(function(binary) {
return WebAssembly.instantiate(binary, info)
}).then(receiver, function(reason) {
if (createTFLiteSIMDModule.simd){
wasmBinaryFile = "tflite.wasm";
createTFLiteSIMDModule.simd = false;
if (!isDataURI(wasmBinaryFile)) {
wasmBinaryFile = locateFile(wasmBinaryFile)
}
instantiateAsync();
} else {
console.error("FAILED LOADING WASM TFLITE MODEL");
}
})
}
function instantiateAsync() {
return instantiateArrayBuffer(receiveInstantiatedSource)
}
if (Module["instantiateWasm"]) {
try {
var exports = Module["instantiateWasm"](info, receiveInstance);
return exports
} catch (e) {
err("Module.instantiateWasm callback failed with error: " + e);
return false
}
}
instantiateAsync().catch(readyPromiseReject);
return {}
}
function callRuntimeCallbacks(callbacks) {
while (callbacks.length > 0) {
var callback = callbacks.shift();
if (typeof callback == "function") {
callback(Module);
continue
}
var func = callback.func;
if (typeof func === "number") {
if (callback.arg === undefined) {
wasmTable.get(func)()
} else {
wasmTable.get(func)(callback.arg)
}
} else {
func(callback.arg === undefined ? null : callback.arg)
}
}
}
function _abort() {
abort()
}
var _emscripten_get_now;
if (typeof dateNow !== "undefined") {
_emscripten_get_now = dateNow
} else _emscripten_get_now = function() {
return performance.now()
};
var _emscripten_get_now_is_monotonic = true;
function setErrNo(value) {
HEAP32[___errno_location() >> 2] = value;
return value
}
function _clock_gettime(clk_id, tp) {
var now;
if (clk_id === 0) {
now = Date.now()
} else if ((clk_id === 1 || clk_id === 4) && _emscripten_get_now_is_monotonic) {
now = _emscripten_get_now()
} else {
setErrNo(28);
return -1
}
HEAP32[tp >> 2] = now / 1e3 | 0;
HEAP32[tp + 4 >> 2] = now % 1e3 * 1e3 * 1e3 | 0;
return 0
}
function _dlopen(filename, flag) {
abort("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")
}
function _dlsym(handle, symbol) {
abort("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")
}
function _emscripten_memcpy_big(dest, src, num) {
HEAPU8.copyWithin(dest, src, src + num)
}
function _emscripten_get_heap_size() {
return HEAPU8.length
}
function emscripten_realloc_buffer(size) {
try {
wasmMemory.grow(size - buffer.byteLength + 65535 >>> 16);
updateGlobalBufferAndViews(wasmMemory.buffer);
return 1
} catch (e) {}
}
function _emscripten_resize_heap(requestedSize) {
requestedSize = requestedSize >>> 0;
var oldSize = _emscripten_get_heap_size();
var maxHeapSize = 2147483648;
if (requestedSize > maxHeapSize) {
return false
}
var minHeapSize = 16777216;
for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
var overGrownHeapSize = oldSize * (1 + .2 / cutDown);
overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);
var newSize = Math.min(maxHeapSize, alignUp(Math.max(minHeapSize, requestedSize, overGrownHeapSize), 65536));
var replacement = emscripten_realloc_buffer(newSize);
if (replacement) {
return true
}
}
return false
}
function _emscripten_thread_sleep(msecs) {
var start = _emscripten_get_now();
while (_emscripten_get_now() - start < msecs) {}
}
var ENV = {};
function getExecutableName() {
return thisProgram || "./this.program"
}
function getEnvStrings() {
if (!getEnvStrings.strings) {
var lang = (typeof navigator === "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8";
var env = {
"USER": "web_user",
"LOGNAME": "web_user",
"PATH": "/",
"PWD": "/",
"HOME": "/home/web_user",
"LANG": lang,
"_": getExecutableName()
};
for (var x in ENV) {
env[x] = ENV[x]
}
var strings = [];
for (var x in env) {
strings.push(x + "=" + env[x])
}
getEnvStrings.strings = strings
}
return getEnvStrings.strings
}
var SYSCALLS = {
mappings: {},
buffers: [null, [],
[]
],
printChar: function(stream, curr) {
var buffer = SYSCALLS.buffers[stream];
if (curr === 0 || curr === 10) {
(stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
buffer.length = 0
} else {
buffer.push(curr)
}
},
varargs: undefined,
get: function() {
SYSCALLS.varargs += 4;
var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];
return ret
},
getStr: function(ptr) {
var ret = UTF8ToString(ptr);
return ret
},
get64: function(low, high) {
return low
}
};
function _environ_get(__environ, environ_buf) {
var bufSize = 0;
getEnvStrings().forEach(function(string, i) {
var ptr = environ_buf + bufSize;
HEAP32[__environ + i * 4 >> 2] = ptr;
writeAsciiToMemory(string, ptr);
bufSize += string.length + 1
});
return 0
}
function _environ_sizes_get(penviron_count, penviron_buf_size) {
var strings = getEnvStrings();
HEAP32[penviron_count >> 2] = strings.length;
var bufSize = 0;
strings.forEach(function(string) {
bufSize += string.length + 1
});
HEAP32[penviron_buf_size >> 2] = bufSize;
return 0
}
function _exit(status) {
exit(status)
}
function _fd_close(fd) {
return 0
}
function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {}
function _fd_write(fd, iov, iovcnt, pnum) {
var num = 0;
for (var i = 0; i < iovcnt; i++) {
var ptr = HEAP32[iov + i * 8 >> 2];
var len = HEAP32[iov + (i * 8 + 4) >> 2];
for (var j = 0; j < len; j++) {
SYSCALLS.printChar(fd, HEAPU8[ptr + j])
}
num += len
}
HEAP32[pnum >> 2] = num;
return 0
}
function _pthread_create() {
return 6
}
function _pthread_join() {
return 28
}
function _sysconf(name) {
switch (name) {
case 30:
return 16384;
case 85:
var maxHeapSize = 2147483648;
return maxHeapSize / 16384;
case 132:
case 133:
case 12:
case 137:
case 138:
case 15:
case 235:
case 16:
case 17:
case 18:
case 19:
case 20:
case 149:
case 13:
case 10:
case 236:
case 153:
case 9:
case 21:
case 22:
case 159:
case 154:
case 14:
case 77:
case 78:
case 139:
case 82:
case 68:
case 67:
case 164:
case 11:
case 29:
case 47:
case 48:
case 95:
case 52:
case 51:
case 46:
return 200809;
case 27:
case 246:
case 127:
case 128:
case 23:
case 24:
case 160:
case 161:
case 181:
case 182:
case 242:
case 183:
case 184:
case 243:
case 244:
case 245:
case 165:
case 178:
case 179:
case 49:
case 50:
case 168:
case 169:
case 175:
case 170:
case 171:
case 172:
case 97:
case 76:
case 32:
case 173:
case 35:
case 80:
case 81:
case 79:
return -1;
case 176:
case 177:
case 7:
case 155:
case 8:
case 157:
case 125:
case 126:
case 92:
case 93:
case 129:
case 130:
case 131:
case 94:
case 91:
return 1;
case 74:
case 60:
case 69:
case 70:
case 4:
return 1024;
case 31:
case 42:
case 72:
return 32;
case 87:
case 26:
case 33:
return 2147483647;
case 34:
case 1:
return 47839;
case 38:
case 36:
return 99;
case 43:
case 37:
return 2048;
case 0:
return 2097152;
case 3:
return 65536;
case 28:
return 32768;
case 44:
return 32767;
case 75:
return 16384;
case 39:
return 1e3;
case 89:
return 700;
case 71:
return 256;
case 40:
return 255;
case 2:
return 100;
case 180:
return 64;
case 25:
return 20;
case 5:
return 16;
case 6:
return 6;
case 73:
return 4;
case 84: {
if (typeof navigator === "object") return navigator["hardwareConcurrency"] || 1;
return 1
}
}
setErrNo(28);
return -1
}
var asmLibraryArg = {
"a": _abort,
"n": _clock_gettime,
"i": _dlopen,
"e": _dlsym,
"l": _emscripten_memcpy_big,
"m": _emscripten_resize_heap,
"o": _emscripten_thread_sleep,
"p": _environ_get,
"g": _environ_sizes_get,
"j": _exit,
"h": _fd_close,
"k": _fd_seek,
"c": _fd_write,
"d": _pthread_create,
"f": _pthread_join,
"b": _sysconf
};
var asm = createWasm();
var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() {
return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["r"]).apply(null, arguments)
};
var _getModelBufferMemoryOffset = Module["_getModelBufferMemoryOffset"] = function() {
return (_getModelBufferMemoryOffset = Module["_getModelBufferMemoryOffset"] = Module["asm"]["s"]).apply(null, arguments)
};
var _getInputMemoryOffset = Module["_getInputMemoryOffset"] = function() {
return (_getInputMemoryOffset = Module["_getInputMemoryOffset"] = Module["asm"]["t"]).apply(null, arguments)
};
var _getInputHeight = Module["_getInputHeight"] = function() {
return (_getInputHeight = Module["_getInputHeight"] = Module["asm"]["u"]).apply(null, arguments)
};
var _getInputWidth = Module["_getInputWidth"] = function() {
return (_getInputWidth = Module["_getInputWidth"] = Module["asm"]["v"]).apply(null, arguments)
};
var _getInputChannelCount = Module["_getInputChannelCount"] = function() {
return (_getInputChannelCount = Module["_getInputChannelCount"] = Module["asm"]["w"]).apply(null, arguments)
};
var _getOutputMemoryOffset = Module["_getOutputMemoryOffset"] = function() {
return (_getOutputMemoryOffset = Module["_getOutputMemoryOffset"] = Module["asm"]["x"]).apply(null, arguments)
};
var _getOutputHeight = Module["_getOutputHeight"] = function() {
return (_getOutputHeight = Module["_getOutputHeight"] = Module["asm"]["y"]).apply(null, arguments)
};
var _getOutputWidth = Module["_getOutputWidth"] = function() {
return (_getOutputWidth = Module["_getOutputWidth"] = Module["asm"]["z"]).apply(null, arguments)
};
var _getOutputChannelCount = Module["_getOutputChannelCount"] = function() {
return (_getOutputChannelCount = Module["_getOutputChannelCount"] = Module["asm"]["A"]).apply(null, arguments)
};
var _loadModel = Module["_loadModel"] = function() {
return (_loadModel = Module["_loadModel"] = Module["asm"]["B"]).apply(null, arguments)
};
var _runInference = Module["_runInference"] = function() {
return (_runInference = Module["_runInference"] = Module["asm"]["C"]).apply(null, arguments)
};
var ___errno_location = Module["___errno_location"] = function() {
return (___errno_location = Module["___errno_location"] = Module["asm"]["E"]).apply(null, arguments)
};
var calledRun;
function ExitStatus(status) {
this.name = "ExitStatus";
this.message = "Program terminated with exit(" + status + ")";
this.status = status
}
dependenciesFulfilled = function runCaller() {
if (!calledRun) run();
if (!calledRun) dependenciesFulfilled = runCaller
};
function run(args) {
args = args || arguments_;
if (runDependencies > 0) {
return
}
preRun();
if (runDependencies > 0) {
return
}
function doRun() {
if (calledRun) return;
calledRun = true;
Module["calledRun"] = true;
if (ABORT) return;
initRuntime();
preMain();
readyPromiseResolve(Module);
if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"]();
postRun()
}
if (Module["setStatus"]) {
Module["setStatus"]("Running...");
setTimeout(function() {
setTimeout(function() {
Module["setStatus"]("")
}, 1);
doRun()
}, 1)
} else {
doRun()
}
}
Module["run"] = run;
function exit(status, implicit) {
if (implicit && noExitRuntime && status === 0) {
return
}
if (noExitRuntime) {} else {
EXITSTATUS = status;
exitRuntime();
if (Module["onExit"]) Module["onExit"](status);
ABORT = true
}
quit_(status, new ExitStatus(status))
}
if (Module["preInit"]) {
if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]];
while (Module["preInit"].length > 0) {
Module["preInit"].pop()()
}
}
noExitRuntime = true;
run();
return createTFLiteSIMDModule.ready
}
);
})();
if (typeof exports === 'object' && typeof module === 'object')
module.exports = createTFLiteSIMDModule;
else if (typeof define === 'function' && define['amd'])
define([], function() {
return createTFLiteSIMDModule;
});
else if (typeof exports === 'object')
exports["createTFLiteSIMDModule"] = createTFLiteSIMDModule;

BIN
thirdparty/tflite/tflite-simd.wasm vendored Normal file

Binary file not shown.

BIN
thirdparty/tflite/tflite.wasm vendored Normal file

Binary file not shown.

View File

@ -2,11 +2,13 @@
"titles": {
"join-by-room-name-here": "Enter a room name to quick join",
"join-room": "Join room",
"load-the-next-guest-in-queue": "Load the next guest in queue",
"toggle-the-chat": "Toggle the Chat",
"mute-the-speaker": "Mute the Speaker",
"mute-the-mic": "Mute the Mic",
"disable-the-camera": "Disable the Camera",
"share-a-screen-with-others": "Share a Screen with others",
"create-a-secondary-stream": "Create a Secondary Stream",
"settings": "Settings",
"hangup-the-call": "Hangup the Call",
"alert-the-host-you-want-to-speak": "Alert the host you want to speak",
@ -15,12 +17,17 @@
"submit-any-error-logs": "Submit any error logs",
"show-help-info": "Show Help Info",
"language-options": "Language Options",
"add-to-calendar": "Add to Calendar",
"add-group-chat-to-obs": "Add Group Chat",
"for-large-group-rooms-this-option-can-reduce-the-load-on-remote-guests-substantially": "For large group rooms, this option can reduce the load on remote guests substantially",
"the-director-will-be-visible-in-scenes-as-if-a-performer-themselves-": "The director will be visible in scenes, as if a performer themselves.",
"useful-if-you-want-to-perform-and-direct-at-the-same-time": "Useful if you want to perform and direct at the same time",
"which-video-codec-would-you-want-used-by-default-": "Which video codec would you want used by default?",
"you-ll-enter-as-the-room-s-director": "You'll enter as the room's director",
"add-your-camera-to-obs": "Add your Camera",
"start-streaming": "start streaming",
"tip-hold-ctrl-command-to-select-multiple": "tip: Hold CTRL (command) to select Multiple",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"remote-screenshare-into-obs": "Remote Screenshare",
"create-reusable-invite": "Create Reusable Invite",
"ideal-for-1080p60-gaming-if-your-computer-and-upload-are-up-for-it": "Ideal for 1080p60 gaming, if your computer and upload are up for it",
@ -39,79 +46,72 @@
"creative-commons-by-3-0": "Creative Commons BY 3.0",
"youtube-video-demoing-how-to-do-this": "Youtube Video demoing how to do this",
"invite-a-guest-or-camera-source-to-publish-into-the-group-room": "Invite a guest or camera source to publish into the group room",
"if-enabled-the-invited-guest-will-not-be-able-to-see-or-hear-anyone-in-the-room-": "If enabled, the invited guest will not be able to see or hear anyone in the room.",
"use-this-link-in-the-obs-browser-source-to-capture-the-video-or-audio": "Use this link in the a Browser Source to capture the video or audio",
"if-enabled-you-must-manually-add-a-video-to-a-scene-for-it-to-appear-": "If enabled, you must manually add a video to a scene for it to appear.",
"if-disabled-the-invited-guest-will-not-be-able-to-see-or-hear-anyone-in-the-room-": "If disabled, the invited guest will not be able to see or hear anyone in the room.",
"use-this-link-in-the-obs-browser-source-to-capture-the-video-or-audio": "Use this link as a browser source in your Studio software to capture the video or audio",
"if-disabled-you-must-manually-add-a-video-to-a-scene-for-it-to-appear-": "If disabled, you must manually add a video to a scene for it to appear.",
"disables-echo-cancellation-and-improves-audio-quality": "Disables Echo Cancellation and improves audio quality",
"audio-only-sources-are-visually-hidden-from-scenes": "Audio-only sources are visually hidden from scenes",
"guest-will-be-prompted-to-enter-a-display-name": "Guest will be prompted to enter a Display Name",
"display-names-will-be-shown-in-the-bottom-left-corner-of-videos": "Display Names will be shown in the bottom-left corner of videos",
"guests-not-actively-speaking-will-be-hidden": "Guests not actively speaking will be hidden",
"request-1080p60-from-the-guest-instead-of-720p60-if-possible": "Request 1080p60 from the Guest instead of 720p60, if possible",
"the-default-microphone-will-be-pre-selected-for-the-guest": "The default microphone will be pre-selected for the guest",
"the-default-camera-device-will-selected-automatically": "The default camera device will selected automatically",
"the-guest-won-t-have-access-to-changing-camera-settings-or-screenshare": "The guest won't have access to changing camera settings or screenshare",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"increase-video-quality-that-guests-in-room-see-": "Increase video quality that guests in room see.",
"the-guest-will-not-see-their-own-self-preview-after-joining": "The guest will not see their own self-preview after joining",
"guests-will-have-an-option-to-poke-the-director-by-pressing-a-button": "Guests will have an option to poke the Director by pressing a button",
"add-an-audio-compressor-to-the-guest-s-microphone": "Add an audio compressor to the guest's microphone",
"add-an-equalizer-to-the-guest-s-microphone-that-the-director-can-control": "Add an Equalizer to the guest's microphone that the director can control",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-guest-can-only-see-the-director-s-video-if-provided": "The guest can only see the Director's video, if provided",
"the-guest-s-microphone-will-be-muted-on-joining-they-can-unmute-themselves-": "The guest's microphone will be muted on joining. They can unmute themselves.",
"the-guest-will-not-be-asked-for-a-video-device-on-connection": "The guest will not be asked for a video device on connection",
"have-the-guest-join-muted-so-only-the-director-can-unmute-the-guest-": "Have the guest join muted, so only the director can Unmute the guest.",
"make-the-invite-url-encoded-so-parameters-are-harder-to-tinker-with-by-guests": "Make the invite URL encoded, so parameters are harder to tinker with by guests",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"move-the-user-to-another-room-controlled-by-another-director": "Move the user to another room, controlled by another director",
"send-a-direct-message-to-this-user-": "Send a Direct Message to this user.",
"add-this-video-to-any-remote-scene-1-": "Add this Video to any remote '&scene=1'",
"remotely-mute-this-audio-in-all-remote-scene-views": "Remotely Mute this Audio in all remote '&scene' views",
"remotely-change-the-volume-of-this-guest": "Remotely change the volume of this guest",
"mute-this-guest-everywhere": "Mute this guest everywhere",
"disable-video-preview": "Disable Video Preview",
"low-quality-preview": "Low-Quality Preview",
"high-quality-preview": "High-Quality Preview",
"force-the-user-to-disconnect-they-can-always-reconnect-": "Force the user to Disconnect. They can always reconnect.",
"start-recording-this-remote-stream-to-this-local-drive-experimental-": "Start Recording this remote stream to this local drive. *experimental*'",
"the-remote-guest-will-record-their-local-stream-to-their-local-drive-experimental-": "The Remote Guest will record their local stream to their local drive. *experimental*",
"toggle-voice-chat-with-this-guest": "Toggle Voice Chat with this Guest",
"shift-this-video-down-in-order": "Shift this Video Down in Order",
"current-index-order-of-this-video": "Current Index Order of this Video",
"shift-this-video-up-in-order": "Shift this Video Up in Order",
"remote-audio-settings": "Remote Audio Settings",
"advanced-video-settings": "Advanced Video Settings",
"activate-or-reload-this-video-device-": "Activate or Reload this video device.",
"load-the-next-guest-in-queue": "Load the next guest in queue",
"create-a-secondary-stream": "Create a Secondary Stream",
"add-to-calendar": "Add to Calendar",
"the-director-will-be-visible-in-scenes-as-if-a-performer-themselves-": "The director will be visible in scenes, as if a performer themselves.",
"useful-if-you-want-to-perform-and-direct-at-the-same-time": "Useful if you want to perform and direct at the same time",
"start-streaming": "start streaming",
"if-disabled-the-invited-guest-will-not-be-able-to-see-or-hear-anyone-in-the-room-": "If disabled, the invited guest will not be able to see or hear anyone in the room.",
"if-disabled-you-must-manually-add-a-video-to-a-scene-for-it-to-appear-": "If disabled, you must manually add a video to a scene for it to appear.",
"guests-not-actively-speaking-will-be-hidden": "Guests not actively speaking will be hidden",
"increase-video-quality-that-guests-in-room-see-": "Increase video quality that guests in room see.",
"the-guest-will-not-be-asked-for-a-video-device-on-connection": "The guest will not be asked for a video device on connection",
"toggle-solo-voice-chat": "Toggle Solo Voice Chat",
"add-to-scene-2": "Add to Scene 2",
"add-this-video-to-any-remote-scene-1-": "Add this Video to any remote '&scene=1'",
"mute-this-guest-everywhere": "Mute this guest everywhere",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"remotely-mute-this-audio-in-all-remote-scene-views": "Remotely Mute this Audio in all remote '&scene' views",
"add-to-scene-3": "Add to Scene 3",
"add-to-scene-4": "Add to Scene 4",
"add-to-scene-5": "Add to Scene 5",
"add-to-scene-6": "Add to Scene 6",
"add-to-scene-7": "Add to Scene 7",
"add-to-scene-8": "Add to Scene 8",
"force-the-remote-sender-to-issue-a-keyframe-to-all-scenes-fixing-pixel-smearing-issues-": "Force the remote sender to issue a keyframe to all scenes, fixing Pixel Smearing issues.",
"request-the-statistics-of-this-video-in-any-active-scene": "Request the statistics of this video in any active scene",
"solo-this-video-everywhere": "Solo this video everywhere",
"hide-this-guest-everywhere": "Hide this guest everywhere",
"set-to-default-audio-channel": "Set to Default Audio Channel",
"toggle-the-remote-guest-s-speaker-output": "Toggle the remote guest's speaker output",
"toggle-the-remote-guest-s-display-output": "Toggle the remote guest's display output",
"shift-this-video-down-in-order": "Shift this Video Down in Order",
"current-index-order-of-this-video": "Current Index Order of this Video",
"shift-this-video-up-in-order": "Shift this Video Up in Order",
"remotely-reload-the-guest-s-page-with-a-new-url": "Remotely reload the guest's page with a new URL",
"change-user-parameters": "Change user parameters",
"start-recording-this-remote-stream-to-this-local-drive-experimental-": "Start Recording this remote stream to this local drive. *experimental*'",
"the-remote-guest-will-record-their-local-stream-to-their-local-drive-experimental-": "The Remote Guest will record their local stream to their local drive. *experimental*",
"remotely-change-the-volume-of-this-guest": "Remotely change the volume of this guest",
"disable-video-preview": "Disable Video Preview",
"low-quality-preview": "Low-Quality Preview",
"high-quality-preview": "High-Quality Preview",
"set-to-audio-channel-1": "Set to Audio Channel 1",
"set-to-audio-channel-2": "Set to Audio Channel 2",
"set-to-audio-channel-3": "Set to Audio Channel 3",
"set-to-audio-channel-4": "Set to Audio Channel 4",
"set-to-audio-channel-5": "Set to Audio Channel 5",
"toggle-the-remote-guest-s-speaker-output": "Toggle the remote guest's speaker output",
"toggle-the-remote-guest-s-display-output": "Toggle the remote guest's display output",
"set-to-audio-channel-6": "Set to Audio Channel 6",
"set-to-audio-channel-7": "Set to Audio Channel 7",
"set-to-audio-channel-8": "Set to Audio Channel 8",
"force-the-remote-sender-to-issue-a-keyframe-to-all-scenes-fixing-pixel-smearing-issues-": "Force the remote sender to issue a keyframe to all scenes, fixing Pixel Smearing issues.",
"remotely-reload-the-guest-s-page-with-a-new-url": "Remotely reload the guest's page with a new URL",
"change-user-parameters": "Change user parameters",
"solo-this-video-everywhere": "Solo this video everywhere",
"request-the-statistics-of-this-video-in-any-active-scene": "Request the statistics of this video in any active scene",
"remote-audio-settings": "Remote Audio Settings",
"advanced-video-settings": "Advanced Video Settings",
"add-to-scene-2": "Add to Scene 2",
"activate-or-reload-this-video-device-": "Activate or Reload this video device.",
"cannot-see-videos": "Cannot see videos",
"cannot-hear-others": "Cannot hear others",
"see-director-only": "See director only",
@ -122,8 +122,7 @@
"enable-custom-password": "Enable custom password"
},
"innerHTML": {
"logo-header": "<font id=\"qos\"></font>",
"copy-this-url": "Copy this URL into a \"Browser Source\"",
"copy-this-url": "Copy this URL into your studio's \"browser Source\"",
"you-are-in-the-control-center": "Control center for room:",
"joining-room": "You are in room",
"add-group-chat": "Create a Room",
@ -131,6 +130,7 @@
"room-name": "Room Name",
"password-input-field": "Password",
"guests-only-see-director": "Guests can only see the Director's Video",
"scenes-can-see-director": "Director will also be a performer",
"default-codec-select": "Preferred Video Codec: ",
"enter-the-rooms-control": "Enter the Room's Control Center",
"show-tips": "Show me some tips..",
@ -140,14 +140,20 @@
"ask-for-permissions": "Allow Access to Camera/Microphone",
"waiting-for-camera": "Waiting for Camera to Load",
"video-source": " Video Source ",
"max-resolution": "1080p (hi-def)",
"balanced": "720p (balanced)",
"smooth-cool": "360p (smooth)",
"max-resolution": "Max Resolution",
"balanced": "Balanced",
"smooth-cool": "Smooth and Cool",
"select-audio-source": " Audio Source(s) ",
"no-audio": "No Audio",
"select-output-source": " Audio Output Destination: ",
"select-digital-effect": " Digital Video Effects: ",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"add-a-password": " Add a Password:",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"remote-screenshare-obs": "Remote Screenshare",
"note-share-audio": "\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<video id=\"screenshare\" autoplay=\"true\" muted=\"true\" loop=\"\" src=\"./media/screenshare.webm\"></video>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t",
"select-screen-to-share": "SELECT SCREEN TO SHARE",
"audio-sources": "Audio Sources",
"create-reusable-invite": "Create Reusable Invite",
@ -169,63 +175,100 @@
"can-hear-only": "Can only hear the group chat",
"cant-see-or-hear": "Cannot hear or see the group chat",
"share-local-video-file": "Stream Media File",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"share-website-iframe": "Share Website",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"run-a-speed-test": "Run a Speed Test",
"read-the-guides": "Browse the Guides",
"info-blob": "",
"hide-the-links": " LINKS (GUEST INVITES &amp; SCENES)",
"click-for-quick-room-overview": "\n\t\t\t\t\t\t<i class=\"las la-question-circle\"></i> Click Here for a quick overview and help\n\t\t\t\t\t",
"welcome-to-control-room": "\n\t\t\t\t\t\t<b>Welcome. This is the director's control-room for the group-chat.</b><br><br>\n\t\t\t\t\t\tYou can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.\n\t\t\t\t\t\t<br><br>\n\t\t\t\t\t\t",
"click-for-quick-room-overview": "\n\t\t\t\t\t\t<i class=\"las la-question-circle\"></i> <span data-translate=\"click-here-for-help\">Click Here for a quick overview and help</span>\n\t\t\t\t\t",
"click-here-for-help": "Click Here for a quick overview and help",
"welcome-to-control-room": "\n\t\t\t\t\t\t<b>Welcome. This is the director's control-room for the group-chat.</b><br><br>\n\t\t\t\t\t\tYou can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.\n\t\t\t\t\t\t<br><br>\n\t\t\t\t\t\t<font style=\"color:red\">Known Limitations with Group Rooms:</font><br>\n\t\t\t\t\t\t<li>A group room can handle up to around 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<li>Videos will appear of low quality on purpose for guests and director; this is to save bandwidth and CPU resources.",
"invite-users-to-join": "Guests can use the link to join the group room",
"this-is-obs-browser-source-link": "Use in studio software to capture the group video mix",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"this-is-obs-browser-source-link": "Use in your studio software to capture the group video mix",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"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",
"add-to-scene": "Add to Scene",
"mute-scene": "mute in scene",
"mute-guest": "mute guest",
"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>",
"disconnect-guest": "Hangup",
"record-local": " Record Local",
"record-remote": " Record Remote",
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"order-down": "<i class=\"las la-minus\"></i>",
"order-up": "<i class=\"las la-plus\"></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",
"open-in-new-tab": "Open in new Tab",
"copy-to-clipboard": "Copy to Clipboard",
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome! You can send text messages directly to connected peers from here.\n\t\t\t\t",
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
"send-chat": "Send",
"available-languages": "Available Languages:",
"add-more-here": "Add More Here!",
"scenes-can-see-director": "Director will also be a performer",
"select-digital-effect": " Digital Video Effects: ",
"add-a-password": " Add a Password:",
"voice-chat": "<i class=\"las la-microphone\" style=\"color:#090\"></i> Solo Talk",
"add-to-scene": "add to scene 1",
"mute-guest": "mute guest",
"More-scene-options": "More scene options",
"mute-scene": "mute in scene",
"force-keyframe": "Rainbow Puke Fix",
"stats-remote": " Scene Stats",
"additional-controls": "Additional controls",
"solo-video": "Highlight guest",
"hide-guest": "hide guest",
"toggle-remote-speaker": "Deafen Guest",
"toggle-remote-display": "Blind Guest",
"force-keyframe": "Rainbow Puke",
"order-down": "<i class=\"las la-minus\"></i>",
"order-up": "<i class=\"las la-plus\"></i>",
"change-url": "Change URL",
"change-params": "URL Params",
"solo-video": "Highlight guest",
"stats-remote": " Scene Stats",
"record-local": " Record",
"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",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"open-in-new-tab": "Open in new Tab",
"copy-to-clipboard": "Copy to Clipboard",
"send-chat": "Send",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"invisible-guests": "Not Visible",
"available-languages": "Available Languages:",
"add-more-here": "Add More Here!",
"add-to-calendar": "Add details to your Calendar:",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",
"enter-a-room-name-here": "Enter a Room Name here",
"optional-room-password-here": "Optional room password here",
"optional": "optional",
"give-this-media-source-a-name-optional-": "Give this media source a name (optional)",
"add-an-optional-password": "Add an optional password",
"enter-room-name-here": "Enter Room name here",
"enter-chat-message-to-send-here": "Enter chat message to send here",
"optional": "optional",
"enter-the-room-name-here": "Enter the room name here",
"enter-the-room-password-here": "Enter the room password here"
}

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Raise hand button",
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password"
"enable-custom-password": "Enable custom password",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -235,7 +241,54 @@
"stats-remote": " Scene Stats",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"add-to-calendar": "Add details to your Calendar:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Připojit se s názvem místnosti zde",

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Raise hand button",
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password"
"enable-custom-password": "Enable custom password",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS Ninja",
@ -235,7 +241,54 @@
"stats-remote": " Scene Stats",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"add-to-calendar": "Add details to your Calendar:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Raum über Namen betreten",

View File

@ -2,11 +2,13 @@
"titles": {
"join-by-room-name-here": "Enter a room name to quick join",
"join-room": "Join room",
"load-the-next-guest-in-queue": "Load the next guest in queue",
"toggle-the-chat": "Toggle the Chat",
"mute-the-speaker": "Mute the Speaker",
"mute-the-mic": "Mute the Mic",
"disable-the-camera": "Disable the Camera",
"share-a-screen-with-others": "Share a Screen with others",
"create-a-secondary-stream": "Create a Secondary Stream",
"settings": "Settings",
"hangup-the-call": "Hangup the Call",
"alert-the-host-you-want-to-speak": "Alert the host you want to speak",
@ -15,13 +17,18 @@
"submit-any-error-logs": "Submit any error logs",
"show-help-info": "Show Help Info",
"language-options": "Language Options",
"add-group-chat-to-obs": "Add Group Chat to OBS",
"add-to-calendar": "Add to Calendar",
"add-group-chat-to-obs": "Add Group Chat",
"for-large-group-rooms-this-option-can-reduce-the-load-on-remote-guests-substantially": "For large group rooms, this option can reduce the load on remote guests substantially",
"the-director-will-be-visible-in-scenes-as-if-a-performer-themselves-": "The director will be visible in scenes, as if a performer themselves.",
"useful-if-you-want-to-perform-and-direct-at-the-same-time": "Useful if you want to perform and direct at the same time",
"which-video-codec-would-you-want-used-by-default-": "Which video codec would you want used by default?",
"you-ll-enter-as-the-room-s-director": "You'll enter as the room's director",
"add-your-camera-to-obs": "Add your Camera to OBS",
"add-your-camera-to-obs": "Add your Camera",
"start-streaming": "start streaming",
"tip-hold-ctrl-command-to-select-multiple": "tip: Hold CTRL (command) to select Multiple",
"remote-screenshare-into-obs": "Remote Screenshare into OBS",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"remote-screenshare-into-obs": "Remote Screenshare",
"create-reusable-invite": "Create Reusable Invite",
"ideal-for-1080p60-gaming-if-your-computer-and-upload-are-up-for-it": "Ideal for 1080p60 gaming, if your computer and upload are up for it",
"better-video-compression-and-quality-at-the-cost-of-increased-cpu-encoding-load": "Better video compression and quality at the cost of increased CPU encoding load",
@ -39,79 +46,72 @@
"creative-commons-by-3-0": "Creative Commons BY 3.0",
"youtube-video-demoing-how-to-do-this": "Youtube Video demoing how to do this",
"invite-a-guest-or-camera-source-to-publish-into-the-group-room": "Invite a guest or camera source to publish into the group room",
"if-enabled-the-invited-guest-will-not-be-able-to-see-or-hear-anyone-in-the-room-": "If enabled, the invited guest will not be able to see or hear anyone in the room.",
"use-this-link-in-the-obs-browser-source-to-capture-the-video-or-audio": "Use this link in the OBS Browser Source to capture the video or audio",
"if-enabled-you-must-manually-add-a-video-to-a-scene-for-it-to-appear-": "If enabled, you must manually add a video to a scene for it to appear.",
"if-disabled-the-invited-guest-will-not-be-able-to-see-or-hear-anyone-in-the-room-": "If disabled, the invited guest will not be able to see or hear anyone in the room.",
"use-this-link-in-the-obs-browser-source-to-capture-the-video-or-audio": "Use this link as a browser source in your Studio software to capture the video or audio",
"if-disabled-you-must-manually-add-a-video-to-a-scene-for-it-to-appear-": "If disabled, you must manually add a video to a scene for it to appear.",
"disables-echo-cancellation-and-improves-audio-quality": "Disables Echo Cancellation and improves audio quality",
"audio-only-sources-are-visually-hidden-from-scenes": "Audio-only sources are visually hidden from scenes",
"guest-will-be-prompted-to-enter-a-display-name": "Guest will be prompted to enter a Display Name",
"display-names-will-be-shown-in-the-bottom-left-corner-of-videos": "Display Names will be shown in the bottom-left corner of videos",
"guests-not-actively-speaking-will-be-hidden": "Guests not actively speaking will be hidden",
"request-1080p60-from-the-guest-instead-of-720p60-if-possible": "Request 1080p60 from the Guest instead of 720p60, if possible",
"the-default-microphone-will-be-pre-selected-for-the-guest": "The default microphone will be pre-selected for the guest",
"the-default-camera-device-will-selected-automatically": "The default camera device will selected automatically",
"the-guest-won-t-have-access-to-changing-camera-settings-or-screenshare": "The guest won't have access to changing camera settings or screenshare",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"increase-video-quality-that-guests-in-room-see-": "Increase video quality that guests in room see.",
"the-guest-will-not-see-their-own-self-preview-after-joining": "The guest will not see their own self-preview after joining",
"guests-will-have-an-option-to-poke-the-director-by-pressing-a-button": "Guests will have an option to poke the Director by pressing a button",
"add-an-audio-compressor-to-the-guest-s-microphone": "Add an audio compressor to the guest's microphone",
"add-an-equalizer-to-the-guest-s-microphone-that-the-director-can-control": "Add an Equalizer to the guest's microphone that the director can control",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-guest-can-only-see-the-director-s-video-if-provided": "The guest can only see the Director's video, if provided",
"the-guest-s-microphone-will-be-muted-on-joining-they-can-unmute-themselves-": "The guest's microphone will be muted on joining. They can unmute themselves.",
"the-guest-will-not-be-asked-for-a-video-device-on-connection": "The guest will not be asked for a video device on connection",
"have-the-guest-join-muted-so-only-the-director-can-unmute-the-guest-": "Have the guest join muted, so only the director can Unmute the guest.",
"make-the-invite-url-encoded-so-parameters-are-harder-to-tinker-with-by-guests": "Make the invite URL encoded, so parameters are harder to tinker with by guests",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"move-the-user-to-another-room-controlled-by-another-director": "Move the user to another room, controlled by another director",
"send-a-direct-message-to-this-user-": "Send a Direct Message to this user.",
"add-this-video-to-any-remote-scene-1-": "Add this Video to any remote '&scene=1'",
"remotely-mute-this-audio-in-all-remote-scene-views": "Remotely Mute this Audio in all remote '&scene' views",
"remotely-change-the-volume-of-this-guest": "Remotely change the volume of this guest",
"mute-this-guest-everywhere": "Mute this guest everywhere",
"disable-video-preview": "Disable Video Preview",
"low-quality-preview": "Low-Quality Preview",
"high-quality-preview": "High-Quality Preview",
"force-the-user-to-disconnect-they-can-always-reconnect-": "Force the user to Disconnect. They can always reconnect.",
"start-recording-this-remote-stream-to-this-local-drive-experimental-": "Start Recording this remote stream to this local drive. *experimental*'",
"the-remote-guest-will-record-their-local-stream-to-their-local-drive-experimental-": "The Remote Guest will record their local stream to their local drive. *experimental*",
"toggle-voice-chat-with-this-guest": "Toggle Voice Chat with this Guest",
"shift-this-video-down-in-order": "Shift this Video Down in Order",
"current-index-order-of-this-video": "Current Index Order of this Video",
"shift-this-video-up-in-order": "Shift this Video Up in Order",
"remote-audio-settings": "Remote Audio Settings",
"advanced-video-settings": "Advanced Video Settings",
"activate-or-reload-this-video-device-": "Activate or Reload this video device.",
"load-the-next-guest-in-queue": "Load the next guest in queue",
"create-a-secondary-stream": "Create a Secondary Stream",
"add-to-calendar": "Add to Calendar",
"the-director-will-be-visible-in-scenes-as-if-a-performer-themselves-": "The director will be visible in scenes, as if a performer themselves.",
"useful-if-you-want-to-perform-and-direct-at-the-same-time": "Useful if you want to perform and direct at the same time",
"start-streaming": "start streaming",
"if-disabled-the-invited-guest-will-not-be-able-to-see-or-hear-anyone-in-the-room-": "If disabled, the invited guest will not be able to see or hear anyone in the room.",
"if-disabled-you-must-manually-add-a-video-to-a-scene-for-it-to-appear-": "If disabled, you must manually add a video to a scene for it to appear.",
"guests-not-actively-speaking-will-be-hidden": "Guests not actively speaking will be hidden",
"increase-video-quality-that-guests-in-room-see-": "Increase video quality that guests in room see.",
"the-guest-will-not-be-asked-for-a-video-device-on-connection": "The guest will not be asked for a video device on connection",
"toggle-solo-voice-chat": "Toggle Solo Voice Chat",
"add-to-scene-2": "Add to Scene 2",
"add-this-video-to-any-remote-scene-1-": "Add this Video to any remote '&scene=1'",
"mute-this-guest-everywhere": "Mute this guest everywhere",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"remotely-mute-this-audio-in-all-remote-scene-views": "Remotely Mute this Audio in all remote '&scene' views",
"add-to-scene-3": "Add to Scene 3",
"add-to-scene-4": "Add to Scene 4",
"add-to-scene-5": "Add to Scene 5",
"add-to-scene-6": "Add to Scene 6",
"add-to-scene-7": "Add to Scene 7",
"add-to-scene-8": "Add to Scene 8",
"force-the-remote-sender-to-issue-a-keyframe-to-all-scenes-fixing-pixel-smearing-issues-": "Force the remote sender to issue a keyframe to all scenes, fixing Pixel Smearing issues.",
"request-the-statistics-of-this-video-in-any-active-scene": "Request the statistics of this video in any active scene",
"solo-this-video-everywhere": "Solo this video everywhere",
"hide-this-guest-everywhere": "Hide this guest everywhere",
"set-to-default-audio-channel": "Set to Default Audio Channel",
"toggle-the-remote-guest-s-speaker-output": "Toggle the remote guest's speaker output",
"toggle-the-remote-guest-s-display-output": "Toggle the remote guest's display output",
"shift-this-video-down-in-order": "Shift this Video Down in Order",
"current-index-order-of-this-video": "Current Index Order of this Video",
"shift-this-video-up-in-order": "Shift this Video Up in Order",
"remotely-reload-the-guest-s-page-with-a-new-url": "Remotely reload the guest's page with a new URL",
"change-user-parameters": "Change user parameters",
"start-recording-this-remote-stream-to-this-local-drive-experimental-": "Start Recording this remote stream to this local drive. *experimental*'",
"the-remote-guest-will-record-their-local-stream-to-their-local-drive-experimental-": "The Remote Guest will record their local stream to their local drive. *experimental*",
"remotely-change-the-volume-of-this-guest": "Remotely change the volume of this guest",
"disable-video-preview": "Disable Video Preview",
"low-quality-preview": "Low-Quality Preview",
"high-quality-preview": "High-Quality Preview",
"set-to-audio-channel-1": "Set to Audio Channel 1",
"set-to-audio-channel-2": "Set to Audio Channel 2",
"set-to-audio-channel-3": "Set to Audio Channel 3",
"set-to-audio-channel-4": "Set to Audio Channel 4",
"set-to-audio-channel-5": "Set to Audio Channel 5",
"toggle-the-remote-guest-s-speaker-output": "Toggle the remote guest's speaker output",
"toggle-the-remote-guest-s-display-output": "Toggle the remote guest's display output",
"set-to-audio-channel-6": "Set to Audio Channel 6",
"set-to-audio-channel-7": "Set to Audio Channel 7",
"set-to-audio-channel-8": "Set to Audio Channel 8",
"force-the-remote-sender-to-issue-a-keyframe-to-all-scenes-fixing-pixel-smearing-issues-": "Force the remote sender to issue a keyframe to all scenes, fixing Pixel Smearing issues.",
"remotely-reload-the-guest-s-page-with-a-new-url": "Remotely reload the guest's page with a new URL",
"change-user-parameters": "Change user parameters",
"solo-this-video-everywhere": "Solo this video everywhere",
"request-the-statistics-of-this-video-in-any-active-scene": "Request the statistics of this video in any active scene",
"remote-audio-settings": "Remote Audio Settings",
"advanced-video-settings": "Advanced Video Settings",
"add-to-scene-2": "Add to Scene 2",
"activate-or-reload-this-video-device-": "Activate or Reload this video device.",
"cannot-see-videos": "Cannot see videos",
"cannot-hear-others": "Cannot hear others",
"see-director-only": "See director only",
@ -122,8 +122,7 @@
"enable-custom-password": "Enable custom password"
},
"innerHTML": {
"logo-header": "\n\t\t\t\t\t<font id=\"qos\">O</font>BS.Ninja \n\t\t\t\t",
"copy-this-url": "Copy this URL into an OBS \"Browser Source\"",
"copy-this-url": "Copy this URL into your studio's \"browser Source\"",
"you-are-in-the-control-center": "Control center for room:",
"joining-room": "You are in room",
"add-group-chat": "Create a Room",
@ -131,23 +130,30 @@
"room-name": "Room Name",
"password-input-field": "Password",
"guests-only-see-director": "Guests can only see the Director's Video",
"scenes-can-see-director": "Director will also be a performer",
"default-codec-select": "Preferred Video Codec: ",
"enter-the-rooms-control": "Enter the Room's Control Center",
"show-tips": "Show me some tips..",
"added-notes": "\n\t\t\t\t\t\t\t\t<u>\n\t\t\t\t\t\t\t\t\t<i>Important Tips:</i><br><br>\n\t\t\t\t\t\t\t\t</u>\n\t\t\t\t\t\t\t\t<li>Disabling video sharing between guests will improve performance</li>\n\t\t\t\t\t\t\t\t<li>Invite only guests to the room that you trust.</li>\n\t\t\t\t\t\t\t\t<li>The \"Recording\" option is considered experimental.</li>\n\t\t\t\t\t\t\t\t<li><a href=\"https://params.obs.ninja\" style=\"color:black;\"><u>Advanced URL parameters</u></a> are available to customize rooms.</li>\n\t\t\t\t\t\t\t",
"added-notes": "\n\t\t\t\t\t\t\t\t<u>\n\t\t\t\t\t\t\t\t\t<i>Important Tips:</i><br><br>\n\t\t\t\t\t\t\t\t</u>\n\t\t\t\t\t\t\t\t<li>Disabling video sharing between guests will improve performance</li>\n\t\t\t\t\t\t\t\t<li>Invite only guests to the room that you trust.</li>\n\t\t\t\t\t\t\t\t<li>The \"Recording\" option is considered experimental.</li>",
"back": "Back",
"add-your-camera": "Add your Camera to OBS",
"add-your-camera": "Add your Camera",
"ask-for-permissions": "Allow Access to Camera/Microphone",
"waiting-for-camera": "Waiting for Camera to Load",
"video-source": " Video Source ",
"max-resolution": "1080p (hi-def)",
"balanced": "720p (balanced)",
"smooth-cool": "360p (smooth)",
"max-resolution": "Max Resolution",
"balanced": "Balanced",
"smooth-cool": "Smooth and Cool",
"select-audio-source": " Audio Source(s) ",
"no-audio": "No Audio",
"select-output-source": " Audio Output Destination: ",
"remote-screenshare-obs": "Remote Screenshare into OBS",
"note-share-audio": "\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<video id=\"screenshare\" autoplay=\"true\" muted=\"true\" loop=\"\" src=\"./images/screenshare.webm\"></video>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t",
"select-digital-effect": " Digital Video Effects: ",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"add-a-password": " Add a Password:",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"remote-screenshare-obs": "Remote Screenshare",
"select-screen-to-share": "SELECT SCREEN TO SHARE",
"audio-sources": "Audio Sources",
"create-reusable-invite": "Create Reusable Invite",
@ -169,63 +175,100 @@
"can-hear-only": "Can only hear the group chat",
"cant-see-or-hear": "Cannot hear or see the group chat",
"share-local-video-file": "Stream Media File",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"share-website-iframe": "Share Website",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"run-a-speed-test": "Run a Speed Test",
"read-the-guides": "Browse the Guides",
"info-blob": "\n\t\t\t\t\t\t\t<h2>What is OBS.Ninja</h2>\n\t\t\t\t\t\t\t<br>\n\t\t\t\t\t\t\t<li>100% \n\t\t\t\t\t\t\t\t<b>free</b>; no downloads; no personal data collection; no sign-in\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>Bring video from your smartphone, computer, or friends directly into your OBS video stream</li>\n\t\t\t\t\t\t\t<li>We use cutting edge Peer-to-Peer forwarding technology that offers privacy and ultra-low latency</li>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t",
"info-blob": "",
"hide-the-links": " LINKS (GUEST INVITES &amp; SCENES)",
"click-for-quick-room-overview": "\n\t\t\t\t\t\t<i class=\"las la-question-circle\"></i> Click Here for a quick overview and help\n\t\t\t\t\t",
"welcome-to-control-room": "\n\t\t\t\t\t\t<b>Welcome. This is the director's control-room for the group-chat.</b><br><br>\n\t\t\t\t\t\tYou can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.\n\t\t\t\t\t\t<br><br>\n\t\t\t\t\t\t<font style=\"color:red\">Known Limitations with Group Rooms:</font><br>\n\t\t\t\t\t\t<li>A group room can handle up to around 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room. To achieve more than around 7-guests though, you will likely want to <a href=\"https://www.youtube.com/watch?v=bpRa8-UYCGc\" title=\"Youtube Video demoing how to do this\">disable video sharing between guests</a>. Using &amp;broadcast, &amp;roombitrate=0 or &amp;novideo are options there.</li>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<li>Videos will appear of low quality on purpose for guests and director; this is to save bandwidth and CPU resources. It will be high-quality within OBS still though.</li>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<li>The state of the scenes, such as which videos are active in a scene, are lost when the director resets the control-room or the scene.</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\tFurther Notes:<br><br>\n\t\t\t\t\t\t<li>Links to Solo-views of each guest video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\n\t\t\t\t\t\t<li>You can use the auto-mixing Group Scenes, the green links, to auto arrange multiple videos for you in OBS.</li>\n\t\t\t\t\t\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\n\t\t\t\t\t\t<li>If you transfer a guest from one room to another, they won't know which room they have been transferred to.</li>\n\t\t\t\t\t\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps. Setting higher bitrates will improve motion.</li>\n\t\t\t\t\t\t<li>VP8 is typically the default video codec, but using &amp;codec=vp9 or &amp;codec=h264 as a URL in OBS can help to reduce corrupted video puke issues.</li>\n\t\t\t\t\t\t<li>&amp;stereo=2 can be added to guests to turn off audio effects, such as echo cancellation and noise-reduction.</li>\n\t\t\t\t\t\t<li>https://invite.cam is a free service provided that can help obfuscuate the URL parameters of an invite link given to guests.</li>\n\t\t\t\t\t\t<li>Adding &amp;showonly=SOME_OBS_VIRTUALCAM to the guest invite links allows for only a single video to be seen by the guests; this can be output of the OBS Virtual Camera for example</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t\n\t\t\t\t\t\tFor advanced URL options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Advanced-Settings\">see the Wiki.</a>\n\t\t\t\t\t",
"click-for-quick-room-overview": "\n\t\t\t\t\t\t<i class=\"las la-question-circle\"></i> <span data-translate=\"click-here-for-help\">Click Here for a quick overview and help</span>\n\t\t\t\t\t",
"click-here-for-help": "Click Here for a quick overview and help",
"welcome-to-control-room": "\n\t\t\t\t\t\t<b>Welcome. This is the director's control-room for the group-chat.</b><br><br>\n\t\t\t\t\t\tYou can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.\n\t\t\t\t\t\t<br><br>\n\t\t\t\t\t\t<font style=\"color:red\">Known Limitations with Group Rooms:</font><br>\n\t\t\t\t\t\t<li>A group room can handle up to around 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<li>Videos will appear of low quality on purpose for guests and director; this is to save bandwidth and CPU resources.",
"invite-users-to-join": "Guests can use the link to join the group room",
"this-is-obs-browser-source-link": "Use in OBS or other studio software to capture the group video mix",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"this-is-obs-browser-source-link": "Use in your studio software to capture the group video mix",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"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",
"add-to-scene": "Add to Scene",
"mute-scene": "mute in scene",
"mute-guest": "mute guest",
"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>",
"disconnect-guest": "Hangup",
"record-local": " Record Local",
"record-remote": " Record Remote",
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"order-down": "<i class=\"las la-minus\"></i>",
"order-up": "<i class=\"las la-plus\"></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",
"open-in-new-tab": "Open in new Tab",
"copy-to-clipboard": "Copy to Clipboard",
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome to OBS.Ninja! You can send text messages directly to connected peers from here.\n\t\t\t\t",
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
"send-chat": "Send",
"available-languages": "Available Languages:",
"add-more-here": "Add More Here!",
"scenes-can-see-director": "Director will also be a performer",
"select-digital-effect": " Digital Video Effects: ",
"add-a-password": " Add a Password:",
"voice-chat": "<i class=\"las la-microphone\" style=\"color:#090\"></i> Solo Talk",
"add-to-scene": "add to scene 1",
"mute-guest": "mute guest",
"More-scene-options": "More scene options",
"mute-scene": "mute in scene",
"force-keyframe": "Rainbow Puke Fix",
"stats-remote": " Scene Stats",
"additional-controls": "Additional controls",
"solo-video": "Highlight guest",
"hide-guest": "hide guest",
"toggle-remote-speaker": "Deafen Guest",
"toggle-remote-display": "Blind Guest",
"force-keyframe": "Rainbow Puke",
"order-down": "<i class=\"las la-minus\"></i>",
"order-up": "<i class=\"las la-plus\"></i>",
"change-url": "Change URL",
"change-params": "URL Params",
"solo-video": "Highlight guest",
"stats-remote": " Scene Stats",
"record-local": " Record",
"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",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"open-in-new-tab": "Open in new Tab",
"copy-to-clipboard": "Copy to Clipboard",
"send-chat": "Send",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"invisible-guests": "Not Visible",
"available-languages": "Available Languages:",
"add-more-here": "Add More Here!",
"add-to-calendar": "Add details to your Calendar:",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",
"enter-a-room-name-here": "Enter a Room Name here",
"optional-room-password-here": "Optional room password here",
"optional": "optional",
"give-this-media-source-a-name-optional-": "Give this media source a name (optional)",
"add-an-optional-password": "Add an optional password",
"enter-room-name-here": "Enter Room name here",
"enter-chat-message-to-send-here": "Enter chat message to send here",
"optional": "optional",
"enter-the-room-name-here": "Enter the room name here",
"enter-the-room-password-here": "Enter the room password here"
}

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Raise hand button",
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password"
"enable-custom-password": "Enable custom password",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -235,7 +241,54 @@
"stats-remote": " Scene Stats",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"add-to-calendar": "Add details to your Calendar:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Raise hand button",
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password"
"enable-custom-password": "Enable custom password",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -235,7 +241,54 @@
"stats-remote": " Scene Stats",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"add-to-calendar": "Add details to your Calendar:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Rejoindre via le nom de salle ici",

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Raise hand button",
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password"
"enable-custom-password": "Enable custom password",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -235,7 +241,54 @@
"stats-remote": " Scene Stats",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"add-to-calendar": "Add details to your Calendar:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Raise hand button",
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password"
"enable-custom-password": "Enable custom password",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -235,7 +241,54 @@
"stats-remote": " Scene Stats",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"add-to-calendar": "Add details to your Calendar:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Raise hand button",
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password"
"enable-custom-password": "Enable custom password",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS Ninja",
@ -235,7 +241,54 @@
"stats-remote": " Scene Stats",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"add-to-calendar": "Add details to your Calendar:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Ga binnen met een kamer naam",

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Raise hand button",
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password"
"enable-custom-password": "Enable custom password",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS Ninja - Pig Latin",
@ -235,7 +241,54 @@
"stats-remote": " Scene Stats",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"add-to-calendar": "Add details to your Calendar:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Erehay ouyay ancay epray-enerategay",

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Botão de levantar a mão",
"show-labels": "Mostrar identificadores",
"transfer-to-a-new-room": "Transferir para uma nova Sala",
"enable-custom-password": "Ativar password personalizada"
"enable-custom-password": "Ativar password personalizada",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -235,7 +241,54 @@
"stats-remote": " Estatísticas da Cena",
"apply-new-guest-settings": "Aplicar definições",
"cancel": "Cancelar",
"add-to-calendar": "Adicionar detalhes ao seu calendário:"
"add-to-calendar": "Adicionar detalhes ao seu calendário:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Introduza aqui numa sala pelo seu nome",

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Raise hand button",
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password"
"enable-custom-password": "Enable custom password",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja (RU)",
@ -235,7 +241,54 @@
"stats-remote": " Scene Stats",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"add-to-calendar": "Add details to your Calendar:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -127,7 +127,13 @@
"raise-hand-button": "Raise hand button",
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password"
"enable-custom-password": "Enable custom password",
"improve-performance-and-quality-with-this-tip": "Improve performance and quality with this tip",
"allow-the-guests-to-pick-a-virtual-backscreen-effect": "Allow the guests to pick a virtual backscreen effect",
"this-low-fi-video-codec-uses-very-little-cpu-even-with-dozens-of-active-viewers-": "This low-fi video codec uses very little CPU, even with dozens of active viewers.",
"the-active-speakers-are-made-visible-automatically": "The active speakers are made visible automatically",
"add-this-video-to-any-remote-scene-2-": "Add this Video to any remote '&scene=2'",
"add-to-scene-8": "Add to Scene 8"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -235,7 +241,54 @@
"stats-remote": " Scene Stats",
"apply-new-guest-settings": "Apply settings",
"cancel": "Cancel",
"add-to-calendar": "Add details to your Calendar:"
"add-to-calendar": "Add details to your Calendar:",
"no-effects-applied": "No effects applied",
"blurred-background": "Blurred background",
"digital-greenscreen": "Digital greenscreen",
"virtual-background": "Virtual background",
"use-chrome-instead": "Consider using a Chromium-based browser instead.<br>\n \t\t\t\t\t\tSafari is more prone to having audio issues",
"select-the-video-files-to-share": "SELECT THE VIDEO FILES TO SHARE",
"enter-the-website-URL-you-wish-to-share": "Enter the URL website you wish to share.",
"click-here-for-help": "Click Here for a quick overview and help",
"guests-hear-others": "Guests hear others",
"capture-a-group-scene": "CAPTURE A GROUP SCENE",
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
"auto-select-microphone": "Auto-select default microphone",
"auto-select-camera": "Auto-select default camera",
"hide-setting-buttons": "Hide settings button",
"mini-self-preview": "Mini self-preview",
"virtual-backgrounds": "Virtual backgrounds",
"powerful-computers-only": "Only use with powerful computers and small groups!!",
"guests-see-HD-video": "Guests see HD video",
"no-self-preview": "Disable self-preview",
"raise-hand-button": "Display 'raise-hand' button",
"enable-compressor": "Enable audio compressor",
"enable-equalizer": "Enable equalizer as option",
"low-cpu=broadcast-codec": "Low-CPU broadcast codec",
"only-see-director-feed": "Only see the director's feed",
"mute-microphone-by-default": "Mute microphone by default",
"guest-joins-with-no-camera": "Guest joins with no camera",
"unmute-by-director-only": "Unmute by director only",
"obfuscate-link": "Obfuscate link and parameters",
"this-can-reduce-packet-loss": "This can reduce video corruption caused by packet loss",
"use-h264-codec": "Use H264 codec",
"show-active-speakers": "Show active speakers",
"force-mono-audio": "Force mono audio",
"learn-more-about-params": "Learn more about URL parameters at ",
"More-scene-options": "More scene options",
"additional-controls": "Additional controls",
"select-local-image": "Select Local Image",
"close-settings": "Close Settings",
"advanced": "Advanced ",
"invisible-guests": "Not Visible",
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

File diff suppressed because one or more lines are too long