Youtube Anti Shorts

shorts is a shit, fuck you youtube

目前為 2022-09-27 提交的版本,檢視 最新版本

// ==UserScript==
// @name                Youtube Anti Shorts
// @name:zh             Youtube Anti Shorts 反短片
// @namespace           Anong0u0
// @version             0.2.4
// @description         shorts is a shit, fuck you youtube
// @description:zh      短片就是坨屎,去你的youtube
// @author              Anong0u0
// @include             *://*.youtube.com/*
// @icon                https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @grant               none
// @license             MIT
// ==/UserScript==


// ===================
// If you don't like these feature, you can turn it off with replace true to false.
// 如果你不喜歡這些功能,你可以把true改成false來關閉。

const Remove_Shorts_Guide_Renderer = true;
const Replace_Shorts_URL = true;
const Redirect_Shorts_URL = true;
// ===================


function delay(ms = 0){return new Promise((r)=>{setTimeout(r, ms)})}

function waitElementLoad(elementSelector, isSelectAll, tryTimes = 1, interval = 0)
{
    return new Promise(async (resolve, reject)=>
    {
        let t = 1, result;
        while(true)
        {
            console.log(`aaa${t}`)
            if(isSelectAll) {if(result = document.querySelectorAll(elementSelector).length > 0) break;}
            else {if(result = document.querySelector(elementSelector)) break;}

            if(++t>tryTimes) {reject(); return;}
            await delay(interval);
        }
        resolve(result);
    })
}


(() =>
{
    var oldHref = null;
    new MutationObserver(() => // onUrlChange
    {
        if (oldHref != window.location.href)
        {
            oldHref = window.location.href

            if(Redirect_Shorts_URL && window.location.pathname.indexOf("/shorts/")!=-1) window.location.replace(window.location.href.replace("/shorts/","/watch?v="))

            if(Remove_Shorts_Guide_Renderer)
            {
                let RSGR = ()=>
                {
                    waitElementLoad("ytd-guide-entry-renderer > a[title=Shorts]", false, 20, 300).then((e)=>
                    {
                        e.remove();
                        Remove_Shorts_Guide_Renderer = false
                        document.querySelector("yt-icon-button#guide-button").removeEventListener("click", RSGR);
                    })
                }
                waitElementLoad("ytd-guide-entry-renderer > a[title=Shorts]", false, 20, 150)
                    .then((e)=>{e.remove(); Remove_Shorts_Guide_Renderer = false})
                    .catch(()=>{document.querySelector("yt-icon-button#guide-button").addEventListener("click", RSGR);})
            }

            if(Replace_Shorts_URL) waitElementLoad("a.ytd-thumbnail", true, 10, 200).then(()=>{document.querySelectorAll("a").forEach((e)=>{e.href = e.href.replace("/shorts/","/watch?v=")})})
        }
    }).observe(document.body, {childList: true, subtree: true});

})();