您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Point YouTube links to Invidious, Twitter to Nitter, Instagram to Bibliogram, Reddit to Teddit, Medium to Scribe
// ==UserScript== // @name YT2Invidio // @namespace de.izzysoft // @author Izzy // @description Point YouTube links to Invidious, Twitter to Nitter, Instagram to Bibliogram, Reddit to Teddit, Medium to Scribe // @license CC BY-NC-SA // @include * // @version 1.6.3 // @run-at document-idle // @grant GM.getValue // @grant GM.setValue // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @grant GM.registerMenuCommand // @grant GM_openInTab // @grant GM.openInTab // @grant unsafeWindow // @homepageURL https://codeberg.org/izzy/userscripts // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js // ==/UserScript== // Default Config const defaultConfig = { hosts: {invidious: "invidious.snopyta.org", nitter: "nitter.net", bibliogram: "bibliogram.art", teddit: "teddit.net", scribe: "scribe.rip"}, invProxy: 0 }; /* console.log(defaultConfig.hosts); console.log(obj.hosts.hasOwnProperty('bibliogram')); // true */ // Get the Invidious instance to use for rewrite function doRewrite() { GM.getValue('YT2IConfig',JSON.stringify(defaultConfig)).then(function(result) { rewriteLinks(result); }); } doRewrite(); // Do the actual rewrite function rewriteLinks(config) { console.log(`Using '${config}' for rewrite`); var cfg = JSON.parse(config); var videohost = cfg.hosts.invidious; var nitterhost = cfg.hosts.nitter; var bibliogramhost = cfg.hosts.bibliogram; var teddithost = cfg.hosts.teddit; var scribehost = cfg.hosts.scribe || 'scribe.rip'; var invProxy = 'local=0'; if ( cfg.invProxy == 1 ) { invProxy = 'local=1'; } console.log('Invidious: '+videohost+', Params: '+invProxy); console.log('Nitter: '+nitterhost); console.log('Bibliogram: '+bibliogramhost); console.log('Teddit: '+teddithost); console.log('Scribe: '+scribehost) // --=[ document links ]=-- console.log('Checking '+document.links.length+' links for YT, Twitter, Insta, Reddit & Co.'); for(var i = 0; i < document.links.length; i++) { var elem = document.links[i]; // Youtube: https://www.youtube.com/watch?v=cRRA2xRRgl8 || https://www.youtube.com/channel/dfqwfhqQ34er || https://www.youtube.com/playlist?list=PLjV3HijScGMynGvjJrvNNd5Q9pPy255dL // only rewrite if we're not on Invidious already (too keep the "watch this on YouTube" links intact) if (videohost != '' && elem.href.match(/((www|m)\.)?youtube.com(\/(watch\?v|playlist\?list)=[a-z0-9_-]+)/i)) { if (location.hostname != videohost) { elem.href='https://'+videohost+RegExp.$3+'&'+invProxy; } } else if (videohost != '' && elem.href.match(/((www|m)\.)?youtu.be\/([a-z0-9_-]+)/i)) { if (location.hostname != videohost) { elem.href='https://'+videohost+'/watch?v='+RegExp.$3+'?'+invProxy; } } else if (videohost != '' && elem.href.match(/((www|m)\.)?youtube.com(\/channel\/[a-z0-9_-]+)/i)) { if (location.hostname != videohost) { elem.href='https://'+videohost+RegExp.$3+'?'+invProxy; } // Twitter } else if (nitterhost != '' && elem.href.match(/(mobile\.)?twitter\.com\/([^&#]+)/i)) { if (location.hostname != nitterhost) elem.href='https://'+nitterhost+'/'+RegExp.$2; } // Bibliogram else if (bibliogramhost != '' && elem.href.match(/(www\.)?instagram\.com\/(p|tv)\/([^&#/]+)/i)) { // profile if (location.hostname != bibliogramhost) { elem.href = 'https://'+bibliogramhost+'/p/' + RegExp.$3; } } else if (bibliogramhost != '' && elem.href.match(/(www\.)?instagram\.com\/([^&#/]+)/i)) { // image or video if (location.hostname != bibliogramhost) { elem.href = 'https://'+bibliogramhost+'/u/' + RegExp.$2; } } // Teddit else if (teddithost != '' && elem.href.match(/((www|old)\.)?reddit.com\/(.*)/i)) { if (location.hostname != teddithost) { elem.href = 'https://'+teddithost+'/'+RegExp.$3; } } else if (teddithost != '' && elem.href.match(/(r.nf)\/(.*)/i)) { if (location.hostname != teddithost) { elem.href = 'https://'+teddithost+'/'+RegExp.$2; } } // Scribe else if (scribehost != '' && elem.href.match(/(www\.)?medium\.com\/([^&#]+)/i)) { if (location.hostname != scribehost) elem.href='https://'+scribehost+'/'+RegExp.$2; } } // --=[ embedded links ]=-- // based on https://gf.qytechs.cn/en/scripts/394841-youtube-to-invidio-us-embed if (videohost != '') { var src, dataSrc, iframes = document.getElementsByTagName('iframe'); var embProxy console.log('Checking '+iframes.length+' frames for embedded videos'); for (var i = 0; i < iframes.length; i++) { src = iframes[i].getAttribute('src'); dataSrc = false; if ( src == null ) { src = iframes[i].getAttribute('data-s9e-mediaembed-src'); dataSrc = true; } if ( src == null ) continue; if ( src.match(/((www|m)\.)?youtube.com(\/(watch\?v|playlist\?list)=[a-z0-9_-]+)/i) || src.match(/((www|m)\.)?youtube.com(\/(channel|embed)\/[a-z0-9_-]+)/i) ) { if ( RegExp.$4 == 'channel' || RegExp.$4 == 'embed' ) { embProxy = '?'+invProxy; } else { embProxy = '&'+invProxy; } if ( dataSrc ) { iframes[i].setAttribute('data-s9e-mediaembed-src','https://'+videohost+RegExp.$3+embProxy); } else { iframes[i].setAttribute('src','https://'+videohost+RegExp.$3+embProxy); } // iframes[i].setAttribute('style', 'min-height:100%; min-width:100%;'); iframes[i].setAttribute('frameborder', '0'); iframes[i].setAttribute('allowfullscreen', '1'); } } } console.log('Rewrite done.'); } // Give the user the possibility to set a different preferred instance // A list of available instances can be found at // https://github.com/omarroth/invidious/wiki/Invidious-Instances // https://github.com/zedeus/nitter/wiki/Instances // https://github.com/cloudrac3r/bibliogram/wiki/Instances async function setInvidiousInstance() { let cfgs = await GM.getValue('YT2IConfig',JSON.stringify(defaultConfig)); cfg = JSON.parse(cfgs); var vhost = prompt('Set Invidious instance to:', cfg.hosts.invidious); if ( vhost == '' || vhost.match(/^(https?)?:?[\/]*(.+?)(\/.*)?$/) ) { if ( vhost == '' ) { cfg.hosts.invidious = ''; } else { cfg.hosts.invidious = RegExp.$2; } GM.setValue('YT2IConfig',JSON.stringify(cfg)); } } async function setNitterInstance() { let cfgs = await GM.getValue('YT2IConfig',JSON.stringify(defaultConfig)); cfg = JSON.parse(cfgs); var vhost = prompt('Set Nitter instance to:', cfg.hosts.nitter); if ( vhost == '' || vhost.match(/^(https?)?:?[\/]*(.+?)(\/.*)?$/) ) { if ( vhost == '' ) { cfg.hosts.nitter = ''; } else { cfg.hosts.nitter = RegExp.$2; } GM.setValue('YT2IConfig',JSON.stringify(cfg)); } } async function setBibliogramInstance() { let cfgs = await GM.getValue('YT2IConfig',JSON.stringify(defaultConfig)); cfg = JSON.parse(cfgs); var vhost = prompt('Set Bibliogram instance to:', cfg.hosts.bibliogram); if ( vhost == '' || vhost.match(/^(https?)?:?[\/]*(.+?)(\/.*)?$/) ) { if ( vhost == '' ) { cfg.hosts.bibliogram = ''; } else { cfg.hosts.bibliogram = RegExp.$2; } GM.setValue('YT2IConfig',JSON.stringify(cfg)); } } async function toggleInvidiousProxy() { let cfgs = await GM.getValue('YT2IConfig',JSON.stringify(defaultConfig)); cfg = JSON.parse(cfgs); if ( cfg.invProxy == 1 ) { cfg.invProxy = 0; console.log('Invidious proxying turned off.'); } else { cfg.invProxy = 1; console.log('Invidious proxying turned on.'); } GM.setValue('YT2IConfig',JSON.stringify(cfg)); } async function setTedditInstance() { let cfgs = await GM.getValue('YT2IConfig',JSON.stringify(defaultConfig)); cfg = JSON.parse(cfgs); var vhost = prompt('Set Teddit instance to:', cfg.hosts.teddit); if ( vhost == '' || vhost.match(/^(https?)?:?[\/]*(.+?)(\/.*)?$/) ) { if (vhost=='') { cfg.hosts.teddit = ''; } else { cfg.hosts.teddit = RegExp.$2; } GM.setValue('YT2IConfig',JSON.stringify(cfg)); } } async function setScribeInstance() { let cfgs = await GM.getValue('YT2IConfig',JSON.stringify(defaultConfig)); cfg = JSON.parse(cfgs); var vhost = prompt('Set Scribe instance to:', cfg.hosts.scribe); if ( vhost == '' || vhost.match(/^(https?)?:?[\/]*(.+?)(\/.*)?$/) ) { if (vhost=='') { cfg.hosts.scribe = ''; } else { cfg.hosts.scribe = RegExp.$2; } GM.setValue('YT2IConfig',JSON.stringify(cfg)); } } // open tab with instance list from Invidious/Nitter/Bibliogram/Teddit wiki function openInvidiousList() { GM.openInTab('https://github.com/iv-org/documentation/blob/master/Invidious-Instances.md', { active: true, insert: true }); } function openNitterList() { GM.openInTab('https://github.com/zedeus/nitter/wiki/Instances', { active: true, insert: true }); } function openBibliogramList() { GM.openInTab('https://git.sr.ht/~cadence/bibliogram-docs/tree/master/docs/Instances.md', { active: true, insert: true }); } function openTedditList() { GM.openInTab('https://codeberg.org/teddit/teddit#instances', { active: true, insert: true }); } if ( location.href != 'https://duckduckgo.com/post3.html' ) { // somehow this is called from within a search and causes our script to run again GM.registerMenuCommand('Set Invidious instance',setInvidiousInstance); GM.registerMenuCommand('Show list of known Invidious instances', openInvidiousList ); GM.registerMenuCommand('Toggle Invidious proxy state', toggleInvidiousProxy); GM.registerMenuCommand('Set Nitter instance',setNitterInstance); GM.registerMenuCommand('Show list of known Nitter instances', openNitterList ); GM.registerMenuCommand('Set Bibliogram instance',setBibliogramInstance); GM.registerMenuCommand('Show list of known Bibliogram instances', openBibliogramList ); GM.registerMenuCommand('Set Teddit instance',setTedditInstance); GM.registerMenuCommand('Show list of known Teddit instances', openTedditList ); GM.registerMenuCommand('Set Scribe instance',setScribeInstance); GM.registerMenuCommand('Rewrite now', doRewrite); console.log('registered menus.'); } // register keyboard shortcut Alt+Y to trigger rewrite document.onkeyup=function(e) { var e = e || window.event; // for IE to cover IEs window event-object if(e.altKey && e.which == 89) { doRewrite(); return false; } }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址