APOLLO & PTH Autofill from torrent

Attempt to read the .torrent file and fill in the artist and album

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