Skip to content

Instantly share code, notes, and snippets.

@Nathaniel-Wu
Last active July 25, 2024 23:09
Show Gist options
  • Save Nathaniel-Wu/fabd62df2d6146121fa4b9cfcae08763 to your computer and use it in GitHub Desktop.
Save Nathaniel-Wu/fabd62df2d6146121fa4b9cfcae08763 to your computer and use it in GitHub Desktop.
Open channels with updates in new tabs, to be launched from Tampermonkey context menu
// ==UserScript==
// @name YouTube Check Out Updated Channels
// @namespace http://tampermonkey.net/
// @version 0.7
// @description Open channels with updates in new tabs
// @author Nathaniel Wu
// @include *://www.youtube.com/*
// @include *://www.youtube.com
// @license Apache-2.0
// @supportURL https://gist.github.com/Nathaniel-Wu/fabd62df2d6146121fa4b9cfcae08763
// @run-at document-idle
// ==/UserScript==
(function () {
'use strict';
function is_channel_updated(channel) {
return window.getComputedStyle(channel.querySelector('div#newness-dot')).display == "block";
}
function click_videos_tab() {
let ret = false;
document.querySelectorAll('#tabsContent > tp-yt-paper-tab > div').forEach(e => {
if (/[Vv][Ii][Dd][Ee][Oo][Ss]/g.test(e.innerText)) {
e.click();
ret = true;
}
});
return ret;
}
let accumulated_delay = 0;
function check_for_updates(subscriptions) {
subscriptions.querySelectorAll('ytd-guide-entry-renderer').forEach(channel => {
console.info(channel);
if (is_channel_updated(channel)) {
setTimeout(() => {
channel.querySelector('a').click();
}, accumulated_delay += 500);
}
});
}
function checkout_updated_channels() {
let subscriptions = document.querySelector('div#content > tp-yt-app-drawer#guide div#sections > ytd-guide-section-renderer:nth-of-type(2) > div#items');//subject to change
if (subscriptions == null)
return false;
let channels = subscriptions.querySelectorAll(':scope > ytd-guide-entry-renderer');
if (is_channel_updated(channels[channels.length - 1])) {
let active_DOMNodeInsertion = 0;
const observer = new MutationObserver(mutationList =>
mutationList.filter(m => m.type === 'childList').forEach(m => {
m.addedNodes.forEach(() => {
active_DOMNodeInsertion++;
setTimeout(() => {
active_DOMNodeInsertion--;
if (active_DOMNodeInsertion == 0) {
check_for_updates(subscriptions);
}
}, 2000);
});
}));
observer.observe(subscriptions, { childList: true, subtree: true });
subscriptions.querySelector('ytd-guide-collapsible-entry-renderer > ytd-guide-entry-renderer#expander-item').click();
} else
check_for_updates(subscriptions);
return true;
}
function repeat_until_successful(function_ptr, interval) {
if (!function_ptr())
setTimeout(() => {
repeat_until_successful(function_ptr, interval);
}, interval);
}
function in_iframe() {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
}
function on_subscription_page() {
return /^https?:\/\/((www|m)\.)?youtube\.com\/feed\/subscriptions\/?$/.test(window.location.href);
}
if (!in_iframe()) {
if (on_subscription_page())
repeat_until_successful(checkout_updated_channels, 1000);
document.addEventListener('transitionend', (e) => {
if (e.target.id === 'progress' && on_subscription_page())
repeat_until_successful(checkout_updated_channels, 1000);
});
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment