Greasy Fork

YNJN Full-Page Downloader (Actualizado 2025)

Descarga imágenes de capítulos de Young Jump Web Comics (YNJN)

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

// ==UserScript==
// @name         YNJN Full-Page Downloader (Actualizado 2025)
// @namespace    ynjn-downloader
// @version      0.3
// @description  Descarga imágenes de capítulos 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';

    function waitForPageLoad(callback) {
        if (document.readyState === 'complete') {
            callback();
        } else {
            window.addEventListener('load', callback);
        }
    }

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

        const downloadBtn = document.createElement('button');
        downloadBtn.textContent = 'Descargar Capítulo';
        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);

        downloadBtn.addEventListener('click', async () => {
            downloadBtn.disabled = true;
            downloadBtn.textContent = 'Cargando imágenes...';

            await autoScroll();
            const imageUrls = getAllImages();
            if (!imageUrls.length) {
                alert('⚠️ No se encontraron imágenes. Intenta hacer scroll hasta el final.');
                resetButton();
                return;
            }

            await downloadImages(imageUrls);
            resetButton();
        });
    });

    async function autoScroll() {
        return new Promise(resolve => {
            let totalHeight = 0;
            const distance = 100;
            const timer = setInterval(() => {
                window.scrollBy(0, distance);
                totalHeight += distance;

                if (totalHeight >= document.body.scrollHeight) {
                    clearInterval(timer);
                    setTimeout(resolve, 1000);
                }
            }, 200);
        });
    }

    function getAllImages() {
        const imgTags = Array.from(document.querySelectorAll('img'))
            .map(img => img.src)
            .filter(src => src.includes('/public/'));
        
        return Array.from(new Set(imgTags));
    }

    async function downloadImages(imageUrls) {
        const zip = new JSZip();

        for (let i = 0; i < imageUrls.length; i++) {
            try {
                const url = imageUrls[i];
                console.log(`📄 Descargando ${i+1}: ${url}`);
                const response = await fetch(url);
                const blob = await response.blob();
                zip.file(`${String(i+1).padStart(3, '0')}.jpg`, blob);
            } catch (error) {
                console.error(`❌ Error al descargar ${imageUrls[i]}`, error);
            }
        }

        const zipContent = await zip.generateAsync({ type: 'blob' });
        saveAs(zipContent, 'ynjn_capitulo.zip');
        alert(`✅ Descarga completa: ${imageUrls.length} imágenes`);
    }

    function resetButton() {
        const downloadBtn = document.querySelector('button');
        if (downloadBtn) {
            downloadBtn.disabled = false;
            downloadBtn.textContent = 'Descargar Capítulo';
        }
    }
})();