您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically switches YouTube's recommendation column to either "From the series", "from (channel name)", or "Related"
当前为
- // ==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);
- });
- })();