Add files via upload

This commit is contained in:
Steve Seguin 2021-07-21 22:25:26 -04:00 committed by GitHub
parent 51fb3137a2
commit ad4d5585b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 1536 additions and 528 deletions

View File

@ -1,235 +1,235 @@
<head>
<link rel="stylesheet" href="./main.css?ver=40" />
<style>
.container {
max-width: 80%;
width: fit-content;
margin: 0 auto;
}
h1 {
margin-top: 1em;
margin-bottom: 1em;
padding: 10px;
}
.card {
margin: 10px;
box-shadow: 0 4px 8px 0 rgb(0 0 0 / 10%);
background-color: #ddd;
color: black;
margin-bottom: 1.5em;
}
.card>div {
padding: 10px;
}
.card h2 {
font-size: 1.5em;
padding: 10px;
background-color: #457b9d;
color: white;
border-bottom: 2px solid #3b6a87;
}
small {
font-style: italic;
display: block;
margin-left: 1em;
}
span.warning {
color: rgb(212, 191, 0);
}
input {
padding: 10px;
}
video {
max-width: 640px;
max-height: 360px;
padding: 20px;
}
audio {
max-width: 640px;
max-height: 360px;
padding: 20px;
}
div#processing {
display: none;
justify-content: center;
place-items: center;
position: absolute;
inset: 0;
font-size: 1.5em;
font-weight: bold;
background: #141926;
flex-direction: column;
}
</style>
</head>
<body style='color:white'>
<div id="header">
<a id="logoname" href="./" style="text-decoration: none; color: white; margin: 2px">
<span data-translate="logo-header">
<font id="qos">V</font>DO.Ninja
</span>
</a>
</div>
<div class="container">
<div id="info">
<h1>Web-based Media Conversion Tools</h1>
<div class="card">
<h2>WebM to MP4 (fixed 1280x720 resolution) <span class='warning'>(very slow!)</span></h2>
<div>
<small>The same as: fmpeg -i input.webm -vf scale=1280:720 output.mp4</small>
<input type="file" id="uploader" title="Convert WebM to MP4">
</div>
</div>
<div class="card">
<h2>MKV to MP4 (no transcoding)</h2>
<div>
<small>The same as: fmpeg -i INPUTFILE -vcodec copy -acodec copy output.mp4</small>
<input type="file" id="uploader2" accept=".mkv" title="Convert MKV to MP4">
</div>
</div>
<div class="card">
<h2>WebM MP4 files (no transcoding, attempts to force high resolutions)</h2>
<div>
<input type="file" id="uploader3" accept=".webm" title="Convert WebM to MP4">
</div>
</div>
<div class="card">
<h2>WebM to Audio-only files (opus or wav)</h2>
<div>
<input type="file" id="uploader4" accept=".webm" title="Convert WebM to OPUS">
</div>
</div>
<div id="processing">
<span id="message"></span>
<video id="player" controls style="display:none"></video>
<audio id="player2" controls style="display:none"></audio>
</div>
</div>
<script>
if (window.location.hostname.indexOf("vdo.ninja") == 0) {
window.location = window.location.href.replace("vdo.ninja","isolated.vdo.ninja"); // FFMPEG requires an isolated domain.
}
</script>
<script src="./thirdparty/ffmpeg.min.js"></script>
<script>
function download(data, filename) {
const blob = new Blob([data.buffer]);
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 100);
}
const { createFFmpeg, fetchFile } = FFmpeg;
const ffmpeg = createFFmpeg({ log: true });
const transcode = async ({ target: { files } }) => {
const { name } = files[0];
document.getElementById('uploader').style.display = "none";
document.getElementById('uploader2').style.display = "none";
document.getElementById('uploader3').style.display = "none";
document.getElementById('message').innerText = "Transcoding file... this will take a while";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
await ffmpeg.run('-i', name, '-vf', 'scale=1280:720', 'output.mp4');
const data = ffmpeg.FS('readFile', 'output.mp4');
const video = document.getElementById('player');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play video or download it.";
}
const transmux = async ({ target: { files } }) => {
const { name } = files[0];
document.getElementById('uploader').style.display = "none";
document.getElementById('uploader2').style.display = "none";
document.getElementById('uploader3').style.display = "none";
document.getElementById('message').innerText = "Transcoding file... this will take a while";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
await ffmpeg.run('-i', name, '-vcodec', 'copy', '-acodec', 'copy', 'output.mp4');
const data = ffmpeg.FS('readFile', 'output.mp4');
const video = document.getElementById('player');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play video or download it.";
}
const force1080 = async ({ target: { files } }) => {
const { name } = files[0];
const sourceBuffer = await fetch("./media/cap.webm").then(r => r.arrayBuffer());
document.getElementById('uploader').style.display = "none";
document.getElementById('uploader2').style.display = "none";
document.getElementById('uploader3').style.display = "none";
document.getElementById('message').innerText = "Tweaking file... this will take a moment";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
ffmpeg.FS("writeFile", "cap.webm", new Uint8Array(sourceBuffer, 0, sourceBuffer.byteLength));
await ffmpeg.run("-i", "concat:cap.webm|" + name, "-safe", "0", "-c", "copy", "-avoid_negative_ts", "1", "-strict", "experimental", "output.mp4");
const data = ffmpeg.FS('readFile', 'output.mp4');
const video = document.getElementById('player');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play video or download it.";
document.getElementById('processing').style.display = 'flex';
}
const convertToAudioOnly = async ({ target: { files } }) => {
const { name } = files[0];
document.getElementById('message').innerText = "Transcoding file... this will take a while";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
const video = document.getElementById('player');
await ffmpeg.run('-i', name, '-vn', '-acodec', 'copy', 'output.opus');
const data = ffmpeg.FS('readFile', 'output.opus');
console.log(data.buffer.byteLength);
if (data.buffer.byteLength) {
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'audio/opus' }));
download(data, name.split(".")[0] + ".opus");
} else {
await ffmpeg.run('-i', name, '-vn', '-acodec', 'copy', 'output.wav');
const data2 = ffmpeg.FS('readFile', 'output.wav');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'audio/pcm' }));
download(data2, name.split(".")[0] + ".wav");
}
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play audio or download it.";
document.getElementById('processing').style.display = 'flex';
}
document.getElementById('uploader').addEventListener('change', transcode);
document.getElementById('uploader2').addEventListener('change', transmux);
document.getElementById('uploader3').addEventListener('change', force1080);
document.getElementById('uploader4').addEventListener('change', convertToAudioOnly);
</script>
<head>
<link rel="stylesheet" href="./main.css?ver=40" />
<style>
.container {
max-width: 80%;
width: fit-content;
margin: 0 auto;
}
h1 {
margin-top: 1em;
margin-bottom: 1em;
padding: 10px;
}
.card {
margin: 10px;
box-shadow: 0 4px 8px 0 rgb(0 0 0 / 10%);
background-color: #ddd;
color: black;
margin-bottom: 1.5em;
}
.card>div {
padding: 10px;
}
.card h2 {
font-size: 1.5em;
padding: 10px;
background-color: #457b9d;
color: white;
border-bottom: 2px solid #3b6a87;
}
small {
font-style: italic;
display: block;
margin-left: 1em;
}
span.warning {
color: rgb(212, 191, 0);
}
input {
padding: 10px;
}
video {
max-width: 640px;
max-height: 360px;
padding: 20px;
}
audio {
max-width: 640px;
max-height: 360px;
padding: 20px;
}
div#processing {
display: none;
justify-content: center;
place-items: center;
position: absolute;
inset: 0;
font-size: 1.5em;
font-weight: bold;
background: #141926;
flex-direction: column;
}
</style>
</head>
<body style='color:white'>
<div id="header">
<a id="logoname" href="./" style="text-decoration: none; color: white; margin: 2px">
<span data-translate="logo-header">
<font id="qos">V</font>DO.Ninja
</span>
</a>
</div>
<div class="container">
<div id="info">
<h1>Web-based Media Conversion Tools</h1>
<div class="card">
<h2>WebM to MP4 (fixed 1280x720 resolution) <span class='warning'>(very slow!)</span></h2>
<div>
<small>The same as: fmpeg -i input.webm -vf scale=1280:720 output.mp4</small>
<input type="file" id="uploader" title="Convert WebM to MP4">
</div>
</div>
<div class="card">
<h2>MKV to MP4 (no transcoding)</h2>
<div>
<small>The same as: fmpeg -i INPUTFILE -vcodec copy -acodec copy output.mp4</small>
<input type="file" id="uploader2" accept=".mkv" title="Convert MKV to MP4">
</div>
</div>
<div class="card">
<h2>WebM MP4 files (no transcoding, attempts to force high resolutions)</h2>
<div>
<input type="file" id="uploader3" accept=".webm" title="Convert WebM to MP4">
</div>
</div>
<div class="card">
<h2>WebM to Audio-only files (opus or wav)</h2>
<div>
<input type="file" id="uploader4" accept=".webm" title="Convert WebM to OPUS">
</div>
</div>
<div id="processing">
<span id="message"></span>
<video id="player" controls style="display:none"></video>
<audio id="player2" controls style="display:none"></audio>
</div>
</div>
<script>
if (window.location.hostname.indexOf("vdo.ninja") == 0) {
window.location = window.location.href.replace("vdo.ninja","isolated.vdo.ninja"); // FFMPEG requires an isolated domain.
}
</script>
<script src="./thirdparty/ffmpeg.min.js"></script>
<script>
function download(data, filename) {
const blob = new Blob([data.buffer]);
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 100);
}
const { createFFmpeg, fetchFile } = FFmpeg;
const ffmpeg = createFFmpeg({ log: true });
const transcode = async ({ target: { files } }) => {
const { name } = files[0];
document.getElementById('uploader').style.display = "none";
document.getElementById('uploader2').style.display = "none";
document.getElementById('uploader3').style.display = "none";
document.getElementById('message').innerText = "Transcoding file... this will take a while";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
await ffmpeg.run('-i', name, '-vf', 'scale=1280:720', 'output.mp4');
const data = ffmpeg.FS('readFile', 'output.mp4');
const video = document.getElementById('player');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play video or download it.";
}
const transmux = async ({ target: { files } }) => {
const { name } = files[0];
document.getElementById('uploader').style.display = "none";
document.getElementById('uploader2').style.display = "none";
document.getElementById('uploader3').style.display = "none";
document.getElementById('message').innerText = "Transcoding file... this will take a while";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
await ffmpeg.run('-i', name, '-vcodec', 'copy', '-acodec', 'copy', 'output.mp4');
const data = ffmpeg.FS('readFile', 'output.mp4');
const video = document.getElementById('player');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play video or download it.";
}
const force1080 = async ({ target: { files } }) => {
const { name } = files[0];
const sourceBuffer = await fetch("./media/cap.webm").then(r => r.arrayBuffer());
document.getElementById('uploader').style.display = "none";
document.getElementById('uploader2').style.display = "none";
document.getElementById('uploader3').style.display = "none";
document.getElementById('message').innerText = "Tweaking file... this will take a moment";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
ffmpeg.FS("writeFile", "cap.webm", new Uint8Array(sourceBuffer, 0, sourceBuffer.byteLength));
await ffmpeg.run("-i", "concat:cap.webm|" + name, "-safe", "0", "-c", "copy", "-avoid_negative_ts", "1", "-strict", "experimental", "output.mp4");
const data = ffmpeg.FS('readFile', 'output.mp4');
const video = document.getElementById('player');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' }));
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play video or download it.";
document.getElementById('processing').style.display = 'flex';
}
const convertToAudioOnly = async ({ target: { files } }) => {
const { name } = files[0];
document.getElementById('message').innerText = "Transcoding file... this will take a while";
document.getElementById('processing').style.display = 'flex';
await ffmpeg.load();
ffmpeg.FS('writeFile', name, await fetchFile(files[0]));
const video = document.getElementById('player');
await ffmpeg.run('-i', name, '-vn', '-acodec', 'copy', 'output.opus');
const data = ffmpeg.FS('readFile', 'output.opus');
console.log(data.buffer.byteLength);
if (data.buffer.byteLength) {
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'audio/opus' }));
download(data, name.split(".")[0] + ".opus");
} else {
await ffmpeg.run('-i', name, '-vn', '-acodec', 'copy', 'output.wav');
const data2 = ffmpeg.FS('readFile', 'output.wav');
video.src = URL.createObjectURL(new Blob([data.buffer], { type: 'audio/pcm' }));
download(data2, name.split(".")[0] + ".wav");
}
video.style.display = "block";
document.getElementById('message').innerText = "Operation Done. Play audio or download it.";
document.getElementById('processing').style.display = 'flex';
}
document.getElementById('uploader').addEventListener('change', transcode);
document.getElementById('uploader2').addEventListener('change', transmux);
document.getElementById('uploader3').addEventListener('change', force1080);
document.getElementById('uploader4').addEventListener('change', convertToAudioOnly);
</script>
</body>

View File

@ -55,7 +55,7 @@
}
</style>
<link rel="stylesheet" href="./lineawesome/css/line-awesome.min.css" />
<link rel="stylesheet" href="./main.css?ver=69" />
<link rel="stylesheet" href="./main.css?ver=70" />
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/adapter.min.js"></script>
<style id="lightbox-animations" type="text/css"></style>
</head>
@ -68,7 +68,7 @@
<link itemprop="url" href="./media/obsNinja_logo_full.png" />
</span>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=33"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=214"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=215"></script>
<input id="zoomSlider" type="range" style="display: none;" />
<div id="header">
@ -118,6 +118,12 @@
<i id="queuetoggle" class="toggleSize las la-stream my-float"></i>
<div id="queueNotification"></div>
</div>
<div id="sharefilebutton" title="Transfer any file to the group" alt="Transfer any file to the group" onmousedown="event.preventDefault(); event.stopPropagation();" onclick="toggleFileshare()" tabindex="16" role="button" aria-pressed="false" onkeyup="enterPressedClick(event,this);" class="float" style="cursor: pointer;" >
<i id="filesharetoggle" class="toggleSize las la-file-upload my-float"></i>
<div id="transferNotification"></div>
</div>
<div id="chatbutton" title="Toggle the Chat" alt="Toggle the Chat" onmousedown="event.preventDefault(); event.stopPropagation();" onclick="toggleChat()" tabindex="16" role="button" aria-pressed="false" onkeyup="enterPressedClick(event,this);" class="advanced float" style="cursor: pointer;" >
<i id="chattoggle" class="toggleSize las la-comment-alt my-float"></i>
<div id="chatNotification"></div>
@ -647,6 +653,9 @@
<h1>File Sharing seems to be broken on Chrome v88.</h1>
<p>Try <a href="https://github.com/aws/amazon-chime-sdk-js/issues/1031">turning off hardware-accleration</a> in Chrome/Edge to fix the issue, or maybe use a different browser.</p>
</div>
<br /><br />
To host a file for download, rather than for streaming, try the following instead:
<input id="fileselector2" onchange="session.hostFile(this,event);" type="file" title="Transfer any file"/>
</div>
<div class="outer close">
@ -731,7 +740,7 @@
👋 👀 Welcome to VDO Ninja! We've rebranded! 📼 Nothing else is changing and we're staying 100% free.
</h4>
<br />
🌻 Site Updated on July 8th. The <a href="https://docs.vdo.ninja/release-notes/v18_3">v18.3 release notes are here</a>. If new issues occur, the previous version can also be <a href="https://vdo.ninja/v18/">found here</a>.
🌻 Site Updated on July XXth. The <a href="https://docs.vdo.ninja/release-notes/v18_3">v18.3 release notes are here</a>. If new issues occur, the previous version can also be <a href="https://vdo.ninja/v18/">found here</a>.
<br />
<br />
@ -863,7 +872,7 @@
<input type="checkbox" data-param="&sticky" onchange="updateLink(1,this);">
<span class="slider"></span>
</label>
<span data-translate="remote-monitoring">Invite saved to cookie</span>
<span data-translate="invite-saved-to-cookie">Invite saved to cookie</span>
<Br />
<label class="switch" title="Guest will be prompted to enter a Display Name">
@ -1134,7 +1143,7 @@
<h4 style='color:#CCC;margin:20px 20px 0 20px;' data-translate='more-than-four-can-join' >These four guest slots are just for demonstration. More than four guests can actually join a room.</h4>
</div></div>
</div>
<div id="overlayClockContainer" data-initial="600" class="advanced"><span id="overlayClock"></span></div>
<div id="overlayMsgs" onclick="function(e){e.target.innerHTML = '';}" style="display:none"></div>
<div id="bigPlayButton" onclick="function(e){e.target.innerHTML = '';}" style="display:none"></div>
<div id="controls_blank" style="display: none;">
@ -1169,7 +1178,7 @@
</button>
<!---- /////// BREAK //////// -->
<hr /><span style="user-select: none;grid-column: 1;width:100%;margin:5px 0 ;font-size:80%; cursor: pointer;" onclick="toggleByDataset('1');getById('chevarrow3').classList.toggle('bottom');getById('chevarrow3').classList.toggle('right');"><i id="chevarrow3" style="padding:0px 7px 0 3px;" class="chevron right" aria-hidden="true"></i><span data-translate="More-scene-options">More scene options</span></span>
<span style="user-select: none;grid-column: 1;width:100%;margin:5px 0 ;font-size:80%; cursor: pointer;" onclick="toggleByDataset('1');getById('chevarrow3').classList.toggle('bottom');getById('chevarrow3').classList.toggle('right');"><i id="chevarrow3" style="padding:0px 7px 0 3px;" class="chevron right" aria-hidden="true"></i><span data-translate="More-scene-options">More scene options</span></span>
<button data-action-type="addToScene" class="hidden" data-cluster="1" style="grid-column: 1;" data-scene="2" title="Add this Video to any remote '&scene=2'" onclick="directEnable(this, event, 2);">
<i class="las la-plus-square" style="color:#060"></i>
@ -1215,7 +1224,7 @@
</button>
<!---- /////// BREAK //////// -->
<hr /><span style="user-select: none;grid-column: 1;width:100%;margin:5px 0 ;font-size:80%;cursor: pointer;" onclick="toggleByDataset('2');getById('chevarrow4').classList.toggle('bottom');getById('chevarrow4').classList.toggle('right');"><i id="chevarrow4" class="chevron right" aria-hidden="true" style="padding:0px 7px 0 3px;" ></i><span data-translate="additional-controls">Additional controls</span></span>
<span style="user-select: none;grid-column: 1;width:100%;margin:5px 0 ;font-size:80%;cursor: pointer;" onclick="toggleByDataset('2');getById('chevarrow4').classList.toggle('bottom');getById('chevarrow4').classList.toggle('right');"><i id="chevarrow4" class="chevron right" aria-hidden="true" style="padding:0px 7px 0 3px;" ></i><span data-translate="additional-controls">Additional controls</span></span>
<button class="hidden" data-cluster="2" data-action-type="solo-video" style="grid-column: 1; text-shadow: 0px 0px yellow;" data-value="0" title="Solo this video everywhere" onclick="requestInfocus(this);">
@ -1228,7 +1237,7 @@
<span data-translate="hide-guest" >hide guest</span>
</button>
<button class="hidden" data-cluster="2" data-action-type="toggle-remote-speaker" title="Toggle the remote guest's speaker output" onclick="remoteSpeakerMute(this, event);">
<button class="hidden" data-cluster="2" data-action-type="toggle-remote-speaker"title="Toggle the remote guest's speaker output" onclick="remoteSpeakerMute(this, event);">
<i class="las la-volume-off"></i> <span data-translate="toggle-remote-speaker">Deafen Guest</span>
</button>
@ -1259,6 +1268,8 @@
<span data-translate="change-params">URL Params</span>
</button>
<button class="hidden" data-cluster="2" data-action-type="recorder-local" title="Start Recording this remote stream to this local drive. *experimental*'" onclick="recordVideo(this, event)">
<i class="las la-circle"></i>
<span data-translate="record-local"> Record Local</span>
@ -1268,6 +1279,16 @@
<span data-translate="record-remote"> Record Remote</span>
</button>
<button class="hidden" data-cluster="2" data-action-type="open-file-share" data-value="0" title="Allow the guest to select a file to upload to the director. Once shared, it will show in the chat as a download link." onclick="requestFileUpload(this)">
<i class="las la-file-upload"></i>
<span data-translate="request-upload"> Request File</span>
</button>
<button class="hidden" data-cluster="2" data-action-type="create-timer" data-value="0" title="Set a countdown timer that this guest sees" onclick="directTimer(this, event);">
<i class="las la-clock"></i>
<span data-translate="create-timer">Create Timer</span>
</button>
<font class="tooltip hidden" data-cluster="2" style="height: 0; border: 0;">
<input data-action-type="volume" type="range" min="0" max="200" value="100" title="Remotely change the volume of this guest" oninput="remoteVolumeUI(this)" ondblclick="this.value=100;remoteVolume(this);remoteVolumeUI(this);" onchange="remoteVolume(this);" style="grid-column: 2; margin:5px; width: 93%; position: relative;top: 0.6em; background-color:#fff0;"/><span class="tooltiptext" style='float: right; overflow: auto; left: 40px; width: 2.5em; top: -13px; margin: 0; position:relative;font-family:"Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus,Code2000, Code2001, Code2002, Musica, serif, LastResort;' >100</span>
@ -1469,6 +1490,7 @@
</span>
<button id="shareScreenGear" style="width: 135px; padding:20px;text-align:center;" onclick="grabScreen()"><b>Share Screen</b><br /><i style="padding:5px; font-size:300%;" class="las la-desktop"></i></button>
<button id="pIpStartButton" style="width: 135px; background-color:#EFEFEF;padding:20px;text-align:center;display:none;"><b>Preview PiP VIdeo</b><br /><i style="padding:5px; font-size:300%;color:black;" class="las la-compress-arrows-alt"></i></button>
<br />
@ -1669,10 +1691,13 @@
window.location = window.location.href.replace("www.obs.ninja","obs.ninja"); // the session.salt is domain specific; let's consolidate www as a result.
} else if (window.location.hostname.indexOf("www.vdo.ninja") == 0) {
window.location = window.location.href.replace("www.vdo.ninja","vdo.ninja"); // the session.salt is domain specific; let's consolidate www as a result.
} else if (("isSecureContext" in window) && (window.isSecureContext===false)){
console.error("This site must be run in a secure context; please ensure all links, iframes, and parent windows are using SSL");
}
var session = WebRTC.Media; // session is a required global variable if configuring manually. Run before loading main.js but after webrtc.js.
session.version = "18.3";
session.version = "18.4b";
session.streamID = session.generateStreamID(); // randomly generates a streamID for this session. You can set your own programmatically if needed
session.defaultPassword = "someEncryptionKey123"; // Change this password if self-deploying for added security/privacy
@ -1749,11 +1774,11 @@
// session.title // "zzzz"
</script>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/aes.js"></script>
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=12"></script>
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=14"></script>
<!--
// If you wish to change branding, blank offers a good clean start.
<script type="text/javascript" id="main-js" src="./main.js" data-translation="blank"></script>
-->
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=239"></script>
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=237"></script>
</body>
</html>

1017
lib.js

File diff suppressed because it is too large Load Diff

View File

@ -168,6 +168,10 @@ button.grey {
background-color: #673100 !important;
}
.directorBlue {
background-color: #5c7785 !important;
}
button.red {
-webkit-app-region: no-drag;
padding: 10px;
@ -245,7 +249,26 @@ button.white:active {
pointer-events: none;
font-weight: 700;
}
#overlayClockContainer{
margin: 0 auto;
background-color: #0000;
color: white;
font-family: Cousine, monospace;
font-size: calc(6vh + 6vw / 2);
letter-spacing: 0.0em;
text-shadow: 0.05em 0.05em 0px rgb(0 0 0);
width: 100%;
z-index: 6;
vertical-align: top;
text-align: center;
position: fixed;
overflow-wrap: anywhere;
pointer-events: none;
}
#overlayClock{
padding:2px 20px;
background-color: #0009;
}
#overlayMsgs{
margin:0 auto;
background-color: #0000;
@ -467,7 +490,11 @@ hr {
background: #999999;
width: 90%;
}
#activeShares>div{
font-weight: normal;
font-size: 12px;
margin: 10px 0 0 0;
}
.puslate {
border-radius: 50%;
box-shadow: 0 0 0 0 rgba(14, 19, 26, 1);

120
main.js
View File

@ -36,7 +36,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
try {
log("Lang Template: " + ln_template);
changeLg(ln_template);
getById("mainmenu").style.opacity = 1;
//getById("mainmenu").style.opacity = 1;
} catch (error) {
errorlog(error);
getById("mainmenu").style.opacity = 1;
@ -54,7 +54,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
getById("helpbutton").style.opacity = 0;
getById("reportbutton").style.display = "none";
getById("reportbutton").style.opacity = 0;
getById("mainmenu").style.opacity = 1;
//getById("mainmenu").style.opacity = 1;
getById("mainmenu").style.margin = "30px 0";
getById("translateButton").style.display = "none";
getById("translateButton").style.opacity = 0;
@ -65,7 +65,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
}
try {
changeLg("blank");
getById("mainmenu").style.opacity = 1;
//getById("mainmenu").style.opacity = 1;
if (session.label === false) {
document.title = location.hostname;
}
@ -78,8 +78,8 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
getById("qos").style.fontSize = "70%";
getById("logoname").style.display = "none";
getById("logoname").style.margin = "0 0 0 5px";
} catch (error) {
getById("mainmenu").style.opacity = 1;
errorlog(error);
}
} else { // check if automatic language translation is available
@ -534,7 +534,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
session.password = urlParams.get('password') || urlParams.get('pass') || urlParams.get('pw') || urlParams.get('p');
if (!session.password) {
window.focus();
session.password = await promptAlt(miscTranslations["enter-password"], true);
session.password = await promptAlt(miscTranslations["enter-password"], true, true);
} else if (session.password === "false") {
session.password = false;
session.defaultPassword = false;
@ -553,6 +553,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
session.defaultPassword = false;
getById("addPasswordBasic").style.display = "none";
}
if (urlParams.has('hash') || urlParams.has('crc') || urlParams.has('check')) { // could be brute forced in theory, so not as safe as just not using a hash check.
@ -560,13 +561,13 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
var hash_input = urlParams.get('hash') || urlParams.get('crc') || urlParams.get('check');
if (session.password === false) {
window.focus();
session.password = await promptAlt(miscTranslations["enter-password-2"], true);
session.password = await promptAlt(miscTranslations["enter-password-2"], true, true);
session.password = sanitizePassword(session.password);
getById("passwordRoom").value = session.password;
session.defaultPassword = false;
}
session.generateHash(session.password + session.salt, 6).then(function(hash) { // million to one error.
generateHash(session.password + session.salt, 6).then(function(hash) { // million to one error.
log("hash is " + hash);
if (hash.substring(0, 4) !== hash_input) { // hash crc checks are just first 4 characters.
session.taintedSession = true;
@ -812,6 +813,16 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('outboundvideobitrate') || urlParams.has('ovb')) {
session.outboundVideoBitrate = parseInt(urlParams.get('outboundvideobitrate')) || parseInt(urlParams.get('ovb')) || false;
}
if (urlParams.has('nofileshare') || urlParams.has('nodownloads') || urlParams.has('nofiles')){
session.hostedFiles = false;
session.nodownloads = true;
getById('sharefilebutton').style.display = "none";
getById('sharefilebutton').classList.add("advanced");
} else if (session.mobile){
getById('sharefilebutton').style.display = "none";
getById('sharefilebutton').classList.add("advanced");
}
if (urlParams.has('webp')){
session.webp = true;
@ -1261,7 +1272,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
session.forceios = true;
}
if (urlParams.has('nocursor')) {
if (urlParams.has('nocursor')) { // on the screen, not in screen share
session.nocursor = true;
log("DISABLE CURSOR");
var styletmp = document.createElement('style');
@ -1277,6 +1288,10 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
document.head.appendChild(styletmp);
}
if (urlParams.has('cursor') || urlParams.has('screensharecursor')) {
session.screensharecursor = true;
}
if (urlParams.has('vbr')) {
session.cbr = 0;
@ -1363,12 +1378,15 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('beep') || urlParams.has('notify') || urlParams.has('tone')) {
session.beepToNotify = true;
}
if (urlParams.has('r2d2')) {
getById("testtone").innerHTML = "";
getById("testtone").src = "./media/robot.mp3";
session.beepToNotify = true;
}
if (urlParams.has('easyexit') || urlParams.has('ee')) {
session.noExitPrompt = true;
}
if (urlParams.has('videobitrate') || urlParams.has('bitrate') || urlParams.has('vb')) {
session.bitrate = urlParams.get('videobitrate') || urlParams.get('bitrate') || urlParams.get('vb');
@ -1769,6 +1787,39 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
session.speedtest = urlParams.get('speedtest').toLowerCase();
}
}
var iceServers = [{ urls: ["stun:stun.l.google.com:19302", "stun:stun4.l.google.com:19302"]}]; // google stun servers.
if (urlParams.has('stun')) {
var stunstring = urlParams.get('stun');
stunstring = stunstring.split(";");
if (stunstring !== "false") { // false disables the TURN server. Useful for debuggin
var stun = {};
if (stunstring.length==3){
stun.username = stunstring[0]; // myusername
stun.credential = stunstring[1]; //mypassword
stun.urls = [stunstring[2]]; // ["turn:turn.obs.ninja:443"];
} else if (stunstring.length==1){
stun.urls = [stunstring[0]];
}
iceServers = [stun];
} else {
iceServers = [];
}
}
if (urlParams.has('addstun')) {
var stunstring = urlParams.get('addstun');
stunstring = stunstring.split(";");
var stun = {};
if (stunstring.length==3){
stun.username = stunstring[0]; // myusername
stun.credential = stunstring[1]; //mypassword
stun.urls = [stunstring[2]]; // ["turn:turn.obs.ninja:443"];
} else if (stunstring.length==1){
stun.urls = [stunstring[0]];
}
iceServers = iceServers.concat(stun);
}
if (urlParams.has('turn')) {
var turnstring = urlParams.get('turn');
@ -1818,9 +1869,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
};
} else if ((turnstring == "false") || (turnstring == "off") || (turnstring == "0")) { // disable TURN servers
session.configuration = {
iceServers: [
{ urls: ["stun:stun.l.google.com:19302", "stun:stun4.l.google.com:19302"]} // more than 4 stun+turn servers will cause firefox issues? (2 + 2 for now then)
],
iceServers: iceServers,
sdpSemantics: 'unified-plan' // future-proofing
};
} else {
@ -1829,14 +1878,15 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
turnstring = turnstring.split(";");
if (turnstring !== "false") { // false disables the TURN server. Useful for debuggin
var turn = {};
turn.username = turnstring[0]; // myusername
turn.credential = turnstring[1]; //mypassword
turn.urls = [turnstring[2]]; // ["turn:turn.obs.ninja:443"];
if (turnstring.length==3){
turn.username = turnstring[0]; // myusername
turn.credential = turnstring[1]; //mypassword
turn.urls = [turnstring[2]]; // ["turn:turn.obs.ninja:443"];
} else if (turnstring.length==1){
turn.urls = [turnstring[0]];
}
session.configuration = {
iceServers: [
{ urls: ["stun:stun.l.google.com:19302", "stun:stun4.l.google.com:19302"]} // more than 4 stun+turn servers will cause firefox issues? (2 + 2 for now then)
],
iceServers: iceServers,
sdpSemantics: 'unified-plan' // future-proofing
};
@ -1850,7 +1900,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
}
}
} else {
chooseBestTURN(); // vdo.ninja turn servers, if needed.
chooseBestTURN(iceServers); // vdo.ninja turn servers, if needed.
}
@ -2106,6 +2156,24 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
var director_room_input = urlParams.get('director') || urlParams.get('dir');
director_room_input = sanitizeRoomName(director_room_input);
log("director_room_input:" + director_room_input);
if (urlParams.has('codirector') || urlParams.has('directorpassword') || urlParams.has('dirpass') || urlParams.has('dp')) {
session.directorPassword = urlParams.get('codirector') || urlParams.get('directorpassword') || urlParams.get('dirpass') || urlParams.get('dp');
if (!session.directorPassword) {
window.focus();
session.directorPassword = await promptAlt(miscTranslations["enter-director-password"], true);
}
if (session.directorPassword){
await generateHash(session.directorPassword + session.salt + "abc123", 12).then(function(hash) { // million to one error.
log("dir room hash is " + hash);
session.directorHash = hash;
return;
});
} else {
session.directorPassword = false;
}
}
createRoom(director_room_input);
}
if (session.chatbutton === true) {
@ -3026,6 +3094,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
window.onload = function winonLoad() { // This just keeps people from killing the live stream accidentally. Also give me a headsup that the stream is ending
window.addEventListener("beforeunload", function(e) {
try {
session.ws.close();
if (session.videoElement.recording) {
@ -3041,9 +3110,14 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
}
}
} catch (e) {}
//setTimeout(function(){session.hangup();},0);
return undefined; // ADDED OCT 29th; get rid of popup. Just close the socket connection if the user is refreshing the page. It's one or the other.
if (!session.noExitPrompt && !session.cleanOutput && (session.permaid!==false || session.director)){
(e || window.event).returnValue = "Are you sure you want to exit?"; //Gecko + IE
return "Are you sure you want to exit?";
} else {
//setTimeout(function(){session.hangup();},0);
return undefined; // ADDED OCT 29th; get rid of popup. Just close the socket connection if the user is refreshing the page. It's one or the other.
}
});
};

View File

@ -70,6 +70,8 @@
<option value="usc1">Chicago, USA</option>
<option value="usw1">Los Angeles, USA</option>
<option value="aus1">Sidney, Australia</option>
<option value="jap1">Tokyo, Japan</option>
<option value="sing1">Singapore</option>
</select>
<br /><br /><br />
</div>

View File

@ -116,7 +116,34 @@
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"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",
"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",
"disable-digital-audio-effects-and-increase-audio-bitrate": "Disable digital audio-effects and increase audio bitrate",
"the-guest-will-not-have-a-choice-over-audio-options": "The guest will not have a choice over audio-options",
"the-guest-will-only-be-able-to-select-their-webcam-as-an-option": "The guest will only be able to select their webcam as an option",
"hold-ctrl-and-the-mouse-wheel-to-zoom-in-and-out-remotely-of-compatible-video-streams": "Hold CTRL and the mouse wheel to zoom in and out remotely of compatible video streams",
"encode-the-url-so-that-it-s-harder-for-a-guest-to-modify-the-settings-": "Encode the URL so that it's harder for a guest to modify the settings.",
"add-a-password-to-make-the-stream-inaccessible-to-those-without-the-password": "Add a password to make the stream inaccessible to those without the password",
"add-the-guest-to-a-group-chat-room-it-will-be-created-automatically-if-needed-": "Add the guest to a group-chat room; it will be created automatically if needed.",
"customize-the-room-settings-for-this-guest": "Customize the room settings for this guest",
"more-options": "More Options",
"hold-ctrl-or-cmd-to-select-multiple-files": "Hold CTRL (or CMD) to select multiple files",
"enter-an-https-url": "Enter an HTTPS URL",
"creative-commons-by-3-0": "Creative Commons BY 3.0",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"copy-this-url": "Copy this URL into your \"browser source\"",
@ -134,7 +161,8 @@
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
@ -226,14 +254,73 @@
"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"
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"logo-header": "\n\t\t\t\t\t<font id=\"qos\">V</font>DO.Ninja \n\t\t\t\t",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"add-group-chat": "Create a Room",
"rooms-allow-for": "Rooms allow for group-chat and the tools to manage multiple guests.",
"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.vdo.ninja\" style=\"color:black;\"><u>Advanced URL parameters</u></a> are available to customize rooms.</li>\n\t\t\t\t\t\t\t",
"back": "Back",
"add-your-camera": "Add your Camera",
"ask-for-permissions": "Allow Access to Camera/Microphone",
"waiting-for-camera": "Waiting for Camera to Load",
"no-audio": "No Audio",
"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",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"create-reusable-invite": "Create Reusable Invite",
"here-you-can-pre-generate": "Here you can pre-generate a reusable Browser Source link and a related guest invite link.",
"generate-invite-link": "GENERATE THE INVITE LINK",
"advanced-paramaters": "Advanced Options",
"unlock-video-bitrate": "Unlock Video Bitrate (20mbps)",
"force-vp9-video-codec": "Force VP9 Video Codec",
"enable-stereo-and-pro": "Enable Stereo and Pro HD Audio",
"video-resolution": "Video Resolution: ",
"hide-mic-selection": "Force Default Microphone",
"hide-screen-share": "Hide Screenshare Option",
"allow-remote-control": "Remote Control Camera Zoom (android)",
"obfuscate_url": "Obfuscate the Invite URL",
"add-a-password-to-stream": " Add a password:",
"add-the-guest-to-a-room": " Add the guest to a room:",
"invite-group-chat-type": "This room guest can:",
"can-see-and-hear": "Can see and hear the group chat",
"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": "",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs",
"more-than-four-can-join": "These four guest slots are just for demonstration. More than four guests can actually join a room.",
"welcome-to-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"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",
"enter-your-message-here": "Enter your message here",
"enter-chat-message-to-send-here": "Enter chat message to send here",
"enter-the-room-name-here": "Enter the room name here",
"enter-the-room-password-here": "Enter the room password here"
"enter-the-room-password-here": "Enter the room password 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"
},
"miscellaneous": {
"new-display-name": "Enter a new Display Name for this stream",
@ -242,7 +329,7 @@
"director-redirect-2": "\n\nPress OK to be redirected.",
"add-a-label": "Add a label",
"audio-processing-disabled": "Audio processing is disabled with this guest. Can't mute or change volume",
"not-the-director": "<font color='red'>You are not the director of this room. You will have limited to no control. You can try claiming the room after the first director leaves.</font>",
"not-the-director": "<font color='red'>You are not the director of this room. You will have limited to no control. See <a target='_blank' href='https://docs.vdo.ninja/director-settings/codirector'>&codirector</a> on how to become a co-director.</font>",
"room-is-claimed": "The room is already claimed by someone else.\n\nOnly the first person to join a room is the assigned director.\n\nRefresh after the first director leaves to claim.",
"streamid-already-published": "The stream ID you are publishing to is already in use.\n\nPlease try with a different invite link or refresh to retry again.\n\nYou will now be disconnected.",
"director": "Director",

View File

@ -155,7 +155,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -311,7 +314,8 @@
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -326,7 +330,12 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "Připojit se s názvem místnosti zde",

View File

@ -155,7 +155,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS Ninja",
@ -311,7 +314,8 @@
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -326,7 +330,12 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "Raum über Namen betreten",

View File

@ -116,7 +116,34 @@
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"add-group-chat-to-obs": "Add Group Chat to OBS",
"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",
"start-streaming": "start streaming",
"remote-screenshare-into-obs": "Remote Screenshare into OBS",
"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",
"disable-digital-audio-effects-and-increase-audio-bitrate": "Disable digital audio-effects and increase audio bitrate",
"the-guest-will-not-have-a-choice-over-audio-options": "The guest will not have a choice over audio-options",
"the-guest-will-only-be-able-to-select-their-webcam-as-an-option": "The guest will only be able to select their webcam as an option",
"hold-ctrl-and-the-mouse-wheel-to-zoom-in-and-out-remotely-of-compatible-video-streams": "Hold CTRL and the mouse wheel to zoom in and out remotely of compatible video streams",
"encode-the-url-so-that-it-s-harder-for-a-guest-to-modify-the-settings-": "Encode the URL so that it's harder for a guest to modify the settings.",
"add-a-password-to-make-the-stream-inaccessible-to-those-without-the-password": "Add a password to make the stream inaccessible to those without the password",
"add-the-guest-to-a-group-chat-room-it-will-be-created-automatically-if-needed-": "Add the guest to a group-chat room; it will be created automatically if needed.",
"customize-the-room-settings-for-this-guest": "Customize the room settings for this guest",
"more-options": "More Options",
"hold-ctrl-or-cmd-to-select-multiple-files": "Hold CTRL (or CMD) to select multiple files",
"enter-an-https-url": "Enter an HTTPS URL",
"creative-commons-by-3-0": "Creative Commons BY 3.0",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"copy-this-url": "Copy this URL into an OBS \"Browser Source\"",
@ -134,7 +161,8 @@
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
@ -226,14 +254,73 @@
"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"
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"logo-header": "\n\t\t\t\t\t<font id=\"qos\">V</font>DO.Ninja \n\t\t\t\t",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"add-group-chat": "Create a Room",
"rooms-allow-for": "Rooms allow for group-chat and the tools to manage multiple guests.",
"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.vdo.ninja\" style=\"color:black;\"><u>Advanced URL parameters</u></a> are available to customize rooms.</li>\n\t\t\t\t\t\t\t",
"back": "Back",
"add-your-camera": "Add your Camera to OBS",
"ask-for-permissions": "Allow Access to Camera/Microphone",
"waiting-for-camera": "Waiting for Camera to Load",
"no-audio": "No Audio",
"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 into OBS",
"select-screen-to-share": "SELECT SCREEN TO SHARE",
"audio-sources": "Audio Sources",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"create-reusable-invite": "Create Reusable Invite",
"here-you-can-pre-generate": "Here you can pre-generate a reusable Browser Source link and a related guest invite link.",
"generate-invite-link": "GENERATE THE INVITE LINK",
"advanced-paramaters": "Advanced Options",
"unlock-video-bitrate": "Unlock Video Bitrate (20mbps)",
"force-vp9-video-codec": "Force VP9 Video Codec",
"enable-stereo-and-pro": "Enable Stereo and Pro HD Audio",
"video-resolution": "Video Resolution: ",
"hide-mic-selection": "Force Default Microphone",
"hide-screen-share": "Hide Screenshare Option",
"allow-remote-control": "Remote Control Camera Zoom (android)",
"obfuscate_url": "Obfuscate the Invite URL",
"add-a-password-to-stream": " Add a password:",
"add-the-guest-to-a-room": " Add the guest to a room:",
"invite-group-chat-type": "This room guest can:",
"can-see-and-hear": "Can see and hear the group chat",
"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 VDO.Ninja</h2>\n\t\t\t\t\t\t\t<br>\n\t\t\t\t\t\t\t<li>100% <b>free</b>; no downloads; no personal data collection; no sign-in</li>\n\t\t\t\t\t\t\t<li>Bring live video from your smartphone, remote computer, or friends directly into OBS or other studio software.</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<br>\n\t\t\t\t\t\t\t<li>Youtube video \n\t\t\t\t\t\t\t\t<i class=\"lab la-youtube\"></i>\n\t\t\t\t\t\t\t\t<a href=\"https://www.youtube.com/watch?v=vLpRzMjUDaE&amp;list=PLWodc2tCfAH1WHjl4WAOOoRSscJ8CHACe&amp;index=2\" alt=\"Youtube video demoing VDO.Ninja\">Demoing it here</a>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<br>\n\t\t\t\t\t\t\t<i>\n\t\t\t\t\t\t\t\t<font style=\"color: red;\">Known issues:</font>\n\t\t\t\t\t\t\t</i>\n\t\t\t\t\t\t\t<br>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\tSome devices that use H264 hardware encoding can experience video glitching; switching to VP8 or VP9 as a codec can help.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\tIf using multiple group scenes at a time, iOS devices may fail to work if the hardware encoders max out. Perhaps try VP8 as a codec instead.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\tA list of less common issues can <a href=\"https://docs.vdo.ninja/common-errors-and-known-issues/known-issues-browser-bugs-and-more\">be found here</a>.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<br>\n\t\t\t\t\t\t\t<h4 style=\"color:#daad09;\">\n\t\t\t\t\t\t\t\t👋 👀 Welcome to VDO Ninja! We've rebranded! 📼 Nothing else is changing and we're staying 100% free.\n\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t<br>\n\t\t\t\t\t\t\t🌻 Site Updated on July 8th. The <a href=\"https://docs.vdo.ninja/release-notes/v18_3\">v18.3 release notes are here</a>. If new issues occur, the previous version can also be <a href=\"https://vdo.ninja/v18/\">found here</a>.\n\n\t\t\t\t\t\t\t<br>\n\t\t\t\t\t\t\t<br>\n\t\t\t\t\t\t\t<h3>\n\t\t\t\t\t\t\t 🛠 For support, see the <a href=\"https://www.reddit.com/r/VDONinja/\">sub-reddit <i class=\"lab la-reddit-alien\"></i></a> or join the <a href=\"https://discord.gg/T4xpQVv\">Discord <i class=\"lab la-discord\"></i></a>. The <a href=\"https://docs.vdo.ninja/\">documentation is here</a> and my personal email is <i>steve@seguin.email</i>\n\t\t\t\t\t\t\t</h3> \n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs",
"more-than-four-can-join": "These four guest slots are just for demonstration. More than four guests can actually join a room.",
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome to VDO.Ninja! You can send text messages directly to connected peers from here.\n\t\t\t\t"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",
"enter-your-message-here": "Enter your message here",
"enter-chat-message-to-send-here": "Enter chat message to send here",
"enter-the-room-name-here": "Enter the room name here",
"enter-the-room-password-here": "Enter the room password here"
"enter-the-room-password-here": "Enter the room password 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"
},
"miscellaneous": {
"new-display-name": "Enter a new Display Name for this stream",

View File

@ -141,7 +141,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"copy-this-url": "Copia esta URL como fuente \"Navegador\" de OBS",
@ -282,7 +285,8 @@
"add-to-outlook-calendar": "Añadir a Calendario Outlook",
"add-to-yahoo-calendar": "Añadir a Calendario Yahoo",
"push-to-talk-enable": " enable director`s microphone or video<br>(only guests can see this feed)",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -297,7 +301,14 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"logo-header": "\n\t\t\t\t\t<font id=\"qos\">V</font>DO.Ninja \n\t\t\t\t",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs",
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome to VDO.Ninja! You can send text messages directly to connected peers from here.\n\t\t\t\t"
},
"placeholders": {
"join-by-room-name-here": "Unirse por Nombre de Sala aquí",

View File

@ -155,7 +155,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -311,7 +314,8 @@
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -326,7 +330,12 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "Rejoindre via le nom de salle ici",

View File

@ -155,7 +155,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -311,7 +314,8 @@
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -326,7 +330,12 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -155,7 +155,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -311,7 +314,8 @@
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -326,7 +330,12 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -155,7 +155,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS Ninja",
@ -311,7 +314,8 @@
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -326,7 +330,12 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "Ga binnen met een kamer naam",

View File

@ -155,7 +155,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS Ninja - Pig Latin",
@ -311,7 +314,8 @@
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -326,7 +330,12 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "Erehay ouyay ancay epray-enerategay",

View File

@ -155,7 +155,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -311,7 +314,8 @@
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -326,7 +330,12 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "Introduza aqui numa sala pelo seu nome",

View File

@ -155,7 +155,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja (RU)",
@ -311,7 +314,8 @@
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -326,7 +330,12 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -155,7 +155,10 @@
"a-direct-solo-view-of-the-video-audio-stream-with-nothing-else-its-audio-can-be-remotely-controlled-from-here": "A direct solo view of the video/audio stream with nothing else. Its audio can be remotely controlled from here",
"this-guest-raised-their-hand-click-this-to-clear-notification-": "This guest raised their hand. Click this to clear notification.",
"increase-this-at-your-peril-changes-the-total-inbound-video-bitrate-per-guest-mobile-devices-excluded-webp-mode-also-excluded-": "Increase this at your peril. Changes the total inbound video bitrate per guest; mobile devices excluded. Webp-mode also excluded.",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -311,7 +314,8 @@
"add-to-google-calendar": "Add to Google Calendar",
"add-to-outlook-calendar": "Add to Outlook Calendar",
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"fade-videos-in": "Fade videos in",
"show-guest-tips": "Show guest setup tips",
"green-background": "Green background",
@ -326,7 +330,12 @@
"unblind": "un-blind",
"close": "close",
"send-message": "send message<s pan=\"\"> </s>",
"record-director-local": " Record"
"record-director-local": " Record",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -147,7 +147,10 @@
"show-labels": "Show labels",
"transfer-to-a-new-room": "Transfer to a new Room",
"enable-custom-password": "Enable custom password",
"hide-this-window": "Hide this window"
"hide-this-window": "Hide this window",
"cycle-the-cameras": "Cycle the Cameras",
"have-screen-shares-stream-id-s-use-a-predictable-prefixed-value-instead-of-a-random-one-": "Have screen-shares stream ID's use a predictable prefixed value instead of a random one.",
"toggle-solo-voice-chat-or-hold-ctrl-cmd-when-selecting-to-make-it-two-way-private-": "Toggle solo voice chat or hold CTRL/CMD when selecting to make it two-way private."
},
"innerHTML": {
"logo-header": "\n\t\t\t\t\t<font id=\"qos\">O</font>BS.Ninja \n\t\t\t\t",
@ -242,7 +245,8 @@
"auto-add-guests": "Auto-add guests",
"pro-audio-mode": "Pro-audio mode",
"hide-audio-only-sources": "Hide audio-only sources",
"remote-monitoring": "Invite saved to cookie",
"remote-monitoring": "Remote Monitoring",
"invite-saved-to-cookie": "Invite saved to cookie",
"ask-for-display-name": "Ask for display name",
"show-display-names": "Show display names",
"show-active-speaker": "Show active speakers",
@ -304,7 +308,15 @@
"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"
"add-to-yahoo-calendar": "Add to Yahoo Calendar",
"only-director-can-hear-you": "Only the director can hear you currently.",
"director-muted-you": "The director has muted you.",
"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",
"application-audio-capture": "For application-specific audio capture, <a href=\"https://docs.vdo.ninja/audio\" style=\"color: #007AC8;\">see here</a>",
"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.",
"animate-mixing": "Animate mixing",
"prefix-screenshare": "Prefix screenshare IDs"
},
"placeholders": {
"join-by-room-name-here": "приєднано до кімнати тут ",

File diff suppressed because one or more lines are too long