Similar Artists from WCD missing on RED

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Similar Artists from WCD missing on RED
// @version      0.8
// @description  Add a box to the sidebar with the missing Similar Artists from the WCD metadata
// @author       Chameleon
// @include      http*://*redacted.ch/artist.php?id=*
// @include      http*://*redacted.ch/torrents.php?id=*
// @grant        GM_xmlhttpRequest
// @namespace https://greasyfork.org/users/87476
// ==/UserScript==

(function() {
  'use strict';

  if(window.location.href.indexOf('artist.php?id=') !== -1)
  {
    artistpage();
  }
  else if(window.location.href.indexOf('torrents.php?id=') !== -1)
  {
    torrentspage();
  }

})();

function torrentspage()
{
  var h2=document.getElementsByTagName('h2')[0];
  var artist=h2.getElementsByTagName('a')[0].textContent;
  var album=h2.getElementsByTagName('span')[0].textContent;

  //var wcd_collage_table=document.createElement('table');

  GM_xmlhttpRequest({method: "GET",
                     url: "http://159.89.252.33/torrents.php?artistname="+encodeURIComponent(artist)+"&groupname="+encodeURIComponent(album),
                     onload: gotSearch
                    });
}

function gotSearch(response)
{
  var div=document.createElement('div');
  div.innerHTML=response.responseText;

  var results=div.getElementsByClassName('group_info');
  if(results.length === 0)
    return;
  var link=results[0].getElementsByTagName('a')[1].href.split('torrents.php?id=')[1];

  GM_xmlhttpRequest({method: "GET",
                     url: "http://159.89.252.33/torrents.php?id="+link,
                     onload: gotAlbum
                    });
}

function gotAlbum(response)
{
  var div=document.implementation.createHTMLDocument();
  div.body.innerHTML=response.responseText;
  //document.body.innerHTML=response.responseText;

  var table=div.getElementsByClassName('collage_table')[0];
  var as=table.getElementsByTagName('a');
  for(var i=0; i<as.length; i++)
  {
    as[i].href='javascript:void(0)';
  }
  var td=table.getElementsByTagName('td')[0];
  td.innerHTML=td.innerHTML.replace("is in", "was in")+" on WCD";
  var homeTable=document.getElementsByClassName('collage_table')[0];
  homeTable.parentNode.insertBefore(table, homeTable.nextElementSibling);
}

function artistpage()
{
  var artist=document.title.split(' :: Redacted')[0];
  var similar_artists=document.getElementsByClassName('box_artists')[0];

  var box=document.createElement('div');
  box.innerHTML='<div class="head"><strong>WCD Similar Artists</strong></div>';
  box.setAttribute('class', 'box');
  var ul=document.createElement('ul');
  box.appendChild(ul);
  ul.setAttribute('class', 'stats nobullet');
  similar_artists.parentNode.insertBefore(box, similar_artists.nextElementSibling);
  //box.innerHTML='Searching for artist "'+artist+'" in the WCD metadata';
  GM_xmlhttpRequest({method: "GET",
                     url: "http://159.89.252.33/artist.php?artistname="+encodeURIComponent(artist),
                     onload: gotArtists1.bind(undefined, ul, similar_artists, artist)
                    });
}

function login(box, similar_artists, artist)
{
  GM_xmlhttpRequest({method: "POST",
                     url: "http://159.89.252.33/login.php",
                     headers: {
                       "Content-Type": "application/x-www-form-urlencoded"
                     },
                     data: "username=Rippy&password=Rippy4Life&keeplogged=1",
                     onload: loggedIn.bind(undefined, box, similar_artists, artist)
                    });
}

function loggedIn(box, similar_artists, artist, response)
{
  document.body.innerHTML=response.responseText;
  return;
  GM_xmlhttpRequest({method: "GET",
                     url: "http://159.89.252.33/artist.php?action=autocomplete&query="+encodeURIComponent(artist),
                     onload: gotArtists.bind(undefined, box, similar_artists, artist)
                    });
}

function gotArtists1(box, similar_artists, artist, response)
{
  var f=response.finalUrl.split("?id=");
  if(f.length !== 2)
  {
    f=response.responseText.split('bookmarklink_artist_');
    console.log(parseInt(f[1]));
    if(isNaN(parseInt(f[1])))
    {
      box.innerHTML='Artist not found';
      return;
    }
  }

  var d=document.createElement('div');
  d.innerHTML=response.responseText;
  var backup_similar=[];
  var b=d.getElementsByClassName('box_artists')[0].getElementsByTagName('li');
  for(var i=0; i<b.length; i++)
  {
    var bs=b[i].getElementsByTagName('a')[0];
    if(!bs)
    {
      box.innerHTML="No similar artists found";
      break;
    }
    backup_similar.push({name:bs.textContent});
  }

  var artistID=parseInt(f[1]);
  var localArtistID=parseInt(window.location.href.split('?id=')[1]);
  GM_xmlhttpRequest({method: "GET",
                     url: "/ajax.php?action=similar_artists&id="+localArtistID+"&limit=1000",
                     onload: gotSimilar1.bind(undefined, box, similar_artists, artistID, backup_similar)
                    });
}

function gotArtists(box, similar_artists, artist, response)
{
  var r;
  try
  {
    r=JSON.parse(response.responseText);
  }
  catch(err)
  {
    box.innerHTML='Not logged in on the <a href="http://159.89.252.33/login.php">WCD backup</a>';
    //login(box, similar_artists, artist);
    return;
  }
  if(r.suggestions.length === 0)
  {
    box.innerHTML='Artist not found';
    return;
  }
  var artistID=r.suggestions[0].data;
  var localArtistID=parseInt(window.location.href.split('?id=')[1]);

  GM_xmlhttpRequest({method: "GET",
                     url: "/ajax.php?action=similar_artists&id="+localArtistID+"&limit=1000",
                     onload: gotSimilar1.bind(undefined, box, similar_artists, artistID)
                    });
}

function gotSimilar1(box, similar_artists, artistID, backup_similar, response)
{
  var r=JSON.parse(response.responseText);
  GM_xmlhttpRequest({method: "GET",
                     url: "http://159.89.252.33/ajax.php?action=similar_artists&id="+artistID+"&limit=1000",
                     onload: gotSimilar.bind(undefined, box, similar_artists, backup_similar, r)
                    });
}

function gotSimilar(box, similar_artists, backup_similar, names, response)
{
  var r=[];
  if(!response.responseText)
  {
    if(backup_similar.length === 0)
    {
      box.innerHTML='WCD backup doesn\'t have the similar artists for this artist<br /><a href="'+response.finalUrl+'">Link</a>';
      return;
    }

    r=backup_similar;
  }
  else
  {
    var r=JSON.parse(response.responseText);
    if(r===null)
    {
      box.innerHTML='None found';
      return;
    }
  }
  box.innerHTML='';

  var final_artists=[];
  for(var i=0; i<r.length; i++)
  {
    var a=r[i];
    var found=false;
    for(var j=0; j<names.length; j++)
    {
      if(convertName(names[j].name) === convertName(a.name))
      {
        found=true;
        break;
      }
    }
    if(!found)
      final_artists.push(a.name);
  }

  if(final_artists.length === 0)
  {
    box.innerHTML='No new similar artists from the WCD backup';
    return;
  }

  if(final_artists.length > 20)
  {
    var p=box.previousElementSibling;
    var a=document.createElement('a');
    p.appendChild(a);
    a.setAttribute('style', 'float: right;');
    a.innerHTML='(Show more)';
    a.href='javascript:void(0);';
    a.addEventListener('click', showMore.bind(undefined, box, final_artists, a));
  }
  showSimilar(box, final_artists, false);
}

function convertName(name)
{
  return name.replace('&', 'and').toLowerCase();
}

function showMore(box, final_artists, a)
{
  if(a.textContent==='(Show more)')
  {
    a.innerHTML='(Show less)';
    showSimilar(box, final_artists, true);
  }
  else
  {
    a.innerHTML='(Show more)';
    showSimilar(box, final_artists, false);
  }
}

function showSimilar(box, final_artists, all)
{
  box.innerHTML='';
  var links=[];
  for(var i=0; i<final_artists.length; i++)
  {
    var f=final_artists[i];
    var li=document.createElement('li');
    li.innerHTML='<a href="/artist.php?artistname='+encodeURIComponent(f)+'">'+f+'</a>';
    var a=document.createElement('a');
    li.appendChild(a);
    a.setAttribute('style', 'float: right;');
    a.innerHTML='(Add)';
    a.href='javascript:void(0);';
    a.addEventListener('click', addArtist.bind(undefined, a, f, false, [], 0));
    links.push({a:a, f:f});
    box.appendChild(li);
    if(i >= 19 && !all)
      break;
  }
  var li=document.createElement('li');
  box.appendChild(li);
  li.setAttribute('style', 'text-align: center;');
  var a=document.createElement('a');
  li.appendChild(a);
  a.href='javascript:void(0);';
  a.innerHTML='(Add all to similar artists)';
  a.addEventListener('click', addAll.bind(undefined, links));
}

function addAll(links)
{
  addArtist(links[0].a, links[0].f, true, links, 0);
}

function addArtist(a, f, addAll, links, index)
{
  if(a.innerHTML==='(Added)')
  {
    if(addAll)
    {
      index++;
      if(index >= links.length)
        return;
      addArtist(links[index].a, links[index].f, addAll, links, index);
    }
    return;
  }
  a.innerHTML='(Adding)';

  var inputs=document.getElementsByClassName('add_form')[0].getElementsByTagName('input');

  GM_xmlhttpRequest({method: "POST",
                     url: "/artist.php",
                     headers: {
                       "Content-Type": "application/x-www-form-urlencoded"
                     },
                     data: "action=add_similar&auth="+inputs[1].value+"&artistid="+inputs[2].value+"&artistname="+encodeURIComponent(f),
                     onload: addedArtist.bind(undefined, a, addAll, links, index)
                    });
}

function addedArtist(a, addAll, links, index, response)
{
  a.innerHTML='(Added)';
  if(!addAll)
    return;

  index++;
  if(index >= links.length)
    return;

  window.setTimeout(addArtist.bind(undefined, links[index].a, links[index].f, addAll, links, index), 1000);
}