Block youtube users / channels

Prevent from seeing videos by certain users (from recommendation, search... //no in playlists)

Pada tanggal 19 Juli 2015. Lihat %(latest_version_link).

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Block youtube users / channels
// @author       Schegge
// @namespace    https://greatest.deepsurf.us/en/users/12632-schegge
// @description  Prevent from seeing videos by certain users (from recommendation, search... //no in playlists) 
// @version      1.0
// @match        http*://*.youtube.com/*
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

//* INSTRUCTIONS *//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//
//  → the program is case-insensitive                                                                                         //
//  → split the usernames with a comma                                                                                        //
//  → put a * in front of a word for wildcard, it will find the word no matter its position in the username (example: *vevo)  //
//  → after saving refresh the page                                                                                           //
//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//

(function($) {

    var gmSaved = GM_getValue("savedblocks", "the program is case-insensitive, split the usernames with a comma, put a * in front of a word for wildcard, it will find the word no matter its position in the username, example, *vevos, after saving refresh the page, delete all of this");
    var ytblacklist = gmSaved.split(",");    

    // add blacklist button to the menu
    $liButton = $("<li>", {class: "guide-channel guide-notification-item overflowable-list-item", id: "yt-blacklist"} );
    $aButton = $("<a>", {class: "guide-item yt-uix-sessionlink yt-valign spf-link"} );
    $spanButton = $("<span class=\"yt-valign-container\" style=\"padding-left:32px\"><span class=\"display-name no-count\"><span>Blacklist</span></span></span></span>");
    $aButton.append($spanButton);
    $liButton.append($aButton);
    $("#guide-container li.guide-section:nth-child(1) ul.guide-user-links").append($liButton);

    // element for user input
    $divInput = $("<div>", {id: "yt-blacklist-options", css: {"display": "none", "width": "80%", "padding": "10px", "margin": "0 auto 10px auto", "text-align": "center"} });
    $textarea = $("<textarea id=\"blacklist-words\" cols=\"100\" rows=\"5\" style=\"padding:5px;border:2px solid rgba(0,0,0,.13)\">"+ gmSaved + "</textarea>");
    $saveDiv = $("<div>", {id: "saveblacklistDiv", css: {"padding-top": "10px", "width": "600px", "margin": "0 auto", "text-align": "right"} } );    
    $save = $("<span>", {id: "saveblacklist", css: {"cursor": "pointer", "padding": "5px", "color": "#fff", "background": "#cc181e", "font-weight": "bold", "text-shadow": "-1px -1px 0 rgba(0,0,0,0.25)"}, html: "save"} );    
    $saveDiv.append($save);
    $divInput
    .append($textarea)
    .append($saveDiv);
    $("#page-container #page").prepend($divInput);

    // open and close textarea
    $("#yt-blacklist").click(function() {
        $(document).scrollTop(0);
        $("#yt-blacklist-options").slideToggle("200");
    });
    // save
    $("#saveblacklist").click(function() {        
        GM_setValue("savedblocks", $('#blacklist-words').val());
        if ( !$("#saveblacklistDiv #saved").length ) { $("#saveblacklistDiv").prepend("<span id=\"saved\" style=\"padding-right:10px;font-size:.8em\"><em>please refresh the page</em> . SAVED .</span>"); }
    });

    //*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//

    var Program = {

        blacklist: ytblacklist,
        
        sClass: [".g-hovercard", ".yt-uix-tile-link", ".branded-page-module-title-text"], // the classes where usernames are

        findMatch: function(s, b) {
            $(s).each(function() {
                if( $(this).length ) { // if the element exist
                    var username = $(this).text().trim().toLowerCase();
                    var match = false;
                    b = b.trim().toLowerCase();
                    if ( b.charAt(0) == "*" ) { // wildcards
                        var part = b.split("*"),
                            item = part[1];
                        if ( username.indexOf(item) !== -1 ) {
                            match = true;
                        }
                    } else { // exact match
                        if ( username == b ) {
                            match = true;
                        }
                    }

                    if( match ) {
                        if( $(this).parents("#watch-header").length ) {
                            $(".yt-user-info").append("<span style=\"color:rgb(204, 24, 30);font-weight:bold\">BLACKLISTED!</span>");
                        } else {
                            $(this).closest("li").remove();
                        }
                    }
                }
            });
        },

        search: function() {
            for (var i = 0; i < this.sClass.length; i++) {
                for (var j = 0; j < this.blacklist.length; j++) {
                    this.findMatch(this.sClass[i], this.blacklist[j]);
                }
            }
        }
    };

    Program.search();

    //*
    //  code below taken from:
    //  https://hacks.mozilla.org/2012/05/dom-mutationobserver-reacting-to-dom-changes-without-killing-browser-performance/
    //*

    var target = document.querySelector('#content');
    var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            Program.search();
        });    
    });
    var config = { attributes: true, childList: true, characterData: true };
    observer.observe(target, config);

})(window.jQuery);