Last active
July 25, 2024 23:09
-
-
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
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 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