Hide Watched YouTube Videos from Recommendations

Hide YouTube videos you've already watched from the recommendations

目前為 2024-10-10 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Hide Watched YouTube Videos from Recommendations
// @namespace    https://tampermonkey.net/
// @version      2.1
// @description  Hide YouTube videos you've already watched from the recommendations
// @author       Nyxia
// @match        *://www.youtube.com/*
// @license      MIT
// @grant        GM_addStyle
// @grant        GM_log
// @grant        GM_openInTab
// ==/UserScript==

(function() {
    'use strict';

    // Function to hide watched videos
    const hideWatchedVideos = () => {
        // Select all video items in the recommendation sections
        const videoItems = document.querySelectorAll('ytd-grid-video-renderer, ytd-compact-video-renderer, ytd-video-renderer');

        videoItems.forEach(video => {
            try {
                // Check if the video has a "watched" label (e.g., 'progress-bar' element indicating it's been watched)
                const progressBar = video.querySelector('.ytd-thumbnail-overlay-resume-playback-renderer');

                // If the video has been partially or fully watched, hide it
                if (progressBar) {
                    video.style.display = 'none';  // Hide the watched video
                    GM_log('Hiding watched video:', video);
                }
            } catch (error) {
                // Log any potential errors for debugging
                console.error('Error hiding watched video:', error);
            }
        });
    };

    // MutationObserver to watch for page updates (e.g., infinite scroll loading more videos)
    const observer = new MutationObserver((mutations) => {
        mutations.forEach((mutation) => {
            hideWatchedVideos();  // Reapply the function every time the page updates
        });
    });

    // Start observing the document for changes in child elements (like new video recommendations)
    observer.observe(document, {
        childList: true,
        subtree: true
    });

    // Initial call to hide videos when the script is first loaded
    hideWatchedVideos();
})();