Last active
September 11, 2021 13:56
-
-
Save JosXa/aeefd48326f4a2b42174 to your computer and use it in GitHub Desktop.
Youtube Feed Filter
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/watch* | |
// @grant GM_addStyle | |
// @grant GM_getValue | |
// @grant GM_setValue | |
// @grant GM_xmlhttpRequest | |
// ==/UserScript== | |
// 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.*/feed/subscriptions"); | |
// YOUTUBE SPECIFIC HELPERS | |
// GM_setValue('youtubeFeedFilter', 'Xcom~Tales from the Borderlands'); | |
$(document).ready(function() { | |
// standard values | |
if (!GM_getValue('youtubeFeedFilter')) { | |
GM_setValue('youtubeFeedFilter', 'abc~def'); | |
} | |
$(document).keyup(keys); | |
main(); | |
// detect when the user hasn't been scrolling for some time. | |
$(document).scroll(function() { | |
clearTimeout($.data(this, 'scrollTimer')); | |
$.data(this, 'scrollTimer', setTimeout(function() { | |
main(); | |
}, 500)); | |
}); | |
}); | |
function main() { | |
if (window.location.href.match(url)) { | |
filterVideos(); | |
$('.yt-shelf-grid-item:visible').off('click').on('click', function(event) { | |
// pressed ctrl while clicking on video | |
if (event.ctrlKey) { | |
event.preventDefault(); | |
var addFilter = $(this).find("h3 a").text(); | |
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.'); | |
filterVideos(); | |
} | |
} | |
}); | |
} | |
} | |
// 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', addFilter + '~' + oldFilter); | |
} | |
console.log('"' + addFilter + '" als Ausnahmefilter hinzugefügt.'); | |
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 97: // 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 != '') { | |
$('.yt-shelf-grid-item:visible').each(function(index, element) { | |
if ($(element).find("h3 a:contains('" + s + "')").size() > 0 || | |
$(element).find(".yt-lockup-byline 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 containsRegex(element, term) { | |
var regex = new RegExp(".*" + term + ".*"); | |
console.log(regex); | |
return $(element).filter(function() { | |
var content = (this.textContent || this.innerText); | |
return content.match(regex) || content.contains(term); | |
}).size() > 0; | |
} | |
function getFilterArray() { | |
var filter = GM_getValue('youtubeFeedFilter'); | |
return filter.split('~') | |
} | |
// TODO: implement | |
function getFilterJSON() { | |
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")); | |
} | |
}); | |
} | |
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
Can you make scripts that set a timer to automatically pause/stop on all Youtube embed videos? Like pause a video after X seconds!!?