Similar Artists from WCD missing on RED

Add a box to the sidebar with the missing Similar Artists from the WCD metadata

  1. // ==UserScript==
  2. // @name Similar Artists from WCD missing on RED
  3. // @version 0.8
  4. // @description Add a box to the sidebar with the missing Similar Artists from the WCD metadata
  5. // @author Chameleon
  6. // @include http*://*redacted.ch/artist.php?id=*
  7. // @include http*://*redacted.ch/torrents.php?id=*
  8. // @grant GM_xmlhttpRequest
  9. // @namespace https://greasyfork.org/users/87476
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. if(window.location.href.indexOf('artist.php?id=') !== -1)
  16. {
  17. artistpage();
  18. }
  19. else if(window.location.href.indexOf('torrents.php?id=') !== -1)
  20. {
  21. torrentspage();
  22. }
  23.  
  24. })();
  25.  
  26. function torrentspage()
  27. {
  28. var h2=document.getElementsByTagName('h2')[0];
  29. var artist=h2.getElementsByTagName('a')[0].textContent;
  30. var album=h2.getElementsByTagName('span')[0].textContent;
  31.  
  32. //var wcd_collage_table=document.createElement('table');
  33.  
  34. GM_xmlhttpRequest({method: "GET",
  35. url: "http://159.89.252.33/torrents.php?artistname="+encodeURIComponent(artist)+"&groupname="+encodeURIComponent(album),
  36. onload: gotSearch
  37. });
  38. }
  39.  
  40. function gotSearch(response)
  41. {
  42. var div=document.createElement('div');
  43. div.innerHTML=response.responseText;
  44.  
  45. var results=div.getElementsByClassName('group_info');
  46. if(results.length === 0)
  47. return;
  48. var link=results[0].getElementsByTagName('a')[1].href.split('torrents.php?id=')[1];
  49.  
  50. GM_xmlhttpRequest({method: "GET",
  51. url: "http://159.89.252.33/torrents.php?id="+link,
  52. onload: gotAlbum
  53. });
  54. }
  55.  
  56. function gotAlbum(response)
  57. {
  58. var div=document.implementation.createHTMLDocument();
  59. div.body.innerHTML=response.responseText;
  60. //document.body.innerHTML=response.responseText;
  61.  
  62. var table=div.getElementsByClassName('collage_table')[0];
  63. var as=table.getElementsByTagName('a');
  64. for(var i=0; i<as.length; i++)
  65. {
  66. as[i].href='javascript:void(0)';
  67. }
  68. var td=table.getElementsByTagName('td')[0];
  69. td.innerHTML=td.innerHTML.replace("is in", "was in")+" on WCD";
  70. var homeTable=document.getElementsByClassName('collage_table')[0];
  71. homeTable.parentNode.insertBefore(table, homeTable.nextElementSibling);
  72. }
  73.  
  74. function artistpage()
  75. {
  76. var artist=document.title.split(' :: Redacted')[0];
  77. var similar_artists=document.getElementsByClassName('box_artists')[0];
  78.  
  79. var box=document.createElement('div');
  80. box.innerHTML='<div class="head"><strong>WCD Similar Artists</strong></div>';
  81. box.setAttribute('class', 'box');
  82. var ul=document.createElement('ul');
  83. box.appendChild(ul);
  84. ul.setAttribute('class', 'stats nobullet');
  85. similar_artists.parentNode.insertBefore(box, similar_artists.nextElementSibling);
  86. //box.innerHTML='Searching for artist "'+artist+'" in the WCD metadata';
  87. GM_xmlhttpRequest({method: "GET",
  88. url: "http://159.89.252.33/artist.php?artistname="+encodeURIComponent(artist),
  89. onload: gotArtists1.bind(undefined, ul, similar_artists, artist)
  90. });
  91. }
  92.  
  93. function login(box, similar_artists, artist)
  94. {
  95. GM_xmlhttpRequest({method: "POST",
  96. url: "http://159.89.252.33/login.php",
  97. headers: {
  98. "Content-Type": "application/x-www-form-urlencoded"
  99. },
  100. data: "username=Rippy&password=Rippy4Life&keeplogged=1",
  101. onload: loggedIn.bind(undefined, box, similar_artists, artist)
  102. });
  103. }
  104.  
  105. function loggedIn(box, similar_artists, artist, response)
  106. {
  107. document.body.innerHTML=response.responseText;
  108. return;
  109. GM_xmlhttpRequest({method: "GET",
  110. url: "http://159.89.252.33/artist.php?action=autocomplete&query="+encodeURIComponent(artist),
  111. onload: gotArtists.bind(undefined, box, similar_artists, artist)
  112. });
  113. }
  114.  
  115. function gotArtists1(box, similar_artists, artist, response)
  116. {
  117. var f=response.finalUrl.split("?id=");
  118. if(f.length !== 2)
  119. {
  120. f=response.responseText.split('bookmarklink_artist_');
  121. console.log(parseInt(f[1]));
  122. if(isNaN(parseInt(f[1])))
  123. {
  124. box.innerHTML='Artist not found';
  125. return;
  126. }
  127. }
  128.  
  129. var d=document.createElement('div');
  130. d.innerHTML=response.responseText;
  131. var backup_similar=[];
  132. var b=d.getElementsByClassName('box_artists')[0].getElementsByTagName('li');
  133. for(var i=0; i<b.length; i++)
  134. {
  135. var bs=b[i].getElementsByTagName('a')[0];
  136. if(!bs)
  137. {
  138. box.innerHTML="No similar artists found";
  139. break;
  140. }
  141. backup_similar.push({name:bs.textContent});
  142. }
  143.  
  144. var artistID=parseInt(f[1]);
  145. var localArtistID=parseInt(window.location.href.split('?id=')[1]);
  146. GM_xmlhttpRequest({method: "GET",
  147. url: "/ajax.php?action=similar_artists&id="+localArtistID+"&limit=1000",
  148. onload: gotSimilar1.bind(undefined, box, similar_artists, artistID, backup_similar)
  149. });
  150. }
  151.  
  152. function gotArtists(box, similar_artists, artist, response)
  153. {
  154. var r;
  155. try
  156. {
  157. r=JSON.parse(response.responseText);
  158. }
  159. catch(err)
  160. {
  161. box.innerHTML='Not logged in on the <a href="http://159.89.252.33/login.php">WCD backup</a>';
  162. //login(box, similar_artists, artist);
  163. return;
  164. }
  165. if(r.suggestions.length === 0)
  166. {
  167. box.innerHTML='Artist not found';
  168. return;
  169. }
  170. var artistID=r.suggestions[0].data;
  171. var localArtistID=parseInt(window.location.href.split('?id=')[1]);
  172.  
  173. GM_xmlhttpRequest({method: "GET",
  174. url: "/ajax.php?action=similar_artists&id="+localArtistID+"&limit=1000",
  175. onload: gotSimilar1.bind(undefined, box, similar_artists, artistID)
  176. });
  177. }
  178.  
  179. function gotSimilar1(box, similar_artists, artistID, backup_similar, response)
  180. {
  181. var r=JSON.parse(response.responseText);
  182. GM_xmlhttpRequest({method: "GET",
  183. url: "http://159.89.252.33/ajax.php?action=similar_artists&id="+artistID+"&limit=1000",
  184. onload: gotSimilar.bind(undefined, box, similar_artists, backup_similar, r)
  185. });
  186. }
  187.  
  188. function gotSimilar(box, similar_artists, backup_similar, names, response)
  189. {
  190. var r=[];
  191. if(!response.responseText)
  192. {
  193. if(backup_similar.length === 0)
  194. {
  195. box.innerHTML='WCD backup doesn\'t have the similar artists for this artist<br /><a href="'+response.finalUrl+'">Link</a>';
  196. return;
  197. }
  198.  
  199. r=backup_similar;
  200. }
  201. else
  202. {
  203. var r=JSON.parse(response.responseText);
  204. if(r===null)
  205. {
  206. box.innerHTML='None found';
  207. return;
  208. }
  209. }
  210. box.innerHTML='';
  211.  
  212. var final_artists=[];
  213. for(var i=0; i<r.length; i++)
  214. {
  215. var a=r[i];
  216. var found=false;
  217. for(var j=0; j<names.length; j++)
  218. {
  219. if(convertName(names[j].name) === convertName(a.name))
  220. {
  221. found=true;
  222. break;
  223. }
  224. }
  225. if(!found)
  226. final_artists.push(a.name);
  227. }
  228.  
  229. if(final_artists.length === 0)
  230. {
  231. box.innerHTML='No new similar artists from the WCD backup';
  232. return;
  233. }
  234.  
  235. if(final_artists.length > 20)
  236. {
  237. var p=box.previousElementSibling;
  238. var a=document.createElement('a');
  239. p.appendChild(a);
  240. a.setAttribute('style', 'float: right;');
  241. a.innerHTML='(Show more)';
  242. a.href='javascript:void(0);';
  243. a.addEventListener('click', showMore.bind(undefined, box, final_artists, a));
  244. }
  245. showSimilar(box, final_artists, false);
  246. }
  247.  
  248. function convertName(name)
  249. {
  250. return name.replace('&', 'and').toLowerCase();
  251. }
  252.  
  253. function showMore(box, final_artists, a)
  254. {
  255. if(a.textContent==='(Show more)')
  256. {
  257. a.innerHTML='(Show less)';
  258. showSimilar(box, final_artists, true);
  259. }
  260. else
  261. {
  262. a.innerHTML='(Show more)';
  263. showSimilar(box, final_artists, false);
  264. }
  265. }
  266.  
  267. function showSimilar(box, final_artists, all)
  268. {
  269. box.innerHTML='';
  270. var links=[];
  271. for(var i=0; i<final_artists.length; i++)
  272. {
  273. var f=final_artists[i];
  274. var li=document.createElement('li');
  275. li.innerHTML='<a href="/artist.php?artistname='+encodeURIComponent(f)+'">'+f+'</a>';
  276. var a=document.createElement('a');
  277. li.appendChild(a);
  278. a.setAttribute('style', 'float: right;');
  279. a.innerHTML='(Add)';
  280. a.href='javascript:void(0);';
  281. a.addEventListener('click', addArtist.bind(undefined, a, f, false, [], 0));
  282. links.push({a:a, f:f});
  283. box.appendChild(li);
  284. if(i >= 19 && !all)
  285. break;
  286. }
  287. var li=document.createElement('li');
  288. box.appendChild(li);
  289. li.setAttribute('style', 'text-align: center;');
  290. var a=document.createElement('a');
  291. li.appendChild(a);
  292. a.href='javascript:void(0);';
  293. a.innerHTML='(Add all to similar artists)';
  294. a.addEventListener('click', addAll.bind(undefined, links));
  295. }
  296.  
  297. function addAll(links)
  298. {
  299. addArtist(links[0].a, links[0].f, true, links, 0);
  300. }
  301.  
  302. function addArtist(a, f, addAll, links, index)
  303. {
  304. if(a.innerHTML==='(Added)')
  305. {
  306. if(addAll)
  307. {
  308. index++;
  309. if(index >= links.length)
  310. return;
  311. addArtist(links[index].a, links[index].f, addAll, links, index);
  312. }
  313. return;
  314. }
  315. a.innerHTML='(Adding)';
  316.  
  317. var inputs=document.getElementsByClassName('add_form')[0].getElementsByTagName('input');
  318.  
  319. GM_xmlhttpRequest({method: "POST",
  320. url: "/artist.php",
  321. headers: {
  322. "Content-Type": "application/x-www-form-urlencoded"
  323. },
  324. data: "action=add_similar&auth="+inputs[1].value+"&artistid="+inputs[2].value+"&artistname="+encodeURIComponent(f),
  325. onload: addedArtist.bind(undefined, a, addAll, links, index)
  326. });
  327. }
  328.  
  329. function addedArtist(a, addAll, links, index, response)
  330. {
  331. a.innerHTML='(Added)';
  332. if(!addAll)
  333. return;
  334.  
  335. index++;
  336. if(index >= links.length)
  337. return;
  338.  
  339. window.setTimeout(addArtist.bind(undefined, links[index].a, links[index].f, addAll, links, index), 1000);
  340. }