MangaPlus Blob Downloader

Descarga imágenes de capítulos de manga desde MangaPlus, capturando y convirtiendo a formato JPG o PNG si es necesario.

目前為 2024-11-25 提交的版本,檢視 最新版本

// ==UserScript==
// @name         MangaPlus Blob Downloader
// @namespace    shadows
// @version      1.7.0
// @description  Descarga imágenes de capítulos de manga desde MangaPlus, capturando y convirtiendo a formato JPG o PNG si es necesario.
// @author       shadows
// @license      MIT
// @match        https://mangaplus.shueisha.co.jp/*
// @grant        GM_download
// ==/UserScript==

"use strict";

(function () {
    // Crear botón de descarga
    const downloadButton = document.createElement("button");
    downloadButton.textContent = "Descargar imágenes";
    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);

    // Evento de descarga
    downloadButton.addEventListener("click", async () => {
        const images = Array.from(document.querySelectorAll("img"));

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

        // Descargar cada imagen individualmente
        for (const [index, img] of images.entries()) {
            try {
                const blobUrl = img.src;
                const fileName = `${String(index + 1).padStart(3, "0")}.jpg`; // Puedes cambiar a .png si prefieres

                // Obtener la imagen Blob
                const blob = await fetchBlob(blobUrl);
                if (blob) {
                    const convertedBlob = await convertBlobToImage(blob, 'image/jpeg'); // Cambia a 'image/png' si prefieres
                    saveBlobAsFile(convertedBlob, fileName);
                    console.log(`Descargada: ${fileName}`);
                } else {
                    console.error(`Error al obtener la imagen para: ${fileName}`);
                }
            } catch (err) {
                console.error(`Error al descargar la imagen:`, err);
            }
        }

        alert(`Se descargaron ${images.length} imágenes correctamente.`);
    });

    // Función para obtener el blob a partir del blob URL
    async function fetchBlob(blobUrl) {
        try {
            const response = await fetch(blobUrl);
            if (!response.ok) throw new Error(`Error al obtener la imagen: ${response.statusText}`);
            return await response.blob();
        } catch (error) {
            console.error("Error al obtener el blob:", error);
            return null;
        }
    }

    // Función para convertir un Blob a un formato de imagen (ejemplo: JPEG)
    async function convertBlobToImage(blob, mimeType) {
        return new Promise((resolve, reject) => {
            const img = document.createElement('img');
            const canvas = document.createElement('canvas');
            const ctx = canvas.getContext('2d');
            const url = URL.createObjectURL(blob);

            img.onload = () => {
                canvas.width = img.width;
                canvas.height = img.height;
                ctx.drawImage(img, 0, 0);
                canvas.toBlob((convertedBlob) => {
                    URL.revokeObjectURL(url);
                    if (convertedBlob) {
                        resolve(convertedBlob);
                    } else {
                        reject(new Error("Error al convertir la imagen."));
                    }
                }, mimeType);
            };

            img.onerror = () => {
                URL.revokeObjectURL(url);
                reject(new Error("Error al cargar la imagen para convertir."));
            };

            img.src = url;
        });
    }

    // Función para guardar un blob como archivo usando un enlace de descarga
    function saveBlobAsFile(blob, fileName) {
        const blobUrl = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = blobUrl;
        a.download = fileName;
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        URL.revokeObjectURL(blobUrl);
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址