Skip to content

Instantly share code, notes, and snippets.

@the-codinator
Last active September 7, 2024 00:09
Show Gist options
  • Save the-codinator/63e166af37d2df6b5515a2384b178158 to your computer and use it in GitHub Desktop.
Save the-codinator/63e166af37d2df6b5515a2384b178158 to your computer and use it in GitHub Desktop.
/* Downloader for SubsPlease. Convert to bookmarklet using https://mrcoles.com/bookmarklet/ */
/* Note: Use with Firefox coz Chrome restricts external protocol execution without user interaction so only 1 link gets clicked / pages open */
/* Based on https://github.com/the-codinator/anime-downloader-bookmarklet */
if (!window.location.href.startsWith('https://subsplease.org/shows/')) throw Error('Not on SubsPlease');
console.log('Executing Anime Downloader for SubsPlease!');
if (typeof codiLinkType == 'undefined') codiLinkType = 'Magnet';
if (typeof codiVideoQuality == 'undefined') codiVideoQuality = '1080p';
if (typeof codiFirstEpisodeNumber == 'undefined') codiFirstEpisodeNumber = 0;
if (typeof codiLastEpisodeNumber == 'undefined') codiLastEpisodeNumber = 10_000;
if (typeof codiClickIntervalMs == 'undefined') codiClickIntervalMs = 500;
const codiGetLinkType = linkElement => linkElement.querySelector('.badge')?.textContent;
const codiGetVideoQuality = linkElement => { for (let curr = linkElement; curr; curr = curr.previousElementSibling) if (curr.classList.contains('links')) return curr.textContent };
const codiGetEpisodeNumber = linkElement => parseFloat(linkElement.closest('.show-release-item')?.querySelector('.episode-title')?.textContent?.match(/ (\d+(?:\.\d+)?)(?:v\d+)?$/g)?.pop());
const codiLinks = Array.from(document.querySelectorAll('.show-release-item .download-links a'))
.filter(link => codiGetLinkType(link) == codiLinkType)
.filter(link => codiGetVideoQuality(link) == codiVideoQuality)
.filter(link => codiFirstEpisodeNumber <= codiGetEpisodeNumber(link) && codiGetEpisodeNumber(link) <= codiLastEpisodeNumber)
.toSorted((link1, link2) => codiGetEpisodeNumber(link1) - codiGetEpisodeNumber(link2));
console.log('Episode Count: ' + codiLinks.length, {codiLinkType, codiVideoQuality, codiFirstEpisodeNumber, codiLastEpisodeNumber});
let codiLinksCopy = codiLinks.toReversed();
const codiHandler = window.setInterval(() => {
if (codiLinksCopy.length == 0) { window.clearInterval(codiHandler); return }
const link = codiLinksCopy.pop();
console.log('Opening Episode: ' + codiGetEpisodeNumber(link));
/* window.open(.href, '_blank'); */
link.click();
}, codiClickIntervalMs);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment