// ==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 // @downloadURL 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'; } } })();