Greasy Fork is available in English.
Удаляет рекомендованные видео на YouTube
// ==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(); }; })();