Descarga imágenes del manga desde MangaPlus, capturando solo las imágenes grandes de tipo Blob.
当前为
// ==UserScript==
// @name MangaPlus Blob Downloader
// @namespace shadows
// @version 1.7.1
// @description Descarga imágenes del manga desde MangaPlus, capturando solo las imágenes grandes de tipo Blob.
// @author shadows
// @license MIT
// @match https://mangaplus.shueisha.co.jp/*
// @grant GM_download
// ==/UserScript==
"use strict";
(function () {
// Crear botón de descarga
const downloadButton = document.createElement("button");
downloadButton.textContent = "Descargar imágenes";
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);
// Evento de descarga
downloadButton.addEventListener("click", async () => {
const images = Array.from(document.querySelectorAll("img.zao-image"));
if (images.length === 0) {
alert("No se encontraron imágenes del manga para descargar.");
return;
}
// Filtrar imágenes para asegurarse de que sean de tamaño adecuado (no miniaturas ni íconos)
const largeImages = images.filter(img => img.naturalWidth > 500); // Filtrar imágenes pequeñas
if (largeImages.length === 0) {
alert("No se encontraron imágenes grandes del manga.");
return;
}
// Descargar cada imagen individualmente
for (const [index, img] of largeImages.entries()) {
try {
const blobUrl = img.src;
const fileName = `${String(index + 1).padStart(3, "0")}.jpg`; // Puedes cambiar a .png si prefieres
// Obtener la imagen Blob
const blob = await fetchBlob(blobUrl);
if (blob) {
const convertedBlob = await convertBlobToImage(blob, 'image/jpeg'); // Cambia a 'image/png' si prefieres
saveBlobAsFile(convertedBlob, fileName);
console.log(`Descargada: ${fileName}`);
} else {
console.error(`Error al obtener la imagen para: ${fileName}`);
}
} catch (err) {
console.error(`Error al descargar la imagen:`, err);
}
}
alert(`Se descargaron ${largeImages.length} imágenes grandes correctamente.`);
});
// Función para obtener el blob a partir del blob URL
async function fetchBlob(blobUrl) {
try {
const response = await fetch(blobUrl);
if (!response.ok) throw new Error(`Error al obtener la imagen: ${response.statusText}`);
return await response.blob();
} catch (error) {
console.error("Error al obtener el blob:", error);
return null;
}
}
// Función para convertir un Blob a un formato de imagen (ejemplo: JPEG)
async function convertBlobToImage(blob, mimeType) {
return new Promise((resolve, reject) => {
const img = document.createElement('img');
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const url = URL.createObjectURL(blob);
img.onload = () => {
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
canvas.toBlob((convertedBlob) => {
URL.revokeObjectURL(url);
if (convertedBlob) {
resolve(convertedBlob);
} else {
reject(new Error("Error al convertir la imagen."));
}
}, mimeType);
};
img.onerror = () => {
URL.revokeObjectURL(url);
reject(new Error("Error al cargar la imagen para convertir."));
};
img.src = url;
});
}
// Función para guardar un blob como archivo usando un enlace de descarga
function saveBlobAsFile(blob, fileName) {
const blobUrl = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = blobUrl;
a.download = fileName;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(blobUrl);
}
})();