Greasy Fork镜像 支持简体中文。

GMTI:Gazelle框架音樂PT上傳自動填充助手

通過分析上傳的torrent文件來自動填充歌手和專輯,歌曲列表等信息.

  1. // ==UserScript==
  2. // @name Gazelle Music Tracker Autofill from torrent
  3. // @name:zh GMTI:Gazelle框架音乐PT上传自动填充助手
  4. // @name:zh-CN GMTI:Gazelle框架音乐PT上传自动填充助手
  5. // @name:zh-TW GMTI:Gazelle框架音樂PT上傳自動填充助手
  6. // @version 1.7
  7. // @description Attempt to read the .torrent file and fill in the artist and album
  8. // @description:zh 通过分析上传的torrent文件来自动填充歌手和专辑,歌曲列表等信息.
  9. // @description:zh-CN 通过分析上传的torrent文件来自动填充歌手和专辑,歌曲列表等信息.
  10. // @description:zh-TW 通過分析上傳的torrent文件來自動填充歌手和專輯,歌曲列表等信息.
  11. // @author Chameleon
  12. // @include http*://redacted.ch/upload.php*
  13. // @include http*://orpheus.network/upload.php*
  14. // @include http*://dicmusic.club/upload.php*
  15. // @include http*://konor.net/upload.php*
  16. // @grant none
  17. // @run-at document-idle
  18. // @namespace https://gf.qytechs.cn/users/87476
  19. // ==/UserScript==
  20.  
  21. (function() {
  22. 'use strict';
  23.  
  24. var a=document.createElement('a');
  25. a.innerHTML = 'Auto-fill from torrent: On';
  26. if(window.location.href.indexOf('groupid=') != -1)
  27. a.innerHTML = 'Auto-fill from torrent: Off';
  28. a.href='javascript:void(0);';
  29. a.addEventListener('click', toggle.bind(undefined, a), false);
  30. a.setAttribute('style', 'display: block; text-align: center;');
  31. var before=document.getElementById('upload_table');
  32. before.parentNode.insertBefore(a, before);
  33.  
  34. var format=document.getElementById('format');
  35. var bitrate=document.getElementById('bitrate');
  36.  
  37. document.getElementById('file').addEventListener('change', fileAdded.bind(undefined, a, format, bitrate, true), false);
  38.  
  39. addToExisting(a);
  40.  
  41. // select the target node
  42. var target = document.getElementById('upload_table');
  43.  
  44. // create an observer instance
  45. var observer = new MutationObserver(addedToTable.bind(undefined, a));
  46.  
  47. // configuration of the observer:
  48. var config = { childList: true, subtree: true };
  49.  
  50. // pass in the target node, as well as the observer options
  51. observer.observe(target, config);
  52.  
  53. })();
  54.  
  55. function addToExisting(a)
  56. {
  57. var tr=document.getElementById('extra_format_row_1');
  58. var index=1;
  59. while(tr)
  60. {
  61. var input=tr.getElementsByTagName('input')[0];
  62. var format=tr.getElementsByTagName('select');
  63. var bitrate=format[1];
  64. format=format[0];
  65.  
  66. input.addEventListener('change', fileAdded.bind(undefined, a, format, bitrate, false), false);
  67.  
  68. index++;
  69. tr=document.getElementById('extra_format_row_'+index);
  70. }
  71. }
  72.  
  73. function addedToTable(a, mutations)
  74. {
  75. for(var i=0; i<mutations.length; i++)
  76. {
  77. var m=mutations[i];
  78. if(m.addedNodes.length == 1)
  79. {
  80. var id=m.addedNodes[0].getAttribute('id');
  81. if(id && id.indexOf('extra_format_row') != -1)
  82. {
  83. var tr=m.addedNodes[0];
  84. var input=tr.getElementsByTagName('input')[0];
  85. var format=tr.getElementsByTagName('select');
  86. var bitrate=format[1];
  87. format=format[0];
  88.  
  89. input.addEventListener('change', fileAdded.bind(undefined, a, format, bitrate, false), false);
  90. }
  91. }
  92. }
  93. }
  94.  
  95. function toggle(a)
  96. {
  97. if(a.innerHTML.indexOf('On') != -1)
  98. {
  99. a.innerHTML=a.innerHTML.replace('On', 'Off');
  100. }
  101. else
  102. {
  103. a.innerHTML=a.innerHTML.replace('Off', 'On');
  104. }
  105. }
  106.  
  107. function fileAdded(a, format, bitrate, full, event)
  108. {
  109. if(a.innerHTML.indexOf('Off') != -1)
  110. return;
  111. var file=event.target.files[0];
  112. if(!file)
  113. return;
  114.  
  115. var type=document.getElementById('categories').selectedOptions[0].textContent;
  116. if(type==="E-Books" || type==="Audiobooks")
  117. {
  118. document.getElementById('title').value=file.name.replace(/.torrent$/, '');
  119. return;
  120. }
  121.  
  122. if(full)
  123. {
  124. var spl=file.name.replace(/ - [0-9][0-9][0-9][0-9]/, '').split(' - ');
  125. if(spl.length == 1)
  126. {
  127. var fn=file.name;
  128. var length=4;
  129. var search=fn.search(/[0-9][0-9][0-9][0-9]/);
  130. if(search != -1)
  131. {
  132. if(fn[search-1] == '(')
  133. {
  134. search--;
  135. length=6;
  136. }
  137. spl=[];
  138. spl.push(fn.substring(0, search).trim());
  139. spl.push(fn.substring(search+length).trim());
  140. }
  141. }
  142. var artist=spl[0].split('] ');
  143. if(artist.length > 1)
  144. artist=artist[1];
  145. else
  146. artist=artist[0];
  147. document.getElementById('artist').value=artist;
  148. var album=spl[1].split(' (')[0].split(' [')[0].split(' {')[0].replace(/.torrent$/, '');
  149. document.getElementById('title').value=album;
  150.  
  151. var yadg=document.getElementById('yadg_input');
  152. if(yadg)
  153. {
  154. yadg.value=artist+' '+album;
  155. document.getElementById('yadg_submit').click();
  156. }
  157. }
  158.  
  159. var f=file.name.toLowerCase();
  160.  
  161. var formatTemp=-1;
  162. var bitrateTemp=-1;
  163. var mediaTemp=-1;
  164.  
  165. if(f.indexOf('mp3') != -1)
  166. {
  167. formatTemp=1;
  168. }
  169. else if(f.indexOf('flac') != -1)
  170. {
  171. formatTemp=2;
  172. bitrateTemp=9;
  173. }
  174. else if(f.indexOf('aac') != -1)
  175. {
  176. formatTemp=3;
  177. }
  178. else if(f.indexOf('ac3') != -1)
  179. {
  180. formatTemp=4;
  181. }
  182. else if(f.indexOf('dts') != -1)
  183. {
  184. formatTemp=5;
  185. }
  186.  
  187. if(f.indexOf('v0') != -1)
  188. {
  189. bitrateTemp=7;
  190. formatTemp=1;
  191. }
  192. else if(f.indexOf('v1') != -1)
  193. {
  194. bitrateTemp=4;
  195. formatTemp=1;
  196. }
  197. else if(f.indexOf('v2') != -1)
  198. {
  199. bitrateTemp=3;
  200. formatTemp=1;
  201. }
  202. else if(f.indexOf('192') != -1)
  203. {
  204. bitrateTemp=1;
  205. formatTemp=1;
  206. }
  207. else if(f.indexOf('256') != -1)
  208. {
  209. bitrateTemp=5;
  210. formatTemp=1;
  211. }
  212. else if(f.indexOf('320') != -1)
  213. {
  214. bitrateTemp=8;
  215. formatTemp=1;
  216. }
  217.  
  218. var media=document.getElementById('media');
  219. if(f.indexOf('dvd') != -1)
  220. {
  221. mediaTemp=2;
  222. }
  223. else if(f.indexOf('vinyl') != -1)
  224. {
  225. mediaTemp=3;
  226. }
  227. else if(f.indexOf('soundboard') != -1)
  228. {
  229. mediaTemp=4;
  230. }
  231. else if(f.indexOf('sacd') != -1)
  232. {
  233. mediaTemp=5;
  234. }
  235. else if(f.indexOf('dat') != -1)
  236. {
  237. mediaTemp=6;
  238. }
  239. else if(f.indexOf('cassette') != -1)
  240. {
  241. mediaTemp=7;
  242. }
  243. else if(f.indexOf('web') != -1)
  244. {
  245. mediaTemp=8;
  246. }
  247. else if(f.indexOf('blu-ray') != -1 || f.indexOf('bluray') != -1)
  248. {
  249. mediaTemp=9;
  250. }
  251. else
  252. mediaTemp=1;
  253.  
  254. if(formatTemp != -1)
  255. {
  256. format.selectedIndex=formatTemp;
  257. triggerChange(format);
  258. }
  259. if(bitrateTemp != -1)
  260. {
  261. bitrate.selectedIndex=bitrateTemp;
  262. triggerChange(bitrate);
  263. }
  264. if(mediaTemp != -1)
  265. {
  266. media.selectedIndex=mediaTemp;
  267. triggerChange(media);
  268. }
  269.  
  270. var r=new FileReader();
  271. r.onload=readFile;
  272. r.readAsText(file);
  273. }
  274.  
  275. function readFile(event)
  276. {
  277. var contents=event.target.result;
  278. //console.log(contents);
  279. var paths=contents.split('piece length')[0].split('filesld')[1].split(':path');
  280. var desc=document.getElementById('album_desc');
  281. if(desc.value !== '')
  282. return;
  283. var extensions=[];
  284. var tracks=[];
  285. for(var i=1; i<paths.length-1; i++)
  286. {
  287. var p=paths[i];
  288. p=p.substring(p.indexOf(':')+1).split('eed6:length')[0];
  289. var extension=p.substring(p.lastIndexOf('.'));
  290. var hasE=false;
  291. for(var j=0; j<extensions.length; j++)
  292. {
  293. if(extension == extensions[j].extension)
  294. {
  295. hasE=true;
  296. extensions[j].count++;
  297. }
  298. }
  299. if(!hasE)
  300. {
  301. extensions.push({extension:extension, count:1});
  302. }
  303. tracks.push({track:p, extension:extension});
  304. //p=p.substring(0, p.lastIndexOf('.'));
  305. //console.log(p);
  306. //desc.value+='\r'+p;
  307. }
  308. var highCount=0;
  309. var index=-1;
  310. for(var i=0; i<extensions.length; i++)
  311. {
  312. if(extensions[i].count > highCount)
  313. {
  314. highCount=extensions[i].count;
  315. index=i;
  316. }
  317. }
  318. var finalTracks=[];
  319. for(var i=0; i<tracks.length; i++)
  320. {
  321. var t=tracks[i];
  322. if(t.extension != extensions[index].extension)
  323. continue;
  324. finalTracks.push(t.track);
  325. }
  326. finalTracks.sort();
  327.  
  328. desc.value='Track list:';
  329. for(var i=0; i<finalTracks.length; i++)
  330. {
  331. var f=finalTracks[i];
  332. f=f.replace(/^[0-9][0-9]?[0-9]?\.?[\s-_]?[\s-_]?[\s-_]/, '');
  333. f=f.substring(0, f.lastIndexOf('.'));
  334. desc.value+='\r[#]'+f;
  335. }
  336. }
  337.  
  338. function triggerChange(input)
  339. {
  340. var evt = document.createEvent("HTMLEvents");
  341. evt.initEvent("change", false, true);
  342. input.dispatchEvent(evt);
  343. }

QingJ © 2025

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