NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Invidious Quick Mirrors
// @author jnaskali
// @copyright 2020, Juhani Naskali (www.naskali.fi)
// @license MIT
// @version 1.5
// @namespace https://www.naskali.fi
// @downloadURL https://openuserjs.org/install/jnaskali/Invidious_Quick_Mirrors.user.js
//
// @include https://invidio.*/*
// @include https://invidiou.*/*
// @include https://invidious.*/*
// @include https://yewtu.be/*
// @include https://watch.nettohikari.com/*
// @grant none
//
// @description Shows a quick mirror numberbar in the top-right corner of Invidious pages and video thumbnails.
// ==/UserScript==
/* CONFIG: instance list - add your own */
var instances = [
"invidious.13ad.de",
"invidious.snopyta.org",
"yewtu.be",
"invidious.toot.koeln",
"invidiou.site",
"invidious.ggc-project.de",
"invidious.fdn.fr"
];
/* Add mirrors for current page to top-left corner of hover-catcher, if exists, or body */
var loc = window.location.pathname + window.location.search + window.location.hash;
document.querySelector('.navbar').appendChild( mirrorDiv(loc) );
/* Add mirrors for thumbnails */
thumbnails = document.querySelectorAll('div.thumbnail');
for(var i = 0; i < thumbnails.length; i++) {
links = mirrorDiv( thumbnails[i].parentElement.href.replace(/^.*\/\/[^\/]+/,'') );
thumbnails[i].appendChild( links );
}
/* Add styles for quick-mirrors and thumbnail link hovers */
var style = document.createElement('style');
style.innerHTML = `
.quick-mirrors {
background: #000;
position: absolute;
top: 0;
right: 0;
z-index: 10;
letter-spacing: initial;
}
.quick-mirrors > a {
display: inline-block;
padding: 2px 3px;
}
.thumbnail > .quick-mirrors > a { display:none; }
.thumbnail:hover > .quick-mirrors > a {display: inline; }
`;
document.head.appendChild(style);
/* Dynamically update current page mirror links startTime */
function updateTime() {
if (typeof player !== 'undefined') {
var url = new URL(this.href);
url.searchParams.set( "start", Math.floor(player.currentTime()) );
this.href = url;
}
}
var updateLinks = document.querySelectorAll('.navbar > .quick-mirrors > a');
for (var i = 0; i < updateLinks.length; ++i) {
updateLinks[i].addEventListener("mouseover", updateTime);
}
/* Create quick mirrors div for URL */
function mirrorDiv(link) {
var div = document.createElement('div');
for(var i = 0; i < instances.length; i++) {
var url = new URL('https://' + instances[i] + link);
//url.searchParams.set("quality", "dash");
div.innerHTML += ' <a href="' + url + '" title="' + instances[i] + '">' + (i+1) + '</a>';
}
div.className = 'quick-mirrors';
return div
}