This commit is contained in:
steveseguin 2023-05-08 05:27:04 -04:00
parent 55414d1133
commit 74505e8cd0
8 changed files with 203 additions and 47 deletions

View File

@ -56,7 +56,7 @@
<meta property="twitter:image" content="./media/vdoNinja_logo_full.png" />
<meta name="msapplication-TileColor" content="#da532c" />
<meta name="theme-color" content="#ffffff" />
<link rel="stylesheet" href="./main.css?ver=324" />
<link rel="stylesheet" href="./main.css?ver=329" />
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/adapter.js"></script>
<style id="lightbox-animations" type="text/css"></style>
<!-- <link rel="manifest" href="manifest.json" /> -->
@ -83,7 +83,7 @@
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=47"></script>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/aes.js"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=631"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=638"></script>
<input id="zoomSlider" type="range" style="display: none;" />
<span id="electronDragZone" style="pointer-events: none; z-index:-10; position:absolute;top:0;left:0;width:100%;height:2%;-webkit-app-region: drag;min-height:20px;"></span>
<div id="header">
@ -924,15 +924,12 @@
<li>
Samsung smartphones (A-series) may fail to publish video with some mobile browsers; try using Firefox Mobile or the native <a href='https://docs.vdo.ninja/getting-started/native-mobile-app-versions#android-download-link'>Android app</a> in these cases.
</li>
<li>
Some devices that use hardware encoding can experience video issues; switching to VP8 or VP9 as a <a target='_blank' title='Jump to the documentation' href='https://docs.vdo.ninja/viewers-settings/codec'>codec</a> may help.
</li>
<br />
<h4>
<span style="color:#daad09;">Welcome to VDO Ninja! We've rebranded! Nothing else is changing and we're staying 100% free.</span>
</h4>
<br />
😁 This is Version 23; it's still in development. 🧪 Please report any issues you have with it. Development <a target="_blank" href='https://updates.vdo.ninja/'>updates are here.</a>
😁🌱 Site last updated on May 8th. If facing new problems, the previous version can still be <a href="https://vdo.ninja/v22/">accessed here</a>. Development <a target="_blank" href='https://updates.vdo.ninja/'>updates are here.</a>
<br />
<br />
<h3>
@ -1388,7 +1385,7 @@
<!-- General Controls -->
<div class="row two">
<!-- Video Feed Quality -->
<div class="row three">
<div class="row three advanced">
<button class="" data-action-type="change-quality1" title="Disable Video Preview" onclick="toggleQualityDirector(0, this.dataset.UUID, this);">
<i class="las la-video-slash"></i>
</button>
@ -1444,10 +1441,10 @@
<i class="las la-video-slash"></i>
<span data-translate="mute-video-guest">Video off</span>
</button>
<button class="mainonly" data-action-type="toggle-remote-speaker" title="Toggle the remote guest's speaker output" onclick="remoteSpeakerMute(this, event);">
<button class="mainonly advanced" 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</span>
</button>
<button data-action-type="hide-guest" title="Hide this guest everywhere" onclick="remoteHideVideo(this, event);">
<button class="advanced" data-action-type="hide-guest" title="Hide this guest everywhere" onclick="remoteHideVideo(this, event);">
<i class="las la-user-slash"></i>
<span data-translate="hide-guest">Hide</span>
</button>
@ -1459,7 +1456,7 @@
<span data-translate="add-to-scene">add to scene 1</span>
</button>
</div>
<button class="hideDropMenu" onclick="toggleByDataset('1');getById('chevarrow3').classList.toggle('bottom');getById('chevarrow3').classList.toggle('right');">
<button class="hideDropMenu advanced" onclick="toggleByDataset('1');getById('chevarrow3').classList.toggle('bottom');getById('chevarrow3').classList.toggle('right');">
<i id="chevarrow3" class="chevron right" aria-hidden="true"></i>
<span data-translate="scene-options">Scene options</span>
</button>
@ -1519,7 +1516,7 @@
</div>
</div>
<button class="hideDropMenu" onclick="toggleByDataset('2');getById('chevarrow4').classList.toggle('bottom');getById('chevarrow4').classList.toggle('right');">
<button class="hideDropMenu advanced" onclick="toggleByDataset('2');getById('chevarrow4').classList.toggle('bottom');getById('chevarrow4').classList.toggle('right');">
<i id="chevarrow4" class="chevron right" aria-hidden="true" ></i>
<span data-translate="additional-controls">Additional Controls</span>
</button>
@ -1539,7 +1536,7 @@
<i class="las la-plus"></i>
</button>
</span>
<button class="mainonly" data-action-type="create-timer" title="Set a countdown timer that this guest sees. CTRL (cmd) + click to pause." onclick="directTimer(this, event);">
<button class="mainonly advanced" data-action-type="create-timer" title="Set a countdown timer that this guest sees. CTRL (cmd) + click to pause." onclick="directTimer(this, event);">
<i class="las la-clock"></i>
<span data-translate="create-timer">Create Timer</span>
</button>
@ -1555,11 +1552,11 @@
<i class="las la-cog"></i>
<span data-translate="change-params">URL Params</span>
</button>
<button class="mainonly" data-action-type="change-url" title="Remotely reload the guest's page with a new URL" onclick="directPageReload(this, event);">
<button class="mainonly advanced" data-action-type="change-url" title="Remotely reload the guest's page with a new URL" onclick="directPageReload(this, event);">
<i class="las la-sync"></i>
<span data-translate="change-url">Change URL</span>
</button>
<button class="mainonly" data-action-type="open-file-share" 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)">
<button class="mainonly advanced" data-action-type="open-file-share" 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>
@ -2376,7 +2373,7 @@
var session = WebRTC.Media; // session is a required global variable if configuring manually. Run before loading main.js but after webrtc.js.
session.version = "23.3b";
session.version = "23.4";
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
@ -2489,11 +2486,11 @@
// session.hidehome = true; // If used, 'hide home' will make the landing page inaccessible, along with hiding a few go-home elements.
// session.record = false; // uncomment to block users from being able to record via vdo.ninja's built in recording function
</script>
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=788"></script>
<script type="text/javascript" crossorigin="anonymous" id="lib-js" src="./lib.js?ver=803"></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=617"></script>
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=629"></script>
</body>
</html>

136
lib.js
View File

@ -118,7 +118,8 @@ var miscTranslations = {
"token-not-director": "The request failed; the remote user did not recognize you as the director",
"approved-as-director": "The director approved you as a co-director",
"you-are-a-codirector": "You are a co-director of this room; you have partial director control assigned to you.",
"this-is-you": "This is you, a co-director.<br />You are also a performer."
"this-is-you": "This is you, a co-director.<br />You are also a performer.",
"preview-meshcast-disabled": "You can't adjust the preview bitrate for Meshcast-based streams"
};
// function log(msg){ // uncomment to enable logging.
@ -457,6 +458,7 @@ function safariVersion() {
try{
var iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform); // used by main.js also
var iPad = (navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && /MacIntel/.test(navigator.platform));
var macOS = navigator.userAgent.indexOf('Mac OS X') != -1;
macOS = macOS && !(iOS || iPad);
var Firefox = navigator.userAgent.indexOf("Firefox")>=0;
@ -473,8 +475,18 @@ try{
var cpuSupport = detectCPUSupport();
log(cpuSupport);
var iPhone12Up = false;
if (iOS && !iPad){
if ((window.devicePixelRatio.toFixed(2)>=3) && (window.screen.height>800) && (window.screen.width!=414)){ // for reference, https://www.ios-resolution.com/
iPhone12Up = true; // iPhone SE is left out.
}
}
} catch(e){errorlog(e);}
if (isVingester){
console.warn("If Vingester isn't able to capture audio, get a fixed version of Vingester from here: https://github.com/steveseguin/vingester/releases/");
}
@ -4710,6 +4722,9 @@ function updateMixerRun(e=false){ // this is the main auto-mixing code. It's a
}
if (miniPerformerX !== null){
container.style.left = miniPerformerX + "%";
} else if (session.leftMiniPreview!==false){
container.style.left = session.leftMiniPreview + "%";
togglePreview.style.left = session.leftMiniPreview + "%";
} else {
container.style.right = "2vw";
togglePreview.style.right = "2vw";
@ -9424,9 +9439,13 @@ function printValues(obj) { // see: printViewStats
}
else if (key == 'version') {
stat = "VDO.Ninja Version";
} else if (key == 'platform') {
}
else if (key == 'platform') {
stat = "Platform (OS)";
}
else if (key == 'iPhone12Up') {
stat = "iPhone 12 and up";
}
else if (key == 'aec_url') {
stat = "Echo-Cancellation";
}
@ -9904,10 +9923,11 @@ function printMyStats(menu) { // see: setupStatsMenu
}
});
if (session.pcs[UUID] && session.pcs[UUID].restartIce){ // only show if available
menu.innerHTML += "<button onclick='session.pcs[\""+UUID+"\"].restartIce();'>Restart connection</button>";
if (UUID && session.pcs[UUID] && session.pcs[UUID].restartIce){ // only show if available
menu.innerHTML += "<button onclick='session.pcs[\""+UUID+"\"].restartIce();' title='This will trigger an ICE Restart, which may or may not help with some connection issues'>Restart connection</button>";
}
keys.forEach(key=>{
if (typeof obj[key] !== "object") {
if (key.startsWith("_")){return;}
@ -9954,6 +9974,21 @@ function printMyStats(menu) { // see: setupStatsMenu
menu.innerHTML += "<li><span>" + stat + "</span><span>" + value + "</span></li>";
}
});
if (UUID && session.pcs[UUID]){
if (session.pcs[UUID].maxBandwidth){
menu.innerHTML += "<li><span>max bandwidth target</span><span>" + session.pcs[UUID].maxBandwidth + "</span></li>";
}
if (session.pcs[UUID].setBitrate){
menu.innerHTML += "<li><span onclick='var bitr=prompt(\"Enter a target bitrate (kbps)\");if (bitr!==null){session.limitBitrate(\""+UUID+"\", parseInt(bitr));}'>init bitrate target</span><span>" + session.pcs[UUID].setBitrate + "</span></li>";
}
if (session.pcs[UUID].savedBitrate){
menu.innerHTML += "<li><span>current bitrate target</span><span>" + session.pcs[UUID].savedBitrate + "</span></li>";
}
if (session.room!==false){
menu.innerHTML += "<li><span title='Only available if not in a group room'>adjust video bitrate</span><span><input class='thinSlider' title='Adjust the outbound bitrate for this stream.' type='range' value='"+(session.pcs[UUID].savedBitrate || session.pcs[UUID].setBitrate || 2500)+"' min='0' max='"+(session.pcs[UUID].setBitrate || 6000)+"' onchange='session.limitBitrate(\""+UUID+"\", parseInt(this.value));' /></span></li>";
}
}
}
printViewValues(session.stats);
@ -11311,6 +11346,7 @@ async function toggleSettings(forceShow = false) { // TODO: I need to have this
toggleSettingsState = false;
document.getElementById('videoSettings3').style.display = "none";
}
pokeIframeAPI("settings-menu-state",toggleSettingsState);
}
function hangup() { // TODO: I need to have this be MUTE, toggle, with volume not touched.
@ -11966,7 +12002,7 @@ function syncGroup(groups, UUID){
function syncSceneState(sid){
if (!session.syncState){return;}
if (!session.syncState[sid]){return;}
var scenes = session.syncState[sid].scenes;
var scenes = session.syncState[sid].scenes || [];
for (var scene in scenes){
try {
var ele = document.querySelector('[data-sid="'+sid+'"][data-action-type="addToScene"][data-scene="'+scene+'"]');
@ -11974,6 +12010,7 @@ function syncSceneState(sid){
if (scenes[scene]){
ele.value = 1;
ele.classList.add("pressed"); ele.ariaPressed = "true";
getById("container_" + ele.dataset.UUID).classList.add("containerGreen");
if (ele.children[1]){
ele.children[1].innerHTML = "Remove";
}
@ -13337,6 +13374,9 @@ function updateForceRotate(){
updateForceRotatedCSS()
applyMirror(session.mirrorExclude);
}
session.setResolution(); // probably only triggers with mobile devices?
}
function updateForceRotatedCSS(){
@ -15947,6 +15987,12 @@ async function createRoomCallback(passAdd, passAdd2) {
} else if (session.chatbutton === false) {
getById("chatbutton").classList.add("hidden");
}
if (session.effect===false){
session.effect = null; // so the director can see the effects
}
getById("avatarDiv3").classList.remove("hidden"); // lets the director see the avatar option
clearInterval(session.updateLocalStatsInterval);
session.updateLocalStatsInterval = setInterval(function(){updateLocalStats();},session.statsInterval);
@ -16230,8 +16276,9 @@ async function createDirectorOnlyBox() {
controls.id = "controls_director";
var container = document.createElement("div");
container.id = "container_director"; // needed to delete on user disconnect
container.className = "vidcon directorMargins";
container.id = "container_director"; // needed to delete on user disconnect
var buttons = "";
if (session.slotmode){
@ -16414,8 +16461,9 @@ async function createDirectorScreenshareOnlyBox() { // sstype=3
controls.id = "controls_screen_director";
var container = document.createElement("div");
container.id = "container_screen_director"; // needed to delete on user disconnect
container.className = "vidcon directorMargins";
container.id = "container_screen_director"; // needed to delete on user disconnect
var buttons = "";
if (session.slotmode){
@ -16882,9 +16930,10 @@ function createControlBox(UUID, soloLink, streamID) {
controls.id = "controls_" + UUID;
var container = document.createElement("div");
container.className = "vidcon directorMargins";
container.id = "container_" + UUID; // needed to delete on user disconnect
container.UUID = UUID;
container.className = "vidcon directorMargins";
container.dataset.UUID = UUID;
if (session.orderby){
try {
@ -21051,6 +21100,7 @@ async function grabVideo(quality = 0, eleName = 'previewWebcam', selector = "sel
exact: session.height
};
}
if (session.frameRate) {
constraints.video.frameRate = {
exact: session.frameRate
@ -21061,13 +21111,26 @@ async function grabVideo(quality = 0, eleName = 'previewWebcam', selector = "sel
max: session.maxframeRate
};
} else if ((iOS || iPad) && (SafariVersion>15)) { // iOS supports 720p60, but just 1080p30 : iphone 11 on march 2023
if (quality === 1) {
if (quality === 1) { // iphone 11 and older
if (!constraints.video.frameRate){
constraints.video.frameRate = {
ideal: 60,
max: 60
};
}
} else if (iPhone12Up && (quality<1)){ // iphone 12 and up?
if (!constraints.video.frameRate){
try {
if (videoSelect.options[videoSelect.selectedIndex].innerText.startsWith("Back ")){ // front seems to be limited to 720p60 / 1080p30
constraints.video.frameRate = {
ideal: 60,
max: 60
};
}
} catch(e){
errorlog(e);
}
}
}
}
@ -21352,13 +21415,13 @@ async function grabVideo(quality = 0, eleName = 'previewWebcam', selector = "sel
// log("16068");
await updateCameraConstraints("aspectRatio", session.forceAspectRatio);
//}
} else {
log("16072");
session.setResolution(); // this runs already when updateCameraConstraints succeeds
}
}// else {
//log("16072");
// session.setResolution(); // this runs already when updateCameraConstraints succeeds
//}
//log("16075");
updateForceRotate();
//log("16075");
updateForceRotate(); // this contains session.setResolution();
if (iOS || iPad){
// if we don't do this, portrait videos may be detected as horizontal
@ -21482,9 +21545,17 @@ function updateRenderOutpipe(){ // video only.
if (session.streamSrc){
var tracks = session.streamSrc.getVideoTracks();
if (!tracks.length || session.videoMuted){
tracks = setAvatarImage(tracks);
if (tracks.length){
if (tracks.length && !session.cleanOutput && !session.cleanish){
getById("mutevideobutton").classList.remove("hidden");
}
tracks.forEach(function(track) {
session.videoElement.srcObject.addTrack(track);
if (session.avatar && session.avatar.tracks){
@ -21501,6 +21572,7 @@ function updateRenderOutpipe(){ // video only.
msg.videoMuted = true;
session.sendMessage(msg);
session.videoElement.load();
getById("mutevideobutton").classList.add("hidden");
}
} else if (tracks.length){
applyMirror(session.mirrorExclude);
@ -21510,6 +21582,10 @@ function updateRenderOutpipe(){ // video only.
toggleVideoMute(true);
pushOutVideoTrack(track); // video only
});
if (tracks.length && !session.cleanOutput && !session.cleanish){
getById("mutevideobutton").classList.remove("hidden");
}
}
}
}
@ -27769,7 +27845,7 @@ function setupWebcamSelection(miconly=false) {
try {
return enumerateDevices().then(function(dInfo){return gotDevices(dInfo, miconly)}).then(function() {
if (getById("webcamquality").elements && parseInt(getById("webcamquality").elements.namedItem("resolution").value) == 3) {
if (getById("webcamquality").elements && parseInt(getById("webcamquality").elements.namedItem("resolution").value) == 3) { // this is junk??
if (session.maxframeRate===false){
session.maxframeRate = 30;
session.maxframeRate_q2 = true;
@ -29847,6 +29923,31 @@ function sendChatMessage(chatMsg = false, bc = false) { // filtered + visual
return true;
}
function disableQualityDirector(UUID){ // lets revert back to the director's quality settings after viewing the scene
try {
var elements = document.querySelectorAll('[data-action-type="change-quality2"][data--u-u-i-d="' + UUID + '"]');
if (elements[0]) {
elements[0].classList.add("disable"); elements[0].ariaPressed = "false";
elements[0].classList.remove("pressed");
elements[0].disabled = "true";
elements[0].title = miscTranslations["preview-meshcast-disabled"];
}
var elements = document.querySelectorAll('[data-action-type="change-quality1"][data--u-u-i-d="' + UUID + '"]');
if (elements[0]) {
elements[0].classList.add("disable"); elements[0].ariaPressed = "false";
elements[0].classList.remove("pressed");
elements[0].disabled = "true";
elements[0].title = miscTranslations["preview-meshcast-disabled"];
}
var elements = document.querySelectorAll('[data-action-type="change-quality3"][data--u-u-i-d="' + UUID + '"]');
if (elements[0]) {
elements[0].classList.add("disable"); elements[0].ariaPressed = "false";
elements[0].classList.remove("pressed");
elements[0].disabled = "true";
elements[0].title = miscTranslations["preview-meshcast-disabled"];
}
} catch(e){errorlog(e);}
}
function applyQualityDirector() { // lets revert back to the director's quality settings after viewing the scene
var eles = document.querySelectorAll('#guestFeeds button.pressed[data-action-type="change-quality1"],#guestFeeds button.pressed[data-action-type="change-quality2"],#guestFeeds button.pressed[data-action-type="change-quality3"]');
@ -36134,9 +36235,10 @@ function createControlBoxScreenshare(UUID, soloLink, streamID) {
controls.id = "controls_" + UUID;
var container = document.createElement("div");
container.className = "vidcon directorMargins";
container.id = "container_" + UUID; // needed to delete on user disconnect
container.UUID = UUID;
container.className = "vidcon directorMargins";
container.dataset.UUID = UUID;
if (session.orderby){
try {

View File

@ -1765,6 +1765,16 @@ input[type=range].inputConstraint {
/* ////// Icon resizing for mobile subControl bar ////// */
input[type=range].thinSlider {
margin: 0;
padding: 0;
height: 10px;
top: 5px;
overflow: hidden;
position: relative;
display: flex;
}
.inMessage {
color: #000;
margin: 3px;
@ -2874,6 +2884,10 @@ audio.fileshare::-webkit-media-controls-play-button, video.fileshare::-webkit-me
display: inherit;
}
video::-webkit-media-controls-panel {
background-color: #0000;
}
.mirrorControl::-webkit-media-controls-enclosure {
padding: 0px;
height: 30px;
@ -3277,6 +3291,7 @@ label {
.directorMargins {
margin: var(--director-margin);
}
.hideLinksClass {
background-color: var(--container-color);
width:1191px;
@ -3381,7 +3396,13 @@ div#roomnotes2 {
#yourDirectorStatus {
color: var(--discord-text);
}
.directorBlue{
background-color: #5c7785 !important;
}
.directorBox{
background-color: #606383 !important;
}
/* ---- DIRECTORS PAGE - Guest Controls Box ---- */
.controlsGrid {
display: flex;
@ -5180,7 +5201,10 @@ input[type='checkbox'], input[type='radio'] {
margin-top: 0px;
}
.disable {
opacity: 0.5;
cursor: not-allowed;
}
/* Buttons to disable due to them being a director */
.directorBoxColor button[data-action-type="hangup"],
@ -5248,6 +5272,9 @@ input[type='checkbox'], input[type='radio'] {
-webkit-app-region: no-drag;
}
#popupSelector label {
color: black;
}
.darktheme #popupSelector label {
color: white;
}
#popupSelector .multiselect-contents label{
@ -5270,7 +5297,15 @@ input[type='checkbox'], input[type='radio'] {
#popupSelector_constraints_video > div, #popupSelector_constraints_audio > div {
padding: 10px 10px 10px 0;
}
#popupSelector_constraints_audio label {
color:white;
}
#popupSelector_constraints_video label {
color:white;
}
#popupSelector_user_settings label {
color:white;
}
ul#audioSource{
background-color: var(--lighttheme-1);
margin-top: 7px;

24
main.js
View File

@ -123,6 +123,7 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
if (urlParams.has('director') || urlParams.has('dir')) {
session.director = urlParams.get('director') || urlParams.get('dir') || true;
session.effect = null; // so the director can see the effects after a page refresh
getById("avatarDiv3").classList.remove("hidden"); // lets the director see the avatar option
}
if (urlParams.has('controls') || urlParams.has('videocontrols')) {
@ -1926,6 +1927,17 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
session.nopreview = false;
session.minipreview = mini;
}
if (urlParams.has('minipreviewoffset') || urlParams.has('mpo')){ // 40 would be centered
session.leftMiniPreview = urlParams.get('minipreviewoffset') || urlParams.get('mpo') || 0;
session.leftMiniPreview = parseInt(session.leftMiniPreview) || 0;
if (session.leftMiniPreview<-20){
session.leftMiniPreview = -20;
} else if (session.leftMiniPreview>120){
session.leftMiniPreview = 120;
}
}
if (urlParams.has('obsfix')) {
session.obsfix = urlParams.get('obsfix');
@ -4547,6 +4559,18 @@ async function main(){ // main asyncronous thread; mostly initializes the user s
toggleMute();
}
}
if ("toggleSettings" in e.data) { // this should work for the director's mic mute button as well. Needs to be manually enabled the first time still tho.
if (e.data.toggleSettings && !toggleSettingsState){
toggleSettings();
} else if (e.data.toggleSettings=="toggle"){
toggleSettings();
} else if (toggleSettingsState){
toggleSettings();
}
}
if ("camera" in e.data) { // this should work for the director's mic mute button as well. Needs to be manually enabled the first time still tho.
if (e.data.camera === true) { // unmute

View File

@ -639,7 +639,7 @@
}
.close-btn {
color: #333;
font-size: 24px;
font-size: 42px;
font-weight: bold;
user-select: none;
}
@ -930,7 +930,7 @@
<div>
<a class="github" href="https://github.com/steveseguin/vdoninja" rel="noopener" target="_blank" title="Star steveseguin/vdoninja on GitHub"></a>
</div>
<div style="cursor:pointer;" onclick="window.open('https://vdo.ninja');">Powered by VDO.Ninja</div>
<div style="cursor:pointer;" onclick="window.open('https://vdo.ninja');">Powered by VDO.Ninja (v23)</div>
</div>
</div>
</div>

View File

@ -84,13 +84,10 @@ video {
#feeds {
display: inline-block;
width:100%;
height:380px;
}
#feeds span {
margin:auto;
height: 100%;
min-width:50%;
display: inline-block;
flex-direction: column;
@ -106,7 +103,7 @@ video {
}
iframe {
height: 85%;
height: min(85%, 385px);
width: 100%;
flex: 1;
border: 0;
@ -206,6 +203,8 @@ ol {
iframe {
width: 100%;
height:calc(100% - 100px);
max-height: 380px;
}
#feeds {
@ -226,9 +225,8 @@ ol {
}
#feeds span{
height: :calc(100% - 100px);
width:100%;
display: inline-block;
width:100%;
}
canvas {
margin:auto;

View File

@ -1,7 +1,7 @@
<html>
<head>
<link rel="stylesheet" href="./lineawesome/css/line-awesome.min.css" />
<link rel="stylesheet" href="./speedtest.css?ver=1" />
<link rel="stylesheet" href="./speedtest.css?ver=7" />
<meta charset="utf8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>VDON Speed Test</title>

File diff suppressed because one or more lines are too long