Youtube to Invidious

Scan page for youtube embeds and urls and replace with Invidious.

目前为 2019-05-08 提交的版本。查看 最新版本

// ==UserScript==
// @name        Youtube to Invidious
// @author      OdinBrood
// @namespace   Krul & Brood
// @description Scan page for youtube embeds and urls and replace with Invidious.
// @exclude     /^http(s|)://(m\.|www\.|)youtube\.com/.*$/
// @exclude     /^http(s|)://(www\.|)invidio\.us/.*$/
// @exclude     /^http(s|)://(www\.|)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/.*$/
// @version     4.1
// ==/UserScript==

var instance="invidio.us"; //set you favorite invidious instance! (https://github.com/omarroth/invidious/wiki/Invidious-Instances)

var a=2; //set to 0 to force autoplay off, 1 to force autoplay on, 2 to keep embed's default
var b=1; //set to 1 to replace all youtube links to invidious
var c=0; //set to 1 to enable DASH playback (invidious beta feature)

var ytdomains=new RegExp(/^http(s|)\:\/\/(m\.|www\.|)youtu(|be|be-nocookie)\.(com|be)\/.*$/);
var filter=Array.filter;
var observer=new MutationObserver(function(mutations){
  mutations.forEach(function(mutation){
    embed(a);
    link();
  });
});
observer.observe(document.body,{childList:true,subtree:true,});
embed(a);
link();

function embed(auto){  
  var frames=filter(document.getElementsByTagName('iframe'),ytel);
  for(var i=0;i<frames.length;i++){
    var url=new URL(frames[i].src);
    url.hostname=instance;
    if(a==2){
      if(!url.searchParams.has('autoplay')){
        url.searchParams.set('autoplay',0);
      }
    }else{
      url.searchParams.set('autoplay',auto);
    }
    if(c==1){
      url.searchParams.set('quality','dash');
    }
    url.searchParams.set('local',true);
    frames[i].src=url;
  }
}

function link(){
  if(b==1){
    var links=filter(document.getElementsByTagName('a'),ytel);
    for(var i=0;i<links.length;i++){
      var url=new URL(links[i].href);
      url.hostname=instance;
      url.searchParams.set('local',true);
      if(c==1){
        url.searchParams.set('quality','dash');
      }
      links[i].href=url;
    }
  }
}

function ytel(el){
  if(el.hasAttribute('src')&&el.src.match(ytdomains)){
    return el;
  }else if(el.hasAttribute('href')&&el.href.match(ytdomains)){
    return el;
  }
  return false;
}