Skip to content

Instantly share code, notes, and snippets.

@JosXa
Last active January 11, 2016 17:40
Show Gist options
  • Save JosXa/e0f34c3ec59892fe4a1d to your computer and use it in GitHub Desktop.
Save JosXa/e0f34c3ec59892fe4a1d to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name Youtube Feed Filter
// @version 0.1
// @description Filters Youtube Videos in the 'My Subscriptions'-Page
// @require http://code.jquery.com/jquery-latest.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @include *youtube.com/*
// @grant GM_addStyle
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
// TODOs
//
// - remove clicked filter function
// - show all filters in prompt for direct editing
// - initialize cookies if not set (or something to prevent errors)
// - unhide videos where the filter is removed
// - hide videos, that show up when scrolling down the list, aswell
// - make hiding of watched videos adjustable
// - ignore case
// VARIABLES
var url = new RegExp(".*youtube.com/feed/subscriptions");
// YOUTUBE SPECIFIC HELPERS
$(document).ready(function() {
if (GM_getValue)
setInterval(function() {
main();
}, 380);
});
function main() {
if (window.location.href.match(url)) {
if ($('#yt-feed-filter').length < 1) {
window.onkeyup = keys;
initUI();
}
filterVideos();
} else {
window.onkeyup = null;
}
}
// MAIN PROGRAM
var keys = function(e) {
console.log(e.which + " pressed.");
switch (e.which) {
case 27: // esc
// do something
break;
case 70: // f
var addFilter = window.getSelection().toString();
if (GM_getValue('askBeforeAddingHighlightedFilter') == 'true' || addFilter == '') {
addFilter = prompt('Einen Ausnahmefilter für Videos im Feed hinzufügen', addFilter);
}
var oldFilter = GM_getValue('youtubeFeedFilter');
if (addFilter != null && addFilter != '') {
if (!oldFilter) {
GM_setValue('youtubeFeedFilter', addFilter);
} else {
GM_setValue('youtubeFeedFilter', oldFilter + '~' + addFilter);
}
console.log('"' + addFilter + '" als Ausnahmefilter hinzugefügt.');
/*$.get( "http://foamgnome.bplaced.de/privat/abejwjBtujw72gAaWEGaw367.php", { q: addFilter } , function( data ) {
alert( "Data Loaded: " + data );*/
chrome.runtime.sendMessage({
method: 'GET',
action: 'xhttp',
url: 'http://foamgnome.bplaced.de/privat/abejwjBtujw72gAaWEGaw367.php',
data: 'q=' + addFilter
}, function(responseText) {
alert(responseText);
/*Callback function to deal with the response*/
});
/*
try this one day...?
GM_xmlhttpRequest({
method: "GET",
url: "http://www.example.net/",
headers: {
"User-Agent": "Mozilla/5.0", // If not specified, navigator.userAgent will be used.
"Accept": "text/xml" // If not specified, browser defaults will be used.
},
onload: function(response) {
var responseXML = null;
// Inject responseXML into existing Object (only appropriate for XML content).
if (!response.responseXML) {
responseXML = new DOMParser()
.parseFromString(response.responseText, "text/xml");
}
GM_log([
response.status,
response.statusText,
response.readyState,
response.responseHeaders,
response.responseText,
response.finalUrl,
responseXML
].join("\n"));
}
});
*/
filterVideos();
}
break;
case 71: // g
var oldFilter = GM_getValue('youtubeFeedFilter');
var newFilter = prompt('Bestehende Filter bearbeiten', oldFilter);
// TODO: check for abort, '', null
GM_setValue('youtubeFeedFilter', newFilter);
filterVideos();
break;
case 82: // r
filterVideos();
break;
case 65: // a
if (GM_getValue('askBeforeAddingHighlightedFilter') == 'true') {
GM_setValue('askBeforeAddingHighlightedFilter', 'false');
console.log('Asking before adding highlighted text to filters turned OFF');
} else {
GM_setValue('askBeforeAddingHighlightedFilter', 'true');
console.log('Asking before adding highlighted text to filters turned ON');
}
break;
}
};
function filterVideos() {
var arr = getFilterArray();
for (var i = 0; i < arr.length; i++) {
var s = arr[i];
if (s != '') {
$('.feed-item-container:visible').each(function(index, element) {
if ($(element).find("h3 a:contains('" + s + "')").size() > 0 ||
$(element).find("h2 a:contains('" + s + "')").size() > 0 ||
$(element).find(".watched-badge").size() > 0 ||
($(element).find(".feed-item-actions-line:contains('Live-Stream geplant')").size() > 0 &&
GM_getValue('hideLiveStreamSchedule') == 'true')) {
$(element).hide();
}
});
}
}
updateUI();
}
function getFilterArray() {
var filter = GM_getValue('youtubeFeedFilter');
return filter.split('~')
}
function initUI() {
var ui = '<div class="branded-page-box yt-card" id="yt-feed-filter">\
<h2 class="branded-page-module-title">\
Ausnahmefilter\
</h2>\
<ul class="custom-branded-page branded-page-related-channels-list">\
</ul>\
</div>\
';
$('.branded-page-v2-secondary-col').append(ui);
updateUI();
}
function updateUI() {
var arr = getFilterArray();
var list = '';
for (var i = 0; i < arr.length; i++) {
list += '<li class="branded-page-related-channels-item spf-link clearfix">\
<a class="yt-uix-tooltip branded-page-related-channels-item-close yt-close" title="Entfernen">\
<span class="yt-close-img yt-sprite"></span>\
</a>\
<span class="yt-lockup clearfix yt-lockup-channel yt-lockup-mini">\
<div class="yt-lockup-content">\
<h3 class="yt-lockup-title">' + arr[i] + '</h3>\
</div>\
</span>\
</li>';
}
$('.custom-branded-page').html(list);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment