Greasy Fork

YNJN Full-Page Downloader (Actualizado)

Descarga imágenes grandes (páginas) de Young Jump Web Comics (YNJN)

目前为 2025-02-18 提交的版本。查看 最新版本

// ==UserScript==
// @name         YNJN Full-Page Downloader (Actualizado)
// @namespace    ynjn-downloader
// @version      0.2
// @description  Descarga imágenes grandes (páginas) de Young Jump Web Comics (YNJN)
// @match        https://ynjn.jp/*
// @require      https://cdn.jsdelivr.net/npm/jszip@3/dist/jszip.min.js
// @require      https://cdn.jsdelivr.net/npm/file-saver@2/dist/FileSaver.min.js
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Esperar a que la página cargue completamente
    function waitForPageLoad(callback) {
        if (document.readyState === 'complete') {
            callback();
        } else {
            window.addEventListener('load', callback);
        }
    }

    waitForPageLoad(() => {
        console.log("📥 Script YNJN Downloader activo");

        // Crear un botón para descargar
        const downloadBtn = document.createElement('button');
        downloadBtn.textContent = 'Descargar Páginas Grandes';
        downloadBtn.style.cssText = `
            position: fixed;
            top: 10px;
            right: 10px;
            z-index: 9999;
            background: #e63946;
            color: #fff;
            padding: 8px 12px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 14px;
        `;
        document.body.appendChild(downloadBtn);

        // Evento de clic en el botón
        downloadBtn.addEventListener('click', async () => {
            downloadBtn.disabled = true;
            downloadBtn.textContent = 'Descargando...';
            try {
                // Capturar imágenes precargadas en <link rel="preload">
                const preloadLinks = Array.from(document.querySelectorAll('link[rel="preload"]'))
                    .map(link => link.href)
                    .filter(href => href.includes('/public/'));

                // Capturar imágenes grandes en <img>
                const bigImages = Array.from(document.querySelectorAll('img'))
                    .map(img => img.src)
                    .filter(src => src.includes('/public/'));

                // Unir ambas listas y quitar duplicados
                const allUrls = Array.from(new Set([...preloadLinks, ...bigImages]));
                if (!allUrls.length) {
                    alert('⚠️ No se encontraron imágenes grandes. Intenta hacer scroll hasta el final del capítulo.');
                    resetButton();
                    return;
                }

                // Crear un ZIP
                const zip = new JSZip();

                // Descargar cada imagen
                for (let i = 0; i < allUrls.length; i++) {
                    const url = allUrls[i];
                    console.log(`📄 Descargando página ${i+1}: ${url}`);
                    const resp = await fetch(url);
                    const blob = await resp.blob();
                    const fileName = String(i+1).padStart(3, '0') + '.jpg';
                    zip.file(fileName, blob);
                }

                // Generar y guardar el ZIP
                const zipContent = await zip.generateAsync({ type: 'blob' });
                saveAs(zipContent, 'ynjn_paginas.zip');
                alert(`✅ Descarga completa: ${allUrls.length} imágenes grandes`);
            } catch (error) {
                console.error('❌ Error al descargar páginas:', error);
                alert('⚠️ Ocurrió un error. Revisa la consola para más detalles.');
            }
            resetButton();
        });

        function resetButton() {
            downloadBtn.disabled = false;
            downloadBtn.textContent = 'Descargar Páginas Grandes';
        }
    });
})();