PTH Autofill from torrent

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

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