khinsider batch downloader

batch download for downloads.khinsider.com originalsoundtracks

目前为 2019-08-21 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name khinsider batch downloader
  3. // @name:zh-TW khinsider 批量下載器
  4. // @namespace https://blog.maple3142.net/
  5. // @description batch download for downloads.khinsider.com originalsoundtracks
  6. // @description:zh-TW 批量下載 downloads.khinsider.com 的原聲帶
  7. // @version 0.1.5
  8. // @author maple3142
  9. // @match https://downloads.khinsider.com/game-soundtracks/album/*
  10. // @require https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.5/jszip.min.js
  11. // @require https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.min.js
  12. // @connect 66.90.93.122
  13. // @license MIT
  14. // @copyright 2018, maple3142 (https://blog.maple3142.net/)
  15. // @grant GM_xmlhttpRequest
  16. // ==/UserScript==
  17.  
  18. (function ($,JSZip) {
  19. 'use strict';
  20.  
  21. $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
  22. JSZip = JSZip && JSZip.hasOwnProperty('default') ? JSZip['default'] : JSZip;
  23.  
  24. function downloadblob(url) {
  25. return new Promise((resolve, reject) => {
  26. GM_xmlhttpRequest({
  27. method: 'GET',
  28. url,
  29. responseType: 'blob',
  30. onload: res => resolve(res.response)
  31. });
  32. });
  33. }
  34.  
  35. $('a:contains("click to download")').on('click', async e => {
  36. e.preventDefault();
  37. $('.albumMassDownload').prev().replaceWith(`
  38. <div style="padding-left: 10px;">
  39. <span>Download progress:</span>
  40. <progress min="0" max="100" id="dp" value="0"></progress>
  41. </div>
  42. `);
  43.  
  44. const title = $('h2')[0].textContent;
  45. const urls = $('tr>td.clickable-row:not([align])').toArray().map(el => $(el).find('a').attr('href'));
  46. const requests = urls.map(e => fetch(e).then(r => r.text()));
  47. const files = (await Promise.all(requests)).map(html => {
  48. const url = $(html).find('a:contains("Click here to download as MP3")').attr('href');
  49. return { blob: downloadblob(url), name: decodeURIComponent(url.split('/').pop()) };
  50. });
  51. const blob = await files.reduce((zip, file) => {
  52. zip.file(file.name, file.blob);
  53. return zip;
  54. }, new JSZip()).generateAsync({ type: 'blob' }, meta => $('#dp').attr('value', parseInt(meta.percent)));
  55. const url = URL.createObjectURL(blob);
  56. const a = document.createElement('a');
  57. a.download = title + '.zip';
  58. a.href = url;
  59. document.body.appendChild(a);
  60. a.click();
  61. a.remove();
  62. URL.revokeObjectURL(url);
  63. });
  64.  
  65. }($,JSZip));