// ==UserScript==
// @name Manga Downloader Enhanced
// @namespace custom-scripts
// @version 5.0
// @description Descarga imágenes de manga con una interfaz gráfica avanzada.
// @author TuNombre
// @license MIT
// @match https://zerosumonline.com/*
// @grant GM_download
// @downloadURL none
// ==/UserScript==
(function () {
"use strict";
// Crear botón para abrir la ventana flotante
const toggleButton = document.createElement("button");
toggleButton.textContent = "📂 Mostrar Imágenes Guardadas";
toggleButton.style = `
position: fixed;
bottom: 10px;
right: 10px;
z-index: 10000;
background-color: #007bff;
color: white;
border: none;
padding: 10px;
font-size: 14px;
border-radius: 5px;
cursor: pointer;
`;
document.body.appendChild(toggleButton);
// Crear ventana flotante para mostrar imágenes
const imageWindow = document.createElement("div");
imageWindow.style = `
display: none;
position: fixed;
top: 10%;
left: 50%;
transform: translate(-50%, 0);
width: 80%;
height: 70%;
background-color: white;
border: 1px solid #ccc;
border-radius: 10px;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
z-index: 9999;
overflow-y: auto;
padding: 15px;
`;
imageWindow.innerHTML = `
Selecciona las imágenes a descargar
`;
document.body.appendChild(imageWindow);
// Mostrar/Ocultar ventana al hacer clic en el botón
toggleButton.addEventListener("click", () => {
imageWindow.style.display = imageWindow.style.display === "none" ? "block" : "none";
if (imageWindow.style.display === "block") populateImageContainer();
});
// Cerrar ventana
document.getElementById("close-window").addEventListener("click", () => {
imageWindow.style.display = "none";
});
// Detectar imágenes y llenarlas en la ventana
function populateImageContainer() {
const images = Array.from(document.querySelectorAll("img.G54Y0W_page"));
const imageContainer = document.getElementById("image-container");
imageContainer.innerHTML = ""; // Limpiar contenido previo
images.forEach((img, index) => {
const wrapper = document.createElement("div");
wrapper.style = "width: 100px; text-align: center;";
const checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.value = index;
const thumbnail = document.createElement("img");
thumbnail.src = img.src;
thumbnail.style = "width: 100px; height: auto; border: 1px solid #ccc;";
const label = document.createElement("p");
label.textContent = `Página ${index + 1}`;
label.style = "font-size: 12px; margin: 5px 0;";
wrapper.appendChild(checkbox);
wrapper.appendChild(thumbnail);
wrapper.appendChild(label);
imageContainer.appendChild(wrapper);
});
}
// Seleccionar todas las imágenes
document.getElementById("select-all-btn").addEventListener("click", () => {
const checkboxes = document.querySelectorAll("#image-container input[type='checkbox']");
checkboxes.forEach((checkbox) => (checkbox.checked = true));
});
// Descargar imágenes seleccionadas
document.getElementById("download-selected-btn").addEventListener("click", async () => {
const checkboxes = document.querySelectorAll("#image-container input[type='checkbox']:checked");
if (checkboxes.length === 0) {
alert("No hay imágenes seleccionadas para descargar.");
return;
}
for (const checkbox of checkboxes) {
const index = parseInt(checkbox.value, 10);
const imgElement = document.querySelectorAll("img.G54Y0W_page")[index];
const blob = await convertImageToBlob(imgElement);
if (blob) {
const fileName = `pagina_${String(index + 1).padStart(3, "0")}.jpg`;
downloadBlob(blob, fileName);
}
}
alert(`Se descargaron ${checkboxes.length} imágenes correctamente.`);
});
// Convierte un elemento
en un Blob descargable
async function convertImageToBlob(imgElement) {
return new Promise((resolve, reject) => {
const canvas = document.createElement("canvas");
canvas.width = imgElement.naturalWidth || imgElement.width;
canvas.height = imgElement.naturalHeight || imgElement.height;
const ctx = canvas.getContext("2d");
ctx.drawImage(imgElement, 0, 0);
canvas.toBlob(
(blob) => (blob ? resolve(blob) : reject(new Error("No se pudo convertir la imagen."))),
"image/jpeg",
1.0
);
});
}
// Descarga un Blob como archivo
function downloadBlob(blob, fileName) {
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = fileName;
a.click();
URL.revokeObjectURL(url);
}
})();