maple3142 / Video Game Music batch downloader

// ==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)
		}))
	})
})()