YouTube Subscriptions Only

Removes Home and Shorts buttons, and redirects to Subscriptions feed

目前為 2025-03-04 提交的版本,檢視 最新版本

// ==UserScript==
// @name         YouTube Subscriptions Only
// @namespace    http://tampermonkey.net/
// @version      1.4.0
// @description  Removes Home and Shorts buttons, and redirects to Subscriptions feed
// @author       SanoKei
// @match        https://www.youtube.com/*
// @license MIT
// ==/UserScript==

(function() {
    'use strict';
    
    // Function to remove Home and Shorts buttons
    function removeButtons() {
        // Target both mini-guide and regular guide entries
        const selectors = [
            'ytd-mini-guide-entry-renderer', 
            'ytd-guide-entry-renderer'
        ];
        
        selectors.forEach(selector => {
            const entries = document.querySelectorAll(selector);
            entries.forEach(entry => {
                // Check if the entry is Home or Shorts by examining its title
                const title = entry.querySelector('.title');
                if (title && (title.textContent === 'Home' || title.textContent === 'Shorts')) {
                    entry.style.display = 'none';
                }
            });
        });
    }
    
    // Function to hide shorts videos in subscription feed
    function hideShorts() {
        // Only run on subscription feed
        if (window.location.pathname !== '/feed/subscriptions') return;
        
        // Hide individual shorts videos
        const videoRenderers = document.querySelectorAll('ytd-grid-video-renderer, ytd-rich-item-renderer');
        videoRenderers.forEach(renderer => {
            // Look for shorts indicator - either a "shorts" badge or shorts URL
            const shortsBadge = renderer.querySelector('[overlay-style="SHORTS"], [aria-label*="Shorts"]');
            const shortLink = renderer.querySelector('a[href*="/shorts/"]');
            
            // If this is a shorts video, hide it
            if (shortsBadge || shortLink) {
                renderer.style.display = 'none';
            }
        });
        
        // Find and hide entire shorts shelf/section
        const shortsShelves = document.querySelectorAll('ytd-rich-shelf-renderer');
        shortsShelves.forEach(shelf => {
            // Look for the title element that says "Shorts"
            const titleElement = shelf.querySelector('#title');
            if (titleElement && titleElement.textContent.trim() === 'Shorts') {
                // Get the parent container (usually has id="dismissible")
                const container = shelf.closest('#dismissible, .ytd-rich-section-renderer');
                if (container) {
                    container.style.display = 'none';
                } else {
                    // Hide the shelf itself if we can't find the parent container
                    shelf.style.display = 'none';
                }
            }
        });
    }
    
    // Function to redirect to subscriptions if on homepage
    function redirectToSubscriptions() {
        // Only redirect if we're on the homepage (not already on a video or other page)
        if (window.location.pathname === '/' || window.location.pathname === '/watch') {
            window.location.href = '/feed/subscriptions';
        }
    }
    
    // Function to modify YouTube logo links to go to subscriptions
    function modifyLogoLinks() {
        // Target all YouTube logo links
        const logoLinks = document.querySelectorAll('a.yt-simple-endpoint[href="/"]');
        logoLinks.forEach(link => {
            link.setAttribute('href', '/feed/subscriptions');
        });
    }
    
    // Function to force subscription feed as background for miniplayer
    function fixMiniplayerBackground() {
        // Monitor for miniplayer mode
        const miniPlayer = document.querySelector('ytd-miniplayer');
        if (miniPlayer && miniPlayer.hasAttribute('active')) {
            // Check if we're on the homepage when miniplayer is active
            if (window.location.pathname === '/') {
                // Redirect to subscriptions
                window.history.pushState({}, '', '/feed/subscriptions');
                
                // Force reload content if needed
                const app = document.querySelector('ytd-app');
                if (app) {
                    const appModel = app.getAttribute('app-data-model');
                    if (appModel) {
                        // Trigger internal YouTube content refresh
                        app.fire('yt-navigate', {
                            url: '/feed/subscriptions',
                            forceReload: true
                        });
                    }
                }
            }
        }
    }
    
    // Run the functions periodically to catch dynamic content
    setInterval(() => {
        removeButtons();
        modifyLogoLinks();
        hideShorts();
        fixMiniplayerBackground();
    }, 1000);
    
    // Run once on initial page load
    removeButtons();
    modifyLogoLinks();
    hideShorts();
    fixMiniplayerBackground();
    
    // Redirect if on homepage
    if (window.location.pathname === '/') {
        redirectToSubscriptions();
    }
    
    // Monitor for navigation events within YouTube (for SPA behavior)
    const pushState = history.pushState;
    history.pushState = function() {
        pushState.apply(history, arguments);
        
        // Check if we've navigated to the homepage
        if (window.location.pathname === '/') {
            setTimeout(redirectToSubscriptions, 100);
        }
        
        // Run functions after navigation
        setTimeout(() => {
            removeButtons();
            modifyLogoLinks();
            hideShorts();
            fixMiniplayerBackground();
        }, 500);
    };
})();