NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @namespace https://openuserjs.org/users/SB100 // @name GGn Seeding Group Highlighter // @description Highlights a torrent group on the torrents.php page if you are seeding at least one torrent in the group // @updateURL https://openuserjs.org/meta/SB100/GGn_Seeding_Group_Highlighter.meta.js // @version 1.0.1 // @author SB100 // @copyright 2021, SB100 (https://openuserjs.org/users/SB100) // @license MIT // @include https://gazellegames.net/torrents.php* // @exclude https://gazellegames.net/torrents.php*id=* // ==/UserScript== // ==OpenUserJS== // @author SB100 // ==/OpenUserJS== /* jshint esversion: 6 */ /** * ============================= * ADVANCED OPTIONS * ============================= */ // What color to highlight the group text if we have something seeding in the group const SETTING_HIGHLIGHT_COLOR = '#d9e473'; /** * ============================= * END ADVANCED OPTIONS * DO NOT MODIFY BELOW THIS LINE * ============================= */ /** * Accepts a row and table, and highlights the row in that table if we're seeing something in the row's group */ function highlightGroupIfSeedingInChild(groupTr, tableElem) { // find the group id. If we can't, we can't do anything more const groupIdMatches = groupTr.className.match(/group_(\d+)/) const groupId = groupIdMatches ? groupIdMatches[1] : null; if (!groupId) { return; } // find if we're seeding something in the group const shouldHighlight = Array.from(tableElem.querySelectorAll(`.groupid_${groupId}`)).some(row => { return row.querySelector('[title="Seeding"]') !== null; }); if (!shouldHighlight) { return; } // find the anchor link to highlight and change the title for const link = groupTr.querySelector('[title="View Torrent"]'); if (!link) { return; } link.classList.add('sgh__seeding'); link.title = 'View Torrent (Currently Seeding)' } /** * Creates the style which will highlight the group that we have items seeding in */ function createStyleTag() { const css = `.sgh__seeding { color: ${SETTING_HIGHLIGHT_COLOR}; }`; const style = document.createElement('style'); style.type = 'text/css'; style.appendChild(document.createTextNode(css)); document.head.appendChild(style); } (function () { 'use strict'; // check we have observers available to us if (!MutationObserver) return; // create our css styles createStyleTag(); // observer config - only interested in tree modifications const config = { childList: true, subtree: true }; // Check modified nodes and run the subtitle function if we find a valid match const callback = function (mutationsList, observer) { mutationsList.forEach(mutation => { if (mutation.target.matches('table.torrent_table.grouping') && mutation.addedNodes[0].matches('tr.group:not(.hidden)')) { highlightGroupIfSeedingInChild(mutation.addedNodes[0], mutation.target); } }); } // create an observer instance with the callback const observer = new MutationObserver(callback); // Start observing the target node for mutations observer.observe(document, config); // and run for anything that was already on the page Array.from(document.querySelectorAll('tr.group:not(.hidden)')).forEach(groupTr => highlightGroupIfSeedingInChild(groupTr, document.getElementById('torrent_table')) ); })();