您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Image downloader for manga download scripts.
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/451810/1124333/ImageDownloaderLib.js
function ImageDownloader({ getImagePromises, isOKToDownload = () => true, title = `package_${Date.now()}`, zipOptions = {}, imageSuffix = 'jpg', cssVerticalDistance = 'top: 80px', cssHorizontalDistance = 'left: 80px' }) { // create download button element const dlBtn = document.createElement('button'); dlBtn.textContent = 'Download'; dlBtn.style = ` position: fixed; ${cssVerticalDistance}; ${cssHorizontalDistance}; z-index: 9999999; width: 128px; height: 48px; display: flex; justify-content: center; align-items: center; font-size: 14px; font-family: 'Consolas', 'Monaco', 'Microsoft YaHei'; color: #fff; background-color: #0984e3; border: none; border-radius: 4px; cursor: pointer; `; // setup click event callback dlBtn.onclick = function () { if (!isOKToDownload()) return; dlBtn.disabled = true; dlBtn.textContent = "Processing"; dlBtn.style.backgroundColor = '#aaa'; dlBtn.style.cursor = 'not-allowed'; download(getImagePromises, title, zipOptions); } // add button to body document.body.appendChild(dlBtn); // download async function download(getImagePromises, title, zipOptions) { // get promises of images const imagePromises = getImagePromises(); // setup progress updater setupProgressUpdater(imagePromises); // wait until all promises are resolved const images = await Promise.all(imagePromises); // create zip const zip = new JSZip(); // JSZip library should be imported already const folder = zip.folder(title); images.forEach((image, index) => { const filename = `${String(index + 1).padStart(images.length >= 100 ? String(images.length).length : 2, '0')}.${imageSuffix}`; folder.file(filename, image, zipOptions); }); // pop up download window const content = await zip.generateAsync({ type: "blob" }); saveAs(content, `${title}.zip`); // FileSaver library should be imported already // change the text of download button dlBtn.innerText = "Completed"; } function setupProgressUpdater(imagePromises) { const timer = setInterval(() => { const statePromises = imagePromises.map(getPromiseState); Promise .all(statePromises) .then(states => { const fulfillCount = states.filter(state => state === 'fulfilled').length; dlBtn.textContent = `Processing\n(${fulfillCount}/${states.length})`; if (fulfillCount === states.length) { dlBtn.textContent = "Zipping"; clearInterval(timer); } }); }, 200); } async function getPromiseState(targetPromise) { const uniqueFlag = {}; return Promise.race([targetPromise, uniqueFlag]).then( (raceResult) => raceResult === uniqueFlag ? 'pending' : 'fulfilled', () => 'rejected' ); } }