Hide blocked user in Youtube Live

Dynamically hiding blocked users' chats in Youtube live. Youtubeのライブでブロック済みのユーザのチャットを動的に非表示に変更

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Hide blocked user in Youtube Live
// @namespace    https://twitter.com/rin_jugatla
// @version      0.2.1
// @description  Dynamically hiding blocked users' chats in Youtube live. Youtubeのライブでブロック済みのユーザのチャットを動的に非表示に変更
// @author       rin_jugatla
// @match        https://www.youtube.com/*
// @grant        none
// ==/UserScript==

// ブロックしたユーザの確認
// https://myaccount.google.com/blocklist

// 【Javascript】XPathを使う(document.evaluate)
// https://www.softel.co.jp/blogs/tech/archives/2067
document.getElementsByXPath = function (expression, parentElement) {
    var r = []
    var x = document.evaluate(expression, parentElement || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
    for (var i = 0, l = x.snapshotLength; i < l; i++) {
        r.push(x.snapshotItem(i))
    }
    return r
}

// ページの読み込み完了後処理
window.addEventListener('load', function () {

    function hideAny()
    {
        hideBlockedUser();
        hideCard();
    }

    function hideBlockedUser() {
        // 非表示でないブロック済みのメッセージのみ取得するXPath
        var targetsXPath = '//yt-live-chat-text-message-renderer[@class="style-scope yt-live-chat-item-list-renderer" and not(@style="display: none;")]/div[@id="content"]/span[@id="deleted-state" and not(text() = "")]';
        var targets = document.getElementsByXPath(targetsXPath);
        for(var i = 0; i < targets.length; i++)
        {
            targets[i].parentElement.parentElement.style = "display: none;";
        }
    }

    function hideCard(){
        // 非表示でないチャットガイドラインカードを取得するXPath
        // 「チャットへようこそ!ご自身のプライバシーを守るとともに、YouTube のコミュニティ ガイドラインを遵守することを忘れないでください。」
        var targetsXPath = '//yt-live-chat-viewer-engagement-message-renderer[@class="style-scope yt-live-chat-item-list-renderer" and not(@style="display: none;")]';
        var targets = document.getElementsByXPath(targetsXPath);
        for(var i = 0; i < targets.length; i++)
        {
            targets[i].style = "display: none;";
        }
    }

    // フック
    var mo = new MutationObserver(hideAny);
    var watchTree = document.getElementsByXPath('//div[@id="items" and @class="style-scope yt-live-chat-item-list-renderer"]')[0]
    mo.observe(watchTree, { childList: true });
}, false);