您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Hide viewed & selected videos from your subscriptions.
- // ==UserScript==
- // @name Hide Watched & Selected Youtubes Videos
- // @description Hide viewed & selected videos from your subscriptions.
- // @include https://www.youtube.com/feed/subscriptions*
- // @include https://www.youtube.com/feed/subscriptions*
- // @license MIT
- // @version 1.7
- // @date 31-01-2017
- // @require https://code.jquery.com/jquery-latest.min.js
- // @namespace https://greasyfork.org/users/59385
- // ==/UserScript==
- // js-cookie
- /*!
- * JavaScript Cookie v2.1.3
- * https://github.com/js-cookie/js-cookie
- *
- * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
- * Released under the MIT license
- */
- ;(function (factory) {
- var registeredInModuleLoader = false;
- if (typeof define === 'function' && define.amd) {
- define(factory);
- registeredInModuleLoader = true;
- }
- if (typeof exports === 'object') {
- module.exports = factory();
- registeredInModuleLoader = true;
- }
- if (!registeredInModuleLoader) {
- var OldCookies = window.Cookies;
- var api = window.Cookies = factory();
- api.noConflict = function () {
- window.Cookies = OldCookies;
- return api;
- };
- }
- }(function () {
- function extend () {
- var i = 0;
- var result = {};
- for (; i < arguments.length; i++) {
- var attributes = arguments[ i ];
- for (var key in attributes) {
- result[key] = attributes[key];
- }
- }
- return result;
- }
- function init (converter) {
- function api (key, value, attributes) {
- var result;
- if (typeof document === 'undefined') {
- return;
- }
- // Write
- if (arguments.length > 1) {
- attributes = extend({
- path: '/'
- }, api.defaults, attributes);
- if (typeof attributes.expires === 'number') {
- var expires = new Date();
- expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
- attributes.expires = expires;
- }
- try {
- result = JSON.stringify(value);
- if (/^[\{\[]/.test(result)) {
- value = result;
- }
- } catch (e) {}
- if (!converter.write) {
- value = encodeURIComponent(String(value))
- .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
- } else {
- value = converter.write(value, key);
- }
- key = encodeURIComponent(String(key));
- key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
- key = key.replace(/[\(\)]/g, escape);
- return (document.cookie = [
- key, '=', value,
- attributes.expires ? '; expires=' + attributes.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
- attributes.path ? '; path=' + attributes.path : '',
- attributes.domain ? '; domain=' + attributes.domain : '',
- attributes.secure ? '; secure' : ''
- ].join(''));
- }
- // Read
- if (!key) {
- result = {};
- }
- // To prevent the for loop in the first place assign an empty array
- // in case there are no cookies at all. Also prevents odd result when
- // calling "get()"
- var cookies = document.cookie ? document.cookie.split('; ') : [];
- var rdecode = /(%[0-9A-Z]{2})+/g;
- var i = 0;
- for (; i < cookies.length; i++) {
- var parts = cookies[i].split('=');
- var cookie = parts.slice(1).join('=');
- if (cookie.charAt(0) === '"') {
- cookie = cookie.slice(1, -1);
- }
- try {
- var name = parts[0].replace(rdecode, decodeURIComponent);
- cookie = converter.read ?
- converter.read(cookie, name) : converter(cookie, name) ||
- cookie.replace(rdecode, decodeURIComponent);
- if (this.json) {
- try {
- cookie = JSON.parse(cookie);
- } catch (e) {}
- }
- if (key === name) {
- result = cookie;
- break;
- }
- if (!key) {
- result[name] = cookie;
- }
- } catch (e) {}
- }
- return result;
- }
- api.set = api;
- api.get = function (key) {
- return api.call(api, key);
- };
- api.getJSON = function () {
- return api.apply({
- json: true
- }, [].slice.call(arguments));
- };
- api.defaults = {};
- api.remove = function (key, attributes) {
- api(key, '', extend(attributes, {
- expires: -1
- }));
- };
- api.withConverter = init;
- return api;
- }
- return init(function () {});
- }));
- // Required
- var style = document.createElement('style');
- style.type = 'text/css';
- style.innerHTML = '.hideButton { width:30px; position: absolute; bottom: 0%; right: 2%; background-color: white;';
- style.innerHTML += 'border-radius: 50%; opacity: 1; }';
- style.innerHTML += '.hideButton:hover { opacity: 1; cursor: pointer;} ';
- //style.innerHTML += '.a.yt-uix-sessionlink.spf-link:hover .hideButton{ opacity: 1;}';
- document.getElementsByTagName('head')[0].appendChild(style);
- // Start
- function hideWatched() {
- if ($("#hide-videos").is(":checked") && window.location.href == "https://www.youtube.com/feed/subscriptions" || window.location.href == "http://www.youtube.com/feed/subscriptions") {
- $(".ytd-thumbnail-overlay-resume-playback-renderer").each(function() {
- $(this).closest("ytd-grid-video-renderer").hide();
- });
- }
- }
- function showWatched() {
- $("ytd-grid-video-renderer").show("200");
- }
- function refreshHideYoutubeVideos(showAll) {
- $('ytd-grid-video-renderer #dismissable #details').each(function() {
- if(!$(this).find('.hideButton').length) {
- $(this).append('<img src="https://image.flaticon.com/icons/svg/61/61685.svg" class="hideButton" />');
- }
- });
- if (Cookies.getJSON('hideYoutubeVideos') !== undefined && window.location.href == "https://www.youtube.com/feed/subscriptions" || window.location.href == "http://www.youtube.com/feed/subscriptions") {
- var data = Cookies.getJSON('hideYoutubeVideos').data;
- data.items.forEach(function(item) {
- //console.log(item.href);
- if(showAll === true) {
- $('a[href="' + item.href + '"]').each(function() {
- $(this).closest("ytd-grid-video-renderer").show("200");
- });
- } else if ($("#hide-videos").prop('checked') === true) {
- $('a[href="' + item.href + '"]').each(function() {
- $(this).closest("ytd-grid-video-renderer").hide();
- });
- } else {
- $('a[href="' + item.href + '"]').each(function() {
- $(this).closest("ytd-grid-video-renderer").show("200");
- });
- }
- });
- }
- }
- $(function() {
- //Add mutation observer, checks for changes in DOM
- if (MutationObserver) {
- var myObserver = new MutationObserver(hideWatched);
- } else {
- var myObserver = new WebKitMutationObserver(hideWatched);
- }
- myObserver.observe(document, {
- childList: true,
- subtree: true
- });
- //Add mutation observer 2, checks for changes in DOM
- if (MutationObserver) {
- var myObserver2 = new MutationObserver(refreshHideYoutubeVideos);
- } else {
- var myObserver2 = new WebKitMutationObserver(refreshHideYoutubeVideos);
- }
- myObserver2.observe(document, {
- childList: true,
- subtree: true
- });
- // Add checkbox
- var checker = '<label id="checker-container" id="null">' +
- '<input type="checkbox" id="hide-videos" checked="" id="null"/>' +
- 'Hide watched & selected videos' +
- '</label>' ;
- $("#end").prepend(checker);
- $("#checker-container").css({
- 'color': "#666",
- "vertical-align": "middle",
- "text-align": "center"
- });
- var removeCookie = '<li><img id="removeCookie" src="https://www.iconsdb.com/icons/preview/gray/delete-xxl.png" width="16" style="vertical-align: middle; cursor: pointer;"</li>';
- $("#appbar-nav .appbar-nav-menu").append(removeCookie);
- $('#removeCookie').on('click', function(){
- setTimeout(function() {
- refreshHideYoutubeVideos(true);
- Cookies.remove('hideYoutubeVideos');
- }, 1000);
- });
- //checkbox event
- $("#hide-videos").click(function() {
- refreshHideYoutubeVideos();
- if ($(this).is(":not(:checked)")) {
- showWatched();
- } else {
- hideWatched();
- }
- });
- //BONUS: always enable load more button.
- $("button.load-more-button").removeProp("disabled");
- hideWatched();
- //$(".yt-thumb").prepend('<img src="https://image.flaticon.com/icons/svg/61/61685.svg" class="hideButton" />');
- refreshHideYoutubeVideos();
- });
- // on click and Functions
- $('body').on('click', '.hideButton', function(e) {
- e.preventDefault();
- if (Cookies.getJSON('hideYoutubeVideos') !== undefined) {
- var data = Cookies.getJSON('hideYoutubeVideos').data;
- } else {
- var data = {
- items: []
- };
- }
- data.items.push({
- href: $(this).parent().parent().find('a').attr('href')
- });
- Cookies.set('hideYoutubeVideos', {
- data: data,
- }, {
- expires: 36500
- });
- refreshHideYoutubeVideos();
- setTimeout(function(){ window.history.back(); }, 250);
- });