YT Comment & Reply Filter

Unicode Blocker, menyembunyikan komentar dan balasan YouTube yang mengandung karakter khusus (bold, italic, full-width, dll.)

// ==UserScript==
// @name         YT Comment & Reply Filter
// @namespace    https://www.youtube.com/@MochAdiCH
// @version      1.5
// @description  Unicode Blocker, menyembunyikan komentar dan balasan YouTube yang mengandung karakter khusus (bold, italic, full-width, dll.)
// @author       Mochamad Adi MR (adimuham.mad)
// @match        *://www.youtube.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @grant        none
// @license      MIT
// @supportURL   https://gist.github.com/adimuhamad/143a06052413aaecb6ddf1a4e39103c1#new_comment_field
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    // Regex yang benar untuk mendeteksi karakter spesial Unicode
    const forbiddenRegex = /[\u2100-\u214F\u2460-\u24FF\u2C00-\u2C5F\uFF00-\uFFEF\uD835][\uDC00-\uDFFF]+/;

    function removeBadComments() {
        let comments = document.querySelectorAll("#content-text"); // Elemen teks komentar utama

        comments.forEach(comment => {
            if (forbiddenRegex.test(comment.innerText)) {
                let commentContainer = comment.closest("ytd-comment-thread-renderer"); // Ambil elemen komentar utama
                if (commentContainer) {
                    commentContainer.style.display = "none"; // Sembunyikan komentar utama
                }
            }
        });
    }

    function removeBadReply() {
        let replies = document.querySelectorAll("ytd-comment-view-model.ytd-comment-replies-renderer"); // Elemen balasan komentar

        replies.forEach(reply => {
            if (forbiddenRegex.test(reply.innerText)) {
                let replyContainer = reply.closest("ytd-comment-replies-renderer"); // Ambil elemen balasan komentar
                if (replyContainer) {
                    replyContainer.style.display = "none"; // Sembunyikan balasan komentar
                }
            }
        });
    }

    // Jalankan filter pertama kali setelah halaman dimuat
    setTimeout(removeBadComments, 3000);

    // Pantau perubahan di DOM (jika ada komentar atau balasan baru)
    const observer = new MutationObserver(() => {
        removeBadComments();
        removeBadReply();
    });

    observer.observe(document.body, { childList: true, subtree: true });

})();