Removes Home and Shorts buttons, and redirects to Subscriptions feed
当前为
// ==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);
};
})();