Greasy Fork

ZeroSumOnline Manga Downloader

Descarga todas las imágenes de capítulos desde ZeroSumOnline en un archivo ZIP.

目前为 2024-11-26 提交的版本。查看 最新版本

// ==UserScript==
// @name         ZeroSumOnline Manga Downloader
// @namespace    custom-scripts
// @version      1.2
// @description  Descarga todas las imágenes de capítulos desde ZeroSumOnline en un archivo ZIP.
// @author       TuNombre
// @license      MIT
// @match        https://zerosumonline.com/*
// @grant        none
// ==/UserScript==

(function () {
    "use strict";

    // Crear botón para iniciar la descarga
    const downloadButton = document.createElement("button");
    downloadButton.textContent = "Descargar Todo (ZIP)";
    downloadButton.style = `
        position: fixed;
        top: 10px;
        right: 10px;
        z-index: 10000;
        background-color: #28a745;
        color: white;
        border: none;
        padding: 10px 20px;
        font-size: 14px;
        border-radius: 5px;
        cursor: pointer;
    `;
    document.body.appendChild(downloadButton);

    // Cargar JSZip dinámicamente
    const loadJSZip = async () => {
        if (!window.JSZip) {
            const script = document.createElement("script");
            script.src = "https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js";
            script.integrity = "sha512-YloU/BxCBEmqgX2L9ixBb95+ItUsx1GpLaHZCGT94nbDOESGnCuVZZqTuDgPfPa5akQHUswJ8wnn6m+5q2BpUA==";
            script.crossOrigin = "anonymous";
            script.referrerPolicy = "no-referrer";
            document.head.appendChild(script);

            await new Promise(resolve => {
                script.onload = resolve;
            });
        }
    };

    // Evento del botón
    downloadButton.addEventListener("click", async () => {
        await loadJSZip();
        const images = Array.from(document.querySelectorAll("img.G54Y0W_page"));

        if (images.length === 0) {
            alert("No se encontraron imágenes para descargar.");
            return;
        }

        const zip = new JSZip();

        for (let i = 0; i < images.length; i++) {
            try {
                const imgElement = images[i];
                const blob = await getImageBlob(imgElement);
                const fileName = `page_${String(i + 1).padStart(3, "0")}.jpg`;
                zip.file(fileName, blob);
                console.log(`Imagen añadida al ZIP: ${fileName}`);
            } catch (error) {
                console.error(`Error procesando la imagen ${i + 1}:`, error);
            }
        }

        // Generar el archivo ZIP y descargarlo
        zip.generateAsync({ type: "blob" }).then(zipFile => {
            const zipName = `capitulo_manga.zip`;
            const a = document.createElement("a");
            const url = URL.createObjectURL(zipFile);
            a.href = url;
            a.download = zipName;
            document.body.appendChild(a);
            a.click();
            a.remove();
            URL.revokeObjectURL(url);
            alert(`${images.length} imágenes descargadas en ${zipName}.`);
        });
    });

    // Convierte la URL blob en un Blob descargable
    function getImageBlob(imgElement) {
        return new Promise((resolve, reject) => {
            try {
                const canvas = document.createElement("canvas");
                canvas.width = imgElement.naturalWidth;
                canvas.height = imgElement.naturalHeight;

                const ctx = canvas.getContext("2d");
                ctx.drawImage(imgElement, 0, 0);

                canvas.toBlob(resolve, "image/jpeg");
            } catch (error) {
                reject(error);
            }
        });
    }
})();