download mangarawjp

add download button in mangarawjp

目前為 2023-12-22 提交的版本,檢視 最新版本

// ==UserScript==
// @name         download mangarawjp
// @namespace    download-mangarawjp
// @version      0.1
// @description  add download button in mangarawjp
// @author       JaHIY
// @license      GNU GPLv3
// @match        https://mangarawjp.one/*
// @icon         https://mangarawjp.one/favicon.ico
// @require      https://cdn.jsdelivr.net/npm/@zip.js/[email protected]/dist/zip.min.js
// @grant        GM_xmlhttpRequest
// @connect      *
// ==/UserScript==

(function() {
    'use strict';

    function createIconElement(iconName) {
        const span = document.createElement('span');
        const i = document.createElement('i');
        i.classList.add('fa', `fa-${iconName}`);
        i.ariaHidden = 'true';
        span.classList.add('icon', 'is-size-6');
        span.append(i);
        return span;
    }

    function createDownloadElement(pageLink, name) {
        const btn = document.createElement('button');
        const downloadIcon = createIconElement('download');
        downloadIcon.dataset.pageLink = pageLink;
        downloadIcon.dataset.name = name;
        downloadIcon.classList.add('download-manga');
        btn.type = 'button';
        btn.classList.add('button', 'is-small');
        btn.append(downloadIcon);
        return btn;
    }

    async function findImageLinks(pageLink) {
        const parser = new DOMParser();
        const resp = await fetch(pageLink);
        const text = await resp.text();

        const doc = parser.parseFromString(text, 'text/html');
        const images = Array.from(doc.querySelectorAll('.container-chapter-reader .card-wrap img'));
        const imageLinks = images.map(img => img.dataset.src);

        return imageLinks;
    }

    async function downloadSingleImage(imageLink, pageLink) {
        const resp = await GM.xmlHttpRequest({
            url: imageLink,
            headers: {
                referer: pageLink,
            },
            responseType: 'blob',
        }).catch(e => console.error(e));
        const blob = await resp.response;

        return blob;
    }

    async function downloadManga(el) {
        const clickedElement = el.target.parentNode;
        if (clickedElement
            && clickedElement.matches('.download-manga')
            && clickedElement.dataset.pageLink) {
            console.log(clickedElement);

            const pageLink = clickedElement.dataset.pageLink;
            const name = clickedElement.dataset.name;
            const imageLinks = await findImageLinks(pageLink);
            console.log(imageLinks);

            const imageBlobs = await Promise.all(imageLinks.map(async (imageLink) => await downloadSingleImage(imageLink, pageLink)));

            const blobWriter = new zip.BlobWriter("application/zip");
            const zipWriter = new zip.ZipWriter(blobWriter);
            const targetLength = imageLinks.length.toString().length;
            await Promise.all(Array.from(imageBlobs.entries()).map(async ([i, blob]) => {
                console.log(i, blob);
                const filename = `${i.toString().padStart(targetLength,'0')}.jpg`;
                await zipWriter.add(filename, new zip.BlobReader(blob));
            }));
            const zipFile = await zipWriter.close();
            const blobURL = URL.createObjectURL(zipFile);

            const anchor = document.createElement("a");
            anchor.download = `${name}.zip`;
            console.log(anchor.download);
            anchor.href = blobURL;
            document.body.appendChild(anchor);
            anchor.click();
            document.body.removeChild(anchor);
        }
    }

    function addClickButton(el) {
        const anchor =el.querySelector('a.text-info');
        const pageLink = anchor.href;
        const name = anchor.title.replaceAll(/[\\\/:*?"<>|]/g, " ").trim();
        const downloadElement = createDownloadElement(pageLink, name);
        el.append(downloadElement);
        return el;
    }

    document.querySelectorAll('.list-scoll th').forEach(addClickButton);
    document.querySelector('.list-scoll').addEventListener('click', downloadManga);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址