Skip to content

Instantly share code, notes, and snippets.

@JosXa
Last active September 11, 2021 13:56
Show Gist options
  • Save JosXa/aeefd48326f4a2b42174 to your computer and use it in GitHub Desktop.
Save JosXa/aeefd48326f4a2b42174 to your computer and use it in GitHub Desktop.
Youtube Feed Filter
// ==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);
}
@thienha1
Copy link

Can you make scripts that set a timer to automatically pause/stop on all Youtube embed videos? Like pause a video after X seconds!!?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment