asmrone-download-aria2

asmrone添加aria2下载

  1. // ==UserScript==
  2. // @name asmrone-download-aria2
  3. // @name:zh-CN asmrone-download-aria2
  4. // @name:en asmrone-download-aria2
  5. // @namespace http://tampermonkey.net/
  6. // @version 1.0.2
  7. // @license MIT
  8. // @description asmrone添加aria2下载
  9. // @description:zh-CN asmrone添加aria2下载
  10. // @description:en asmrone添加aria2下载
  11. // @author crudBoy
  12. // @match https://asmr-200.com/work/*
  13. // @match https://asmr-100.com/work/*
  14. // @match https://asmr-300.com/work/*
  15. // @match https://asmr.one/work/*
  16. // @icon https://www.dlsite.com/images/web/common/logo/pc/logo-dlsite.png
  17. // @grant GM_xmlhttpRequest
  18. // @connect asmr-100.com
  19. // @connect asmr-200.com
  20. // @connect asmr-300.com
  21. // @connect asmr.one
  22. // @connect nas
  23. // ==/UserScript==
  24.  
  25. (function () {
  26. 'use strict';
  27. // 配置信息
  28. // Aria2 的访问密钥,如果未设置留空
  29. let secret = "";
  30.  
  31. // Aria2 服务的主机地址
  32. const host = "nas";
  33.  
  34. // Aria2 服务的端口号
  35. const port = 16800;
  36.  
  37. // Aria2 的 JSON-RPC 接口地址
  38. const aria2Url = `http://${host}:${port}/jsonrpc`;
  39.  
  40. // 请求超时时间,单位为毫秒
  41. const timeout = 30000;
  42.  
  43. // 文件保存路径
  44. const path = "F:\\新建文件夹";
  45.  
  46. // 是否只下载带SE文件
  47. const onlySE = false;
  48.  
  49. window.addEventListener('load', function () {
  50. // 延时 300 毫秒执行 addButton
  51. setTimeout(addButton, 300);
  52. }, false);
  53.  
  54. function addButton() {
  55. let button = document.createElement("button");
  56. button.setAttribute("tabindex", "0");
  57. button.setAttribute("type", "button");
  58. button.className = "q-btn q-btn-item non-selectable no-outline q-mt-sm shadow-4 q-mx-xs q-px-sm q-btn--standard q-btn--rectangle bg-green text-white q-btn--actionable q-focusable q-hoverable q-btn--wrap q-btn--dense";
  59. button.innerHTML = `
  60. <span class="q-focus-helper"></span>
  61. <span class="q-btn__wrapper col row q-anchor--skip">
  62. <span class="q-btn__content text-center col items-center q-anchor--skip justify-center row">
  63. <i aria-hidden="true" role="img" class="q-icon on-left notranslate material-icons">download</i>
  64. <span class="block">aria2下载</span>
  65. </span>
  66. </span>
  67. `;
  68.  
  69. // 添加点击事件
  70. button.addEventListener("click", function () {
  71. console.log("aria2下载按钮被点击了!");
  72. // 在这里添加你的逻辑
  73. download()
  74. });
  75.  
  76. let qpasm = document.getElementsByClassName("q-pa-sm");
  77.  
  78. if (qpasm.length > 0) {
  79. // 在子元素的最后一个位置添加按钮
  80. qpasm[qpasm.length - 1].appendChild(button);
  81. } else {
  82. console.error("未找到类名为 'q-pa-sm' 的元素!");
  83. }
  84. }
  85.  
  86. function download() {
  87. fetchTrack()
  88. }
  89.  
  90. function fetchTrack() {
  91. const urlWithoutParams = window.location.href.split(/[?#]/)[0];
  92. const id = urlWithoutParams.split('/').pop().substring(2);
  93. let url = "https://api." + window.location.host + "/api/tracks/" + id
  94. // 获取音轨数据
  95. fetchData(url)
  96. .then((response) => {
  97. const trackData = JSON.parse(response.responseText); // 假设返回的数据是 JSON 格式
  98. downloadTracksByAria2(path + "\\" + urlWithoutParams.split('/').pop(), trackData)
  99. })
  100. .catch((error) => console.error("获取音轨数据时发生错误:", error));
  101. }
  102.  
  103. // 遍历并下载音轨
  104. async function downloadTracksByAria2(path, tracks) {
  105. for (const track of tracks) {
  106. if (track.type === "folder") { // 判断是否是文件夹
  107. if (onlySE) {
  108. if (isNoSE(track.title)) continue; // 跳过包含无效关键字的文件夹
  109. }
  110. const folderPath = `${path}/${track.title}`;
  111. await downloadTracksByAria2(folderPath, track.children);
  112. } else {
  113. const downParam = {
  114. dir: path,
  115. out: track.title || "unknown_file",
  116. };
  117. await addUri([track.mediaDownloadUrl], downParam);
  118. }
  119. }
  120. }
  121.  
  122. function fetchData(url) {
  123. return new Promise((resolve, reject) => {
  124. GM_xmlhttpRequest({
  125. method: "GET",
  126. url: url,
  127. onload: (response) => resolve(response),
  128. onerror: (error) => reject(error),
  129. });
  130. });
  131. }
  132.  
  133. // 发送请求到 Aria2
  134. function addUri(uris, options) {
  135. const id = generateUUID(); // 生成唯一 ID
  136. const body = {
  137. jsonrpc: "2.0",
  138. id: id,
  139. method: "aria2.addUri",
  140. params: [uris, options],
  141. };
  142.  
  143. GM_xmlhttpRequest({
  144. method: "POST",
  145. url: aria2Url,
  146. data: JSON.stringify(body),
  147. headers: {
  148. "Content-Type": "application/json",
  149. },
  150. timeout: timeout,
  151. onload: function (response) {
  152. if (response.status >= 200 && response.status < 300) {
  153. const result = JSON.parse(response.responseText);
  154. console.log("下载成功:", result);
  155. } else {
  156. console.error("下载失败,状态码:", response.status);
  157. }
  158. },
  159. onerror: function (error) {
  160. console.error("请求错误:", error);
  161. },
  162. ontimeout: function () {
  163. console.error("请求超时!");
  164. },
  165. });
  166. }
  167.  
  168.  
  169. // 判断是否没有包含特定的音效
  170. function isNoSE(title) {
  171. const noSEKeywords = [
  172. "SEなし", "左右反転", "音なし", "noSE", "声なし", "无SE",
  173. "SE無", "音無し", "無SE", "無し", "无音效"
  174. ];
  175. return noSEKeywords.some(keyword => title?.toLowerCase().includes(keyword.toLowerCase()));
  176. }
  177.  
  178. // 生成 UUID
  179. function generateUUID() {
  180. return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
  181. const r = (Math.random() * 16) | 0;
  182. const v = c === "x" ? r : (r & 0x3) | 0x8;
  183. return v.toString(16);
  184. });
  185. }
  186. })();

QingJ © 2025

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