YouTube Cleaner [RUS]

Удаляет рекомендованные видео на YouTube

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        YouTube Cleaner [RUS]
// @namespace	kL0c81Ys0K4OHUP4pHKdVIfZq6IaRbae
// @version	    0.3
// @description	Удаляет рекомендованные видео на YouTube
// @license     WTFPL
// @include	    *://youtube.com/*
// @include	    *://*.youtube.com/*
// @run-at      document-start
// @grant       none
// ==/UserScript==

(function() {
    'use strict';
    /*
    
    Итак, краткая инструкция.

    Некоторые видео выводятся большими блоками с заголовком полужирным шрифтом. В заголовке
    написано либо название канала, либо "Рекомендованные", либо название сборника видео,
    как, например, "Фильмы" или "Игры". Для удаления таких блоков целиком Вы можете добавить
    текст из заголовка в массив headers_blocklist. Часто рядом с таким заголовком написано
    мелким шрифтом "Рекомендуемые вам" или "Рекомендованный канал". Эти мелкие надписи фильтруются
    аналогично заголовкам, т.е. если добавить в headers_blocklist надпись "Рекомендуемый канал" -
    с главной страницы будут удалены все каналы с такой пометкой. Можно добавлять не весь текст, а
    лишь его часть. Таким образом можно добавить в фильтр фрагмент "Рекоменд", который удалит и
    "Рекомендуемые", и "Рекомендуемые вам" и "Рекомендованный канал".
    
    Также вы можете удалять отдельные видео с главной странице по имени канала. Для этого
    надо лишь добавить по шаблону название канала в фильтр channels_blocklist, или добавить
    туда фрагмент названия канала. Будут удалены все видео с этого канала. Если вы хотите
    удалить сразу весь блок такого канала - добавьте его в headers_blocklist.

    С версии 0.2 названия каналов и заголовков стали регистронезависимы.
     
    Как добавлять в фильтр свой текст? Просто перед закрывающейся квадратной скобкой
    поставьте запятую, перейдите на следующую строку и впишите в апострофах то, что
    вам нужно.
    Пример:
     
    Было 
     var a = [
     'alpha',
     'beta',
     'gamma'];
     
    Стало
     var a = [
     'alpha',
     'beta',
     'gamma',
     'lambda'];
     
    В этом примере в фильтр добавлен элемент 'lambda'.
    Если вы хотите чтобы скрипт автоматически редиректил вас в подписки
    с главной страницы - измените redirect_to_subscriptions на true.
    ВНИМАНИЕ: Клинер жёсткий! Будьте аккуратны с фильтрами!
    
    Скрипт пытается автоматически подгрузить ещё видео если было очищено слишком
    много (иногда выводится много видео, которые соответствуют фильтру). Иногда
    остаются полностью пустые блоки - они удаляются не сразу, но удаляются.
    
    Стандартные фильтры написаны для Рунета, но вы можете переписать их.
    Что фильтруют стандартные фильтры:
    - Блок рекомендаций (обычно самый первый)
    - Рекомендованные каналы
    - Популярные на YouTube видео (не из подписок)
    - Всякие плейлисты
    - Подборки типа "Музыка", "Игры" и т.д.
    - Любые каналы, в которых присутствует строка "YouTube " (именно так, с пробелом)
    Не переборщите с фильтрами! :)
    
    */
    
    if(window.location.pathname !== '/') return;  // Скрипт нужен лишь на главной.
    
    var redirect_to_subscriptions = false;
    var header_blocklist = [
        'Рекомендованные',
        'Рекомендовано',
        'Рекомендованный канал',
        'Популярные на YouTube',
        'популярные видео',
        'Плейлисты',
        'Фильмы',
        'Мультфильмы',
        'Музыка',
        'Игры',
        'Спорт',
        'Ролевые экшн-игры',
        'Christopher James'];
    
    var channels_blocklist = [
        'YouTube '];
    
    if((redirect_to_subscriptions)&&(document.location.pathname == '/')) document.location.pathname = '/feed/subscriptions';
    
    function checkArray(r,n){for(var e=0;e<n.length;e++)if(r.toUpperCase().indexOf(n[e].toUpperCase())>-1)return!0;return!1;}
    function loadNewBlocks() {
     if((document.querySelectorAll('.branded-page-module-title-text').length<3)&&(document.querySelector('.load-more-text')))
        document.querySelector('.load-more-text').click(); }
    function removeWasteHeaders(selector, blist) {
        var elems = document.querySelectorAll(selector);
        for(var i=0;i<elems.length;i++) if(checkArray(elems[i].innerHTML, blist)) elems[i].closest('ol').remove();
    }
    
    function removeWasteChannels(selector, blist) {
    var docs = document.querySelectorAll(selector);
    for(var z=0; z<docs.length; z++) if(checkArray(docs[z].innerHTML, blist)) docs[z].closest('div.feed-item-dismissable').remove();
    }
    
    function removeEmptyBlocks(selector){
        var elems = document.querySelectorAll(selector);
        for(var z=0;z<elems.length;z++) if(elems[z].innerHTML == '<div class="feed-item-dismissal-notices"></div>') elems[z].closest('ol.item-section').remove();
    }

    function getSubscriptions() {
        var arr = [];
        var subs_elems = document.querySelector('#guide-subscriptions-container').querySelectorAll('div > ul > li[class*="guide-channel"] > a');
        for(var z=0; z<subs_elems.length; z++) arr.push(subs_elems[z].title);
        arr.sort();
        return arr;
    }

    function clearAll()  {
        removeWasteHeaders('span[class="shelf-annotation shelf-title-annotation"]', header_blocklist);
        removeWasteHeaders('span[class="branded-page-module-title-text"]', header_blocklist);  
        removeWasteHeaders('span[class="shelf-featured-badge"]', header_blocklist);
        removeWasteChannels('a[href^="/user/"][class^="g-hovercard yt-uix-sessionlink"][data-sessionlink][data-ytid]', channels_blocklist);
        removeWasteChannels('a[href^="/channel/"][class^="g-hovercard yt-uix-sessionlink"][data-sessionlink][data-ytid]', channels_blocklist);
        removeEmptyBlocks('div[class="feed-item-container browse-list-item-container yt-section-hover-container compact-shelf shelf-item branded-page-box clearfix"][data-visibility-tracking]');
    }
    clearAll();
    document.addEventListener("DOMNodeInserted", function(event) { clearAll(); });
    window.onload = function() { clearAll(); loadNewBlocks(); };
})();