YouTube Lite (更好的体验)

使YouTube界面更加动态,隐藏包含关键词的视频,添加下载按钮并在无广告页面(嵌入youtube-nocookie)中打开视频。

// ==UserScript==
// @name       YouTube Lite (melhor experiência)
// @name:pt       YouTube Lite (melhor experiência)
// @name:pt-PT       YouTube Lite (melhor experiência)
// @name:pt-BR       YouTube Lite (melhor experiência)
// @name:es       YouTube Lite (la mejor experiencia)
// @name:en       YouTube Lite (best experience)
// @name:fr       YouTube Lite (meilleure expérience)
// @name:ru       YouTube Lite (лучший опыт)
// @name:ja       YouTube Lite (最高のエクスペリエンス)
// @name:ko       YouTube Lite (최고의 경험)
// @name:zh-TW       YouTube Lite (更佳體驗)
// @name:zh-CN       YouTube Lite (更好的体验)
// @name:id       YouTube Lite (pengalaman terbaik)
// @name:ug       YouTube Lite (ئەڭ ياخشى تەجرىبە)
// @name:ar       YouTube Lite (أفضل تجربة)
// @name:he       YouTube Lite (חוויית השימוש הטובה ביותר)
// @name:hi       YouTube Lite (सर्वश्रेष्ठ अनुभव)
// @name:th       YouTube Lite (ประสบการณ์ที่ดีที่สุด)
// @name:bg       YouTube Lite (най-добър опит)
// @name:ro       YouTube Lite (cea mai bună experiență)
// @name:fi       YouTube Lite (paras kokemus)
// @name:it       YouTube Lite (migliore esperienza)
// @name:el       YouTube Lite (καλύτερη εμπειρία)
// @name:eo       YouTube Lite (plej bona sperto)
// @name:hu       YouTube Lite (legjobb élmény)
// @name:nb       YouTube Lite (beste opplevelse)
// @name:sk       YouTube Lite (najlepšia skúsenosť)
// @name:sv       YouTube Lite (bästa upplevelsen)
// @name:sr       YouTube Lite (најбоље искуство)
// @name:pl       YouTube Lite (najlepsze doświadczenie)
// @name:nl       YouTube Lite (beste ervaring)
// @name:de       YouTube Lite (beste Erfahrung)
// @name:da       YouTube Lite (bedste oplevelse)
// @name:cs       YouTube Lite (nejlepší zkušenost)
// @name:uk       YouTube Lite (найкращий досвід)
// @name:tr       YouTube Lite (en iyi deneyim)
// @name:vi       YouTube Lite (trải nghiệm tốt nhất)
// @name:fr-CA      YouTube Lite (meilleure expérience)

// @namespace    http://linkme.bio/jhonpergon/?userscript=youtube_lite
// @version      3.5 // Updated version to reflect changes
// @author       Jhon Pérgon
// @license      MIT

// @description       Deixa a interface do YouTube mais leve, oculta vídeos com palavras-chaves, adiciona botão de download e abre o vídeo em uma página livre de anúncios (embed youtube-nocookie).
// @description:pt       Deixa a interface do YouTube mais leve, oculta vídeos com palavras-chaves, adiciona botão de download e abre o vídeo em uma página livre de anúncios (embed youtube-nocookie).
// @description:pt-PT       Deixa a interface do YouTube mais leve, oculta vídeos com palavras-chaves, adiciona botão de download e abre o vídeo em uma página livre de anúncios (embed youtube-nocookie).
// @description:pt-BR       Deixa a interface do YouTube mais leve, oculta vídeos com palavras-chaves, adiciona botão de download e abre o vídeo em uma página livre de anúncios (embed youtube-nocookie).
// @description:es      Hace que la interfaz de YouTube sea más dinámica, oculta videos con palabras clave, agrega un botón de descarga y abre el video en una página sin publicidad (embed youtube-nocookie).
// @description:en      Makes the YouTube interface lighter, hides videos with keywords, adds a download button and opens the video on an ad-free page (embed youtube-nocookie).
// @description:fr      Il rend l'interface YouTube plus dynamique, masque les vidéos avec des mots-clés, ajoute un bouton de téléchargement et ouvre la vidéo sur une page sans publicité (embed youtube-nocookie).
// @description:ru      Он делает интерфейс YouTube более динамичным, скрывает видео с ключевыми словами, добавляет кнопку загрузки и открывает видео на странице без рекламы (встроить youtube-nocookie).
// @description:ja      YouTube インターフェースをより動的にし、キーワードを含むビデオを非表示にし、ダウンロード ボタンを追加して、広告なしのページ (youtube-nocookie embed) でビデオを開きます。
// @description:ko      YouTube 인터페이스를 더욱 동적으로 만들고, 키워드로 동영상을 숨기고, 다운로드 버튼을 추가하고, 광고 없는 페이지에서 동영상을 엽니다(youtube-nocookie embed).
// @description:zh-TW      使YouTube介面更加動態,隱藏包含關鍵字的影片,新增下載按鈕,並在無廣告頁面(嵌入youtube-nocookie)中開啟影片。
// @description:zh-CN      使YouTube界面更加动态,隐藏包含关键词的视频,添加下载按钮并在无广告页面(嵌入youtube-nocookie)中打开视频。
// @description:id      Membuat antarmuka YouTube lebih ringan, menyembunyikan video dengan kata kunci, menambahkan tombol unduh, dan membuka video di halaman tanpa iklan (sematkan youtube-nocookie).
// @description:ug       يوتۇب يېڭىلاندۇرغۇچى كىرىشتىمىنى ياقسى قىلىدۇ، ئاڭلىق سۆزلىك ۋىدېئولارنى يوپۇش قىلىدۇ، چۈشۈرمە تومبۇلى قوشىدۇ ۋە چىراق ئېكراندا (youtube-nocookie sematka qilish) ۋىدېئونى ئېچىدۇ.
// @description:ar      يجعل واجهة يوتيوب أخف وزنًا، يخفي مقاطع الفيديو بكلمات مفتاحية، يضيف زر تنزيل ويفتح الفيديو على صفحة خالية من الإعلانات (تضمين youtube-nocookie).
// @description:he      הופך את ממשק YouTube לקל יותר, מסתיר סרטונים עם מילות מפתח, מוסיף לחצן הורדה ופותח את הסרטון על דף נטול פרסומות (הטמעת youtube-nocookie).
// @description:hi      यूट्यूब इंटरफ़ेस को हल्का बनाता है, कीवर्ड के साथ वीडियो को छुपाता है, डाउनलोड बटन जोड़ता है और एड-मुक्त पृष्ठ पर वीडियो खोलता है (youtube-nocookie embed)।
// @description:th      ทำให้อินเตอร์เฟซ YouTube เบาขึ้น, ซ่อนวิดีโอด้วยคำสำคัญ, เพิ่มปุ่มดาวน์โหลด และเปิดวิดีโอบนหน้าไม่มีโฆษณา (ฝัง youtube-nocookie) ให้ดู
// @description:bg      Прави интерфейса на YouTube по-лек, скрива видеоклипове с ключови думи, добавя бутон за изтегляне и отваря видеоклипа на страница без реклами (вграждане на youtube-nocookie).
// @description:ro      Face interfața YouTube mai ușoară, ascunde videoclipurile cu cuvinte cheie, adaugă un buton de descărcare și deschide videoclipul pe o pagină fără reclame (încorporare youtube-nocookie).
// @description:fi      Tekee YouTube-liittymästä kevyemmän, piilottaa avainsanalla varustetut videot, lisää latauspainikkeen ja avaa videon mainoksettomalle sivulle (upottaa youtube-nocookie).
// @description:it      Rende l'interfaccia di YouTube più leggera, nasconde i video con parole chiave, aggiunge un pulsante di download e apre il video su una pagina senza pubblicità (embed youtube-nocookie).
// @description:el      Καθιστά τη διεπαφή του YouTube πιο ελαφριά, αποκρύπτει τα βίντεο με λέξεις-κλειδιά, προσθέτει ένα κουμπί λήψης και ανοίγει το βίντεο σε μια σελίδα χωρίς διαφημίσεις (ενσωμάτωση youtube-nocookie).
// @description:eo      Faras la interfaco de YouTube pli malpeza, kaŝas videojn kun ŝlosilvortoj, aldonas elŝut-butonon kaj malfermas la videon en senanonca paĝo (enteni youtube-nocookie).
// @description:hu      Könnyebbé teszi a YouTube felületét, kulcsszavakkal elrejti a videókat, hozzáad egy letöltés gombot, és az videót hirdetések nélküli oldalon nyitja meg (beágyazott youtube-nocookie).
// @description:nb      Gjør YouTube-grensesnittet lettere, skjuler videoer med søkeord, legger til en nedlastingsknapp og åpner videoen på en annonsefri side (innbygg youtube-nocookie).
// @description:sk      Robí rozhranie YouTube ľahším, skrýva videá s kľúčovými slovami, pridáva tlačidlo na stiahnutie a otvára video na stránke bez reklám (vložiť youtube-nocookie).
// @description:sv      Gör YouTube-gränssnittet lättare, gömmer videor med nyckelord, lägger till en nedladdningsknapp och öppnar videon på en annonsfri sida (bädda in youtube).
// @description:sr      Прави интерфејс YouTube-а лакшим, сакрива видее са кључним речима, додаје дугме за преузимање и отвара видео на страници без реклама (уградња youtube-nocookie).
// @description:pl      Uczy interfejs YouTube'a lżejszym, ukrywa filmy z słowami kluczowymi, dodaje przycisk do pobierania i otwiera film na stronie bez reklam (osadzanie youtube-nocookie).
// @description:nl      Maakt de YouTube-interface lichter, verbergt video's met trefwoorden, voegt een downloadknop toe en opent de video op een advertentievrije pagina (insluiten youtube-nocookie).
// @description:de      Macht die YouTube-Benutzeroberfläche leichter, versteckt Videos mit Schlüsselwörtern, fügt einen Download-Button hinzu und öffnet das Video auf einer werbefreien Seite (einbetten youtube-nocookie).
// @description:da      Gør YouTube-grænsefladen lettere, skjuler videoer med søgeord, tilføjer en downloadknap og åbner videoen på en reklamefri side (indlejre youtube-nocookie).
// @description:cs      Dělá YouTube rozhraní lehčí, skrývá videa s klíčovými slovy, přidává tlačítko ke stažení a otevírá video na stránce bez reklam (vložit youtube-nocookie).
// @description:uk      Робить інтерфейс YouTube легшим, приховує відео з ключовими словами, додає кнопку завантаження та відкриває відео на сторінці без реклами (вбудовувати youtube-nocookie).
// @description:tr      YouTube arayüzünü daha hafif hale getirir, anahtar kelimelerle videoları gizler, indirme düğmesi ekler ve videoyu reklamsız bir sayfada açar (yerleştirme youtube-nocookie).
// @description:vi      Làm cho giao diện YouTube nhẹ hơn, ẩn đi các video có từ khóa, thêm nút tải xuống và mở video trên trang không có quảng cáo (nhúng youtube-nocookie).
// @description:fr-CA      Rend l'interface YouTube plus légère, masque les vidéos avec des mots-clés, ajoute un bouton de téléchargement et ouvre la vidéo sur une page sans publicité (intégrer youtube-nocookie).

// @match           https://www.youtube.com/*
// @match           https://m.youtube.com/*
// @match           https://youtu.be/*
// @match           https://www.youtube-nocookie.com/*
// @exclude         https://music.youtube.com/*
// @exclude         https://www.youtube.com/embed/*
// @exclude         https://youtube.com/embed/*
// @icon         https://icons.iconarchive.com/icons/designbolts/cute-social-media/256/Youtube-icon.png

// @grant        GM_addStyle
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_deleteValue
// @license      MIT
// @run-at      document-start
// @compatible      chrome
// @compatible      firefox
// @compatible      opera
// @compatible      edge
// @compatible      safari
// @compatible      berrybrowser
// ==/UserScript==

(function() {
    'use strict';

    // --- CONFIGURATION AND INITIAL SETUP ---
    // User-configurable settings
    const config = {
        // Automatically redirect to the ad-free youtube-nocookie domain
        // Set to `true` to enable, `false` to disable.
        redirectToNoCookie: true,
        // The version of the script. Used for first-run logic.
        scriptVersion: '3.5'
    };

    const currentUrl = window.location.href;
    const isVideoPage = currentUrl.includes('v=');
    let videoId = null;
    let keywords = [];

    // Language-specific text for user messages.
    // Simplified into a single object for easier management.
    const i18n = {
        'firstRun': {
            'en': 'Note: You are accessing version {version} of Youtube Lite for the first time. To ensure its proper functioning, we will clear the cookies and restart the page.',
            'pt-BR': 'Nota: Você está acessando a versão {version} do Youtube Lite pela primeira vez. Para garantir o seu correto funcionamento, iremos limpar os cookies e reiniciar a página.',
            'ru': 'Примечание: Вы впервые открываете версию {version} Youtube Lite. Для обеспечения её правильной работы мы очистим куки и перезапустим страницу.',
            // Add other languages here.
        },
        'reloading': {
            'en': 'Done. The page will be reloaded with your language.',
            'pt-BR': 'Feito. A página será recarregada com seu idioma.',
            'ru': 'Готово. Страница будет перезагружена с вашим языком.',
            // Add other languages here.
        },
        'keywordsSaved': {
            'en': 'Saved! The page will be reloaded to activate the hiding of new keywords.',
            'pt-BR': 'Salvo! A página será recarregada para ativar a ocultação das novas palavras-chave.',
            'ru': 'Сохранено! Страница будет перезагружена для активации скрытия новых ключевых слов.',
            // Add other languages here.
        },
        'projectLink': {
            'en': 'Open Youtube Lite project page',
            'pt-BR': 'Abrir página do projeto Youtube Lite',
            'ru': 'Открыть страницу проекта Youtube Lite',
            // Add other languages here.
        }
    };

    function getLocalizedText(key, replacements = {}) {
        const userLang = (navigator.language || navigator.userLanguage).toLowerCase().substring(0, 5);
        let langCode = Object.keys(i18n[key]).find(lang => userLang.startsWith(lang)) || 'en';
        let text = i18n[key][langCode];
        for (const [placeholder, value] of Object.entries(replacements)) {
            text = text.replace(`{${placeholder}}`, value);
        }
        return text;
    }


    // --- UTILITY FUNCTIONS ---

    // Function to extract video ID from URL
    function getVideoIdFromUrl(url = currentUrl) {
        let match = url.match(/(?:v=|youtu\.be\/)([^&?]+)/);
        return match ? match[1] : null;
    }

    // Function to set up the keyword hiding logic
    function setupKeywords() {
        const savedKeywordsString = GM_getValue('keyWords', '');
        if (savedKeywordsString) {
            keywords = savedKeywordsString.split(',').map(kw => kw.trim().toLowerCase()).filter(kw => kw.length > 0);
        }
    }

    // Check if an element's text content contains any of the keywords
    function containsKeywords(element) {
        if (!element || keywords.length === 0) return false;
        const text = (element.textContent || '').toLowerCase();
        return keywords.some(keyword => text.includes(keyword));
    }


    // --- CORE LOGIC ---

    // Initial setup and cleanup on document start
    function init() {
        checkFirstRun();
        applyGlobalStyles();
        setupKeywords();
        handlePageRedirection();
    }

    function checkFirstRun() {
        const savedVersion = GM_getValue('version', '0.0');
        if (savedVersion !== config.scriptVersion) {
            alert(getLocalizedText('firstRun', { version: config.scriptVersion }));
            clearAllCookies();
            GM_setValue('version', config.scriptVersion);
            window.location.reload();
        }
    }

    function clearAllCookies() {
        document.cookie.split(';').forEach(cookie => {
            const eqPos = cookie.indexOf('=');
            const name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
            document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT';
        });
    }

    // Apply necessary styles
    function applyGlobalStyles() {
        // Add font-awesome for icons and other custom styles
        GM_addStyle(`
            @import url("https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css");
            .yt-lite-download-button {
                display: flex;
                align-items: center;
                justify-content: center;
                cursor: pointer;
            }
            .yt-lite-hidden {
                display: none !important;
            }
        `);
    }

    // This function will handle redirects and other early-stage logic
    function handlePageRedirection() {
        if (config.redirectToNoCookie && isVideoPage) {
            const videoId = getVideoIdFromUrl();
            if (videoId && !currentUrl.includes('youtube-nocookie.com')) {
                // Redirect to the ad-free version
                window.location.replace(`https://www.youtube-nocookie.com/watch?v=${videoId}`);
            }
        }
    }

    // --- DOM MANIPULATION AND OBSERVER LOGIC ---

    // The main function to observe and modify the page
    function observeDOM() {
        const observer = new MutationObserver(mutations => {
            mutations.forEach(mutation => {
                if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                    mutation.addedNodes.forEach(node => {
                        if (node.nodeType === 1) { // It's an element
                            if (isVideoPage) {
                                // Add download button on video pages
                                addDownloadButton(node);
                                // Skip ads if they appear
                                skipAd(node);
                            }
                            // Hide videos based on keywords
                            hideVideosWithKeywords(node);
                            // Clean up unnecessary elements
                            cleanupLiteInterface(node);
                        }
                    });
                }
            });
        });

        // Start observing the body for changes
        observer.observe(document.body, { childList: true, subtree: true });
    }

    function hideVideosWithKeywords(container) {
        const videoItems = container.querySelectorAll('ytd-rich-item-renderer, ytd-video-renderer');
        videoItems.forEach(item => {
            if (containsKeywords(item)) {
                item.classList.add('yt-lite-hidden');
            }
        });
    }

    function cleanupLiteInterface(container) {
        // Use a more generic approach to remove elements that are not part of the main content
        const elementsToRemove = container.querySelectorAll(
            'ytd-playlist-thumbnail, ytd-moving-thumbnail-renderer, ' +
            'ytd-thumbnail-overlay-toggle-button-renderer, ytd-thumbnail-overlay-inline-unplayable-renderer, ' +
            'ytd-thumbnail-overlay-resume-playback-renderer, iron-iconset-svg, ytd-watch-next-secondary-results-renderer'
        );
        elementsToRemove.forEach(el => el.classList.add('yt-lite-hidden'));
    }

    function skipAd(container) {
        const skipButton = container.querySelector('.ytp-ad-skip-button');
        if (skipButton) {
            skipButton.click();
        }
    }

    function addDownloadButton(container) {
        if (!isVideoPage) return;

        const infoBar = container.querySelector('#info-contents');
        if (infoBar && !infoBar.querySelector('.yt-lite-download-button')) {
            const downloadUrl = `https://ssyoutube.com/watch?v=${videoId}`; // Example download service URL
            const downloadButton = document.createElement('a');
            downloadButton.href = downloadUrl;
            downloadButton.target = '_blank';
            downloadButton.className = 'yt-lite-download-button';
            downloadButton.innerHTML = `
                <span class="bi bi-download"></span>
                <span>Download</span>
            `;
            infoBar.appendChild(downloadButton);
        }
    }


    // --- EXECUTION START ---

    // Run the initial setup
    init();

    // Start the DOM observer after the page is fully loaded to ensure all scripts have run
    window.addEventListener('load', observeDOM);

})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址