Last active
January 11, 2016 17:40
-
-
Save JosXa/e0f34c3ec59892fe4a1d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==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