Greasy Fork

ZeroSumOnline Manga Downloader (ZIP)

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

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

// ==UserScript==
// @name         ZeroSumOnline Manga Downloader (ZIP)
// @namespace    custom-scripts
// @version      1.4
// @description  Descarga todas las imágenes de capítulos desde ZeroSumOnline en un archivo ZIP correctamente.
// @author       TuNombre
// @license      MIT
// @match        https://zerosumonline.com/*
// @grant        GM_download
// @require      https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js
// ==/UserScript==

(function () {
    "use strict";

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

    downloadButton.addEventListener("click", async () => {
        try {
            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();
            const folder = zip.folder("manga_images");

            for (let i = 0; i < images.length; i++) {
                const imgElement = images[i];
                const blob = await getImageBlob(imgElement);

                if (blob) {
                    const fileName = `page_${String(i + 1).padStart(3, "0")}.jpg`;
                    folder.file(fileName, blob);
                    console.log(`Añadida al ZIP: ${fileName}`);
                } else {
                    console.warn(`No se pudo procesar la imagen ${i + 1}`);
                }
            }

            const zipBlob = await zip.generateAsync({ type: "blob" });
            saveAs(zipBlob, "manga_chapter.zip");
            alert(`Todas las imágenes se descargaron en manga_chapter.zip.`);
        } catch (error) {
            console.error("Error durante el proceso de descarga:", error);
            alert("Ocurrió un error al descargar las imágenes. Revisa la consola para más detalles.");
        }
    });

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

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

                canvas.toBlob(
                    (blob) => {
                        if (blob) resolve(blob);
                        else reject(new Error("No se pudo generar el Blob."));
                    },
                    "image/jpeg",
                    1.0
                );
            } catch (error) {
                reject(error);
            }
        });
    }
})();