NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Video Game Music batch downloader // @name:zh-TW Video Game Music 批量下載器 // @namespace https://blog.maple3142.net/ // @version 0.1.2 // @description batch download for downloads.khinsider.com originalsoundtracks // @description:zh-TW 批量下載 downloads.khinsider.com 的原聲帶 // @author maple3142 // @require https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.5/jszip.min.js // @match https://downloads.khinsider.com/game-soundtracks/album/* // @grant GM_xmlhttpRequest // @connect 66.90.93.122 // @license MIT // @copyright 2018, maple3142 (https://blog.maple3142.net/) // ==/UserScript== (function() { 'use strict' function downloadblob(url){ return new Promise((resolve,reject)=>{ GM_xmlhttpRequest({ method: 'GET', url, responseType: 'blob', onload: res=>resolve(res.response) }) }) } $('a:contains("click to download")').on('click',e=>{ e.preventDefault() $('.albumMassDownload').append(` <div> <span>Download progress:</span> <progress min="0" max="100" id="dp" value="0"></progress> </div> `) const title=$('h2')[0].textContent const urls=$('tr>td.clickable-row:not([align])').toArray().map(el=>$(el).find('a').attr('href')) const requests=urls.map(e=>fetch(e).then(r=>r.text())) Promise.all(requests).then(ar=>ar.map(ht=>{ const url=$(ht).find('a:contains("Click here to download as MP3")').attr('href') return { blob: downloadblob(url), name: decodeURIComponent(url.split('/').pop()) } }).reduce((zip,file)=>{ zip.file(file.name,file.blob) return zip },new JSZip()).generateAsync({type: 'blob'},meta=>{ $('#dp').attr('value',parseInt(meta.percent)) }).then(blob=>{ const url=URL.createObjectURL(blob) const a=document.createElement('a') a.download=title+'.zip' a.href=url document.body.appendChild(a) a.click() a.remove() URL.revokeObjectURL(url) })) }) })()