您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a button to hide all watched/upcoming videos from the subscription page
当前为
- // ==UserScript==
- // @name YouTube - "Hide watched videos" button
- // @description Adds a button to hide all watched/upcoming videos from the subscription page
- // @version 2022.11.23.21.16
- // @author MetalTxus
- // @namespace https://github.com/jesuscc1993
- // @icon https://www.youtube.com/favicon.ico
- // @match https://www.youtube.com/*
- // @require https://code.jquery.com/jquery-3.2.1.min.js
- // ==/UserScript==
- /* globals jQuery */
- (() => {
- 'use strict';
- let buttonElement;
- const shouldRender = () => {
- return !!location.href.match(urlPattern).length;
- }
- const hideWatchedVideos = () => {
- const watchedVideos = jQuery('[id="progress"], [overlay-style="UPCOMING"]').parents(videosSelector);
- watchedVideos.css('display', 'none');
- const leftVideosCount = jQuery(videosSelector).length - watchedVideos.length;
- buttonElement.text(`Hide watched (${watchedVideos.length} videos hid / ${leftVideosCount} videos left)`);
- // remove headers from sections past the first one
- jQuery('ytd-item-section-renderer:not(:nth-child(1))').css('border', 'none');
- jQuery('ytd-item-section-renderer:not(:nth-child(1)) .grid-subheader').css('display', 'none');
- jQuery('ytd-item-section-renderer:not(:nth-child(1)) #contents.ytd-shelf-renderer').css('margin-top', 0);
- };
- const handleButtonPresence = () => {
- if (shouldRender()) {
- const buttonContainerElement = jQuery(`
- [page-subtype="channels"] ytd-rich-grid-renderer,
- [page-subtype="subscriptions"] ytd-section-list-renderer,
- ytd-search ytd-section-list-renderer
- `).first();
- if (buttonContainerElement.length && !buttonContainerElement.find(buttonElement).length) {
- buttonElement.off('click').on('click', hideWatchedVideos);
- buttonContainerElement.prepend(buttonElement);
- }
- } else {
- buttonElement.remove();
- }
- };
- const initialize = () => {
- buttonElement = buttonElement = jQuery(`
- <tp-yt-paper-button class="style-scope ytd-subscribe-button-renderer mt-hide-watched-button">
- Hide Watched
- </tp-yt-paper-button>
- `);
- /*const observer = new MutationObserver(handleButtonPresence);
- observer.observe(document.body, { childList: true, subtree: true });
- handleButtonPresence();*/
- jQuery('head').append(`
- <style>
- .mt-hide-watched-button {
- border-radius: 8px !important;
- width: 100%;
- }
- [page-subtype="channels"] .mt-hide-watched-button,
- [page-subtype="subscriptions"] .mt-hide-watched-button {
- margin-top: 24px;
- }
- .ytd-search ytd-section-list-renderer .mt-hide-watched-button {
- margin: 12px 0;
- }
- </style>
- `);
- setInterval(handleButtonPresence, 150);
- }
- initialize();
- const videosSelector = 'ytd-grid-video-renderer, ytd-video-renderer, ytd-rich-item-renderer';
- const urlPattern = /youtube.com\/((channel\/|c\/|@)(.*)\/videos|feed\/subscriptions|results)/;
- })();