Hide videos seen on Youtube

Hide videos seen on Youtube, on any page, by X'ing them

As of 2014-12-19. See the latest version.

// ==UserScript==
// @name         Hide videos seen on Youtube
// @namespace    http://youtube.com
// @version      0.5
// @description  Hide videos seen on Youtube, on any page, by X'ing them
// @match        https://www.youtube.com/*
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js
// @require      https://greasyfork.org/scripts/2199-waitforkeyelements/code/waitForKeyElements.js?version=6349
// ==/UserScript==


// replace old style localStorage from past version
var storedHiddenVideos = JSON.parse(localStorage.getItem('HideVideosList') || '{}');
for (var key in localStorage)
    if (key.match(/^https:\/\/www.youtube.com\/user\//)) {
        for (var url in JSON.parse(localStorage.getItem(key) || '{}'))
            storedHiddenVideos[url.replace(/(.*?)&.*/,'\$1')] = true;
        localStorage.setItem('HideVideosList', JSON.stringify(storedHiddenVideos));
        localStorage.removeItem(key);
    }

$('head').append(
    '<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css">' +
    '<style>' +
        '#show-all-hidden-videos {' +
            'margin-left: 20px;' +
        '}' +
    '</style>'
);

function getNewVideoLinks() {
    var vids = $('a').filter(function(){
        if (!$(this).attr('href'))
            return;
        if (!$(this).attr('href').match(/^\/watch/))
            return;
        if ($(this).hasClass('youtube-mark-read'))
            return;
        return true;
    });
    return vids
}

function findClosest(element, searchSelector) {
    if (element.length == 0)
        return $();
    var selected = element.parent().find(searchSelector);
    if (selected.length != 0)
        return selected.first();
    else
        return findClosest(element.parent(), searchSelector);
}

// Set hide link hover event
function hideLinkHover() {
    var hideLink = findClosest($(this).parent(), 'a.hide-link');
    hideLink.toggle();
}
$('body').on('mouseenter', '.video-thumb, .yt-uix-simple-thumb-wrap', hideLinkHover);
$('body').on('mouseleave', '.video-thumb, .yt-uix-simple-thumb-wrap', hideLinkHover);

// Set hide link click event
$('body').on('click', 'a.hide-link', function(e){
    e.preventDefault();
    currentLink = findClosest($(this), 'a.yt-uix-sessionlink');
    storedHiddenVideos[currentLink.attr('href').replace(/(.*?)&.*/,'\$1')] = true;
    localStorage.setItem('HideVideosList', JSON.stringify(storedHiddenVideos));
    currentLink.closest('li').addClass('youtube-mark-read-hidden').hide();
});

function processLink() {
    currentLink = $(this);
    currentLink.addClass('youtube-mark-read');
    var currentImage = currentLink.find('img');
    var wrapper = '<div style="display: inline-block;"></div>';
    if (currentImage.parent().hasClass('yt-uix-simple-thumb-related'))
        wrapper = '<div class="yt-uix-simple-thumb-related" style="display: inline-block;"></div>';
    currentImage.wrap(wrapper).parent().prepend('<a class="hide-link"><i class="fa fa-close"></i></a><div style="clear:both;"></div>').css('position','relative');
    // inline the CSS to override inherited YouTube styles that mess stuff up
    var hideLinkCSS = {
        'display': 'none',
        'background': 'rgba(255,255,255,0.8)',
        'font-size': '20px',
        'color': '#000',
        'z-index': '555',
        'position': 'absolute',
        'right': '0',
        'padding': '3px',
    };
    $('.hide-link').css(hideLinkCSS);
    if (currentImage.parent().closest('a').hasClass('playlist-video'))
        currentImage.parent().find('.hide-link').css('margin-top', '5px');
    if (storedHiddenVideos[currentLink.attr('href').replace(/(.*?)&.*/,'\$1')] !== undefined)
        currentLink.closest('li').addClass('youtube-mark-read-hidden').hide();
}

// Search for new links and process them every 5 seconds
var intervalID = setInterval(function() {
    getNewVideoLinks().each(processLink);
}, 5000);

// Add show hidden button
waitForKeyElements('button.yt-google-help-link', function() {
    var showButton = '<button id="show-all-hidden-videos" class="yt-uix-button yt-uix-button-default"><span>Show hidden</span></button>';
    $('button.yt-google-help-link').after(showButton);
    $('button#show-all-hidden-videos').click(function(){
        $('li.youtube-mark-read-hidden').show();
    });
});