// ==UserScript==
// @name GGn Copy Links From Page
// @namespace https://greasyfork.org
// @version 0.1
// @license MIT
// @description Copy Download links from https://gazellegames.net/torrents.php to clipboard based on a max file size limit (in MB) you specify. Also, calculates the total size of all torrents on the page.
// @author yoshijulas
// @match https://gazellegames.net/torrents.php*
// @grant none
// @downloadURL none
// ==/UserScript==
(() => {
const SIZE_REGEX = /(\d+\.\d+|\d+)\s?(KB|MB|GB)/;
const toMB = (value, unit) => {
if (unit === "GB") return value * 1024;
if (unit === "KB") return value / 1024;
return value;
};
$(document).ready(() => {
const linkBox = $("#content .linkbox");
linkBox.append(
'
',
);
linkBox.append(
'
',
);
linkBox.append('
');
const rows = document.querySelectorAll("tr.group_torrent");
const torrentData = [];
for (const row of rows) {
const torrentLink = row.querySelector("td span a");
const sizeElements = row.querySelectorAll("td.nobr");
for (const sizeElement of sizeElements) {
// Match size format (e.g., 42.50 KB, 1.2 MB, etc.)
const match = sizeElement.innerHTML.match(SIZE_REGEX);
if (torrentLink && match) {
const size = toMB(Number.parseFloat(match[1]), match[2]);
torrentData.push({ link: torrentLink, size });
}
}
}
const calculateTotalSize = (maxSizeMB = Number.POSITIVE_INFINITY) =>
torrentData.reduce(
(total, { size }) => (size <= maxSizeMB ? total + size : total),
0,
);
const updateTotalSizeDisplay = (maxSizeMB) => {
const total = calculateTotalSize(maxSizeMB);
$("#totalSize").text(
`Total size: ${total.toFixed(2)} MB${Number.isFinite(maxSizeMB) ? ` (limit: ${maxSizeMB} MB)` : ""}`,
);
};
// Initial display
updateTotalSizeDisplay();
// Update total size on input
$("#maxFileSize").on("input", (event) => {
const maxSizeMB = Number.parseFloat(event.target.value);
updateTotalSizeDisplay(
Number.isNaN(maxSizeMB) ? Number.POSITIVE_INFINITY : maxSizeMB,
);
});
$("#copyDownloadLinks").click(() => {
const maxSizeMB = Number.parseFloat($("#maxFileSize").val());
if (Number.isNaN(maxSizeMB)) {
alert("Please enter a valid number for max file size.");
return;
}
const filteredLinks = torrentData
.filter(({ size }) => size <= maxSizeMB)
.map(({ link }) => link);
if (filteredLinks.length === 0) {
alert("No links match the specified size limit.");
return;
}
navigator.clipboard
.writeText(filteredLinks.join("\n"))
.then(() => {
alert(`Copied ${filteredLinks.length} links to clipboard.`);
})
.catch(() => {
alert("Failed to copy links to clipboard.");
});
});
});
})();