// ==UserScript== // @name ZeroSumOnline Manga Downloader // @namespace custom-scripts // @version 1.2 // @description Descarga todas las imágenes de capítulos desde ZeroSumOnline en un archivo ZIP. // @author TuNombre // @license MIT // @match https://zerosumonline.com/* // @grant none // @downloadURL none // ==/UserScript== (function () { "use strict"; // Crear botón para iniciar la descarga const downloadButton = document.createElement("button"); downloadButton.textContent = "Descargar Todo (ZIP)"; 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); // Cargar JSZip dinámicamente const loadJSZip = async () => { if (!window.JSZip) { const script = document.createElement("script"); script.src = "https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; script.integrity = "sha512-YloU/BxCBEmqgX2L9ixBb95+ItUsx1GpLaHZCGT94nbDOESGnCuVZZqTuDgPfPa5akQHUswJ8wnn6m+5q2BpUA=="; script.crossOrigin = "anonymous"; script.referrerPolicy = "no-referrer"; document.head.appendChild(script); await new Promise(resolve => { script.onload = resolve; }); } }; // Evento del botón downloadButton.addEventListener("click", async () => { await loadJSZip(); 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(); for (let i = 0; i < images.length; i++) { try { const imgElement = images[i]; const blob = await getImageBlob(imgElement); const fileName = `page_${String(i + 1).padStart(3, "0")}.jpg`; zip.file(fileName, blob); console.log(`Imagen añadida al ZIP: ${fileName}`); } catch (error) { console.error(`Error procesando la imagen ${i + 1}:`, error); } } // Generar el archivo ZIP y descargarlo zip.generateAsync({ type: "blob" }).then(zipFile => { const zipName = `capitulo_manga.zip`; const a = document.createElement("a"); const url = URL.createObjectURL(zipFile); a.href = url; a.download = zipName; document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url); alert(`${images.length} imágenes descargadas en ${zipName}.`); }); }); // Convierte la URL blob en un Blob descargable function getImageBlob(imgElement) { return new Promise((resolve, reject) => { try { const canvas = document.createElement("canvas"); canvas.width = imgElement.naturalWidth; canvas.height = imgElement.naturalHeight; const ctx = canvas.getContext("2d"); ctx.drawImage(imgElement, 0, 0); canvas.toBlob(resolve, "image/jpeg"); } catch (error) { reject(error); } }); } })();