// ==UserScript== // @name YouTube to Invidious // @author OdinBrood, Jesús E. // @namespace InvidiousRedirect // @description Scan page for Youtube embeds and urls and replace with Invidious. // @homepageURL https://libregit.org/heckyel/book/src/branch/master/scripts-greasemonkey // @include * // @exclude /^http(s|)://(www[.]|)invidio[.]us/.*$/ // @exclude /^http(s|)://(www[.]|proxy[.]|)invidious[.]snopyta[.]org/.*$/ // @exclude /^http(s|)://(www[.]|)vid[.]wxzm[.]sx/.*$/ // @exclude /^http(s|)://(www[.]|)invidious[.]kabi[.]tk/.*$/ // @exclude /^http(s|)://(www[.]|)invidiou[.]sh/.*$/ // @exclude /^http(s|)://(www[.]|)invidious[.]enkirton[.]net/.*$/ // @exclude /^http(s|)://(www[.]|)tube[.]poal[.]co/.*$/ // @exclude /^http(s|)://(www[.]|)invidious[.]13ad[.]de/.*$/ // @grant GM_xmlhttpRequest // @version 8.4.5 // @license GPL version 3 or any later version::: https://www.gnu.org/licenses/gpl-3.0.html // ==/UserScript== /* jshint esversion: 6 */ // set you favorite Invidious instance! (https://github.com/omarroth/invidious/wiki/Invidious-Instances) let instance = 'invidio.us'; // Console Style - Debug let consoleCSS = 'background: #000; color: #00FF00; padding: 0px 7px; border: 1px solid #00FF00; line-height: 16px;'; // change script options, default values recommended let a=1; //set to 0 to force autoplay off, set to 1 to keep embed's value [default 1] let b=1; //set to 0 to not replace all youtube links to Invidious [default 1] let c=1; //set to 0 to disable DASH playback (beta feature) [default 1] let d=1; //set to 0 to disable Invidious proxy [default 1] let e=1; //set to 0 to disable bypass of url shorteners [default 1] let ytdomains=new RegExp(/http(s|)\:\/\/(m[.]|i[.]|www[.]|img[.]|)(youtu(|be|be-nocookie)|.*ytimg)[.](com|be)\/.*/); let shorteners=new RegExp(/^http(s|):\/\/(bit.ly|goo.gl|tinyurl.com|t.co|ow.ly|is.gd|buff.ly|deck.ly|su.pr|lnk.co|fur.ly|moourl.com|)\/.*/); let params=new RegExp(/^(autoplay|channel|v|playlist|list)$/); let current=window.location.href.match(ytdomains)===null; let frames,thumbs,links,skip; if(current){ frames=Array.prototype.slice.call(document.getElementsByTagName('iframe')).filter(ytel); thumbs=Array.prototype.slice.call(document.getElementsByTagName('img')).filter(ytel); if(b==1)links=Array.prototype.slice.call(document.getElementsByTagName('a')).filter(ythref); if(frames.length>0)embed(); if(thumbs.length>0)thumb(); if(links.length>0)link(); statuscheck(); }else{ let title=Array.prototype.slice.call(document.getElementsByTagName('h1')); addbtn(); } let observer=new MutationObserver(function(mutations){ mutations.forEach(function(mutation){ if(current){ frames=Array.prototype.slice.call(mutation.target.getElementsByTagName('iframe')).filter(ytel); thumbs=Array.prototype.slice.call(mutation.target.getElementsByTagName('img')).filter(ytel); if(frames.length>0)embed(); if(thumbs.length>0)thumb(); if(b==1){ links=Array.prototype.slice.call(mutation.target.getElementsByTagName('a')).filter(ythref); if(links.length>0)link(); } }else{ skip=Array.prototype.slice.call(mutation.target.getElementsByClassName('skipinv')); if(skip<1){ title=Array.prototype.slice.call(mutation.target.getElementsByTagName('h1')); addbtn(); } } }); }); observer.observe(document.body,{childList:true,subtree:true}); function embed(){ for(let i=0;i'; btn.href='javascript:void(0)'; btn.onclick=function(){redir();}; btn.className='skipinv'; title[i].parentNode.appendChild(btn); } } function redir(){ let url=new URL(window.location.href); url.hostname=instance; location.href=url; } function unshorten(long,short){ frames=Array.prototype.slice.call(document.getElementsByTagName('iframe')); for(let k=0;k