Hide YouTube Shorts from Search and Feed

Скрывает элементы "Shorts" из выдачи поиска и ленты на YouTube, чтобы помочь не отвлекаться на короткие ролики.

// ==UserScript==
// @name         Hide YouTube Shorts from Search and Feed
// @namespace    http://tampermonkey.net
// @version      0.1
// @description  Скрывает элементы "Shorts" из выдачи поиска и ленты на YouTube, чтобы помочь не отвлекаться на короткие ролики.
// @author       Anonymous
// @match        https://www.youtube.com/*
// @grant        none
// @run-at       document-end
// @license      MIT
// ==/UserScript==
(function() {
    'use strict';

    // Функция для скрытия всех элементов, связанных с YouTube Shorts
    function hideShortsElements() {
        // Массив всех селекторов, элементы которых нужно скрыть
        const selectorsToHide = [
            '.yt-spec-touch-feedback-shape__fill',        // Элементы с этим классом
            '.ytGridShelfViewModelGridShelfItem',          // Элементы с этим классом
            '.shortsLockupViewModelHostThumbnailContainer', // Контейнеры с миниатюрами Shorts
            '.shortsLockupViewModelHostMetadataTitle',    // Титулы видео Shorts
            '.yt-spec-button-shape-next',                  // Кнопки и элементы управления
            '.yt-icon-shape',                              // Логотипы иконки "Shorts"
            '.yt-core-attributed-string',                  // Все строки текста
            '.yt-section-header-view-model',               // Заголовки секций
            '.shelf-header-layout-wiz',                    // Секции на странице
            '.shelf-header-layout-wiz__label-container',   // Контейнеры для меток секций
            '.shelf-header-layout-wiz__title',             // Заголовки секций, например "Shorts"
            '.ytd-rich-grid-media',                        // Элементы на странице, относящиеся к сетке видео
            'hr',                                         // Линии-разделители
            '.yt-uix-tooltip',                             // Всплывающие подсказки
            '.yt-spec-divider',                           // Разделители
        ];

        // Проходим по каждому селектору и скрываем соответствующие элементы
        selectorsToHide.forEach(function(selector) {
            document.querySelectorAll(selector).forEach(function(element) {
                element.style.display = 'none';
            });
        });

        // Скрываем заголовки с текстом "Shorts" в отдельных блоках
        document.querySelectorAll('.yt-core-attributed-string').forEach(function(element) {
            if (element.textContent.trim().toLowerCase() === 'shorts') {
                element.style.display = 'none';
            }
        });
    }

    // Вызов функции сразу после загрузки страницы
    hideShortsElements();

    // Создаем MutationObserver, чтобы отслеживать изменения на странице
    const observer = new MutationObserver(function(mutationsList, observer) {
        // При изменениях на странице снова скрываем элементы
        hideShortsElements();
    });

    // Наблюдаем за изменениями в DOM
    observer.observe(document.body, {
        childList: true,  // Отслеживаем добавление/удаление дочерних элементов
        subtree: true,    // Отслеживаем все дочерние элементы на странице
    });
})();