Greasy Fork 还支持 简体中文。

Youtube Hide Recomended (English)

Automatically switches YouTube's recommendation column to either "From the series", "from (channel name)", or "Related"

目前為 2025-05-19 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Youtube Hide Recomended (English)
// @name:ja YouTubeのリコメンド自動切換・非表示(英語環境用)
// @version      2025-05-19
// @description Automatically switches YouTube's recommendation column to either "From the series", "from (channel name)", or "Related"
// @description:ja YouTubeのリコメンド欄を自動でFrom the series、from (チャンネル名)、Relatedのどれかに切り替えます
// @author       hirhirbyrd
// @match        https://www.youtube.com/*
 // @license MIT
// @namespace https://greasyfork.org/users/1467931
// ==/UserScript==

(function() {
    'use strict';

    let chname = '';
    let hasClicked = false; // ← 一度だけ実行するためのフラグ

    const observerCallback = () => {
        if (!chname || hasClicked) return; // フラグで2回目以降はスキップ

        const lists = document.querySelector('div#secondary-inner.style-scope.ytd-watch-flexy');

        const elementC = document.querySelector('div#related iron-selector#chips yt-chip-cloud-chip-renderer:has(#text[title="From the series"])');
        const elementA = document.querySelector('div#related iron-selector#chips yt-chip-cloud-chip-renderer:has(#text[title="From ' + chname + '"])');
        const elementB = document.querySelector('div#related iron-selector#chips yt-chip-cloud-chip-renderer:has(#text[title="Related"])');

        if (elementC && elementC.getAttribute('aria-selected') === 'false') {
            lists.hidden = false;
            elementC.click();
            hasClicked = true;
        } else if (elementA && elementA.getAttribute('aria-selected') === 'false') {
            lists.hidden = false;
            elementA.click();
            hasClicked = true;
        } else if (elementB && elementB.getAttribute('aria-selected') === 'false') {
            lists.hidden = false;
            elementB.click();
            hasClicked = true;
        } else if (elementC || elementA || elementAA || elementB) {
            // すでに選択済みの場合も処理完了とみなす
            hasClicked = true;
        } else {
            lists.hidden = true;
        }
    };

    const getAuthorFromJSON = () => {
        const microformatScript = document.querySelector('#microformat script[type="application/ld+json"]');
        if (microformatScript) {
            try {
                const jsonData = JSON.parse(microformatScript.textContent);
                if (jsonData.author) {
                    chname = typeof jsonData.author === 'string' ? jsonData.author : jsonData.author.name;
                    console.log("チャンネル名を取得:", chname);
                    observerCallback(); // 取得後すぐ実行
                }
            } catch (e) {
                console.error("author名の取得に失敗:", e);
            }
        }
    };

    // DOMの変化を監視
    const observer = new MutationObserver(observerCallback);
    observer.observe(document, { childList: true, subtree: true });

    // 初期読み込み時に author を取得
    window.addEventListener('load', () => {
        setTimeout(getAuthorFromJSON, 1000);
    });

})();