PTH iTunes Cover Search

Search iTunes for cover art

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         PTH iTunes Cover Search
// @version      2.0
// @description  Search iTunes for cover art
// @author       Chameleon
// @include      http*://redacted.ch/*
// @grant        GM_xmlhttpRequest
// @namespace https://greasyfork.org/users/87476
// ==/UserScript==

(function() {
  'use strict';

  if(window.location.href.indexOf('upload.php') != -1)
    showUpload();
  if(window.location.href.indexOf('torrents.php?action=editgroup&groupid=') != -1)
    showEdit();
  if(window.location.href.indexOf('torrents.php?id=') != -1)
    saveArtist();
  if(window.location.href.indexOf('better.php') != -1 && window.location.href.indexOf('method=artwork') != -1)
    showBetter();
})();

function showBetter()
{
  var rows=document.getElementsByClassName('torrent_row');
  for(var i=0; i<rows.length; i++)
  {
    var r=rows[i];
    var as=r.getElementsByTagName('a');
    var artist=as[0].textContent;
    var album=as[1].textContent;
    var groupId=as[1].href.split('id=')[1];
    var div=as[0].parentNode;

    var optionsDiv=document.createElement('div');
    optionsDiv.style.display='none';
    var search=document.createElement('input');
    optionsDiv.appendChild(search);
    search.setAttribute('placeholder', 'search');
    search.value=(artist+' '+album).trim();
    var country=document.createElement('input');
    optionsDiv.appendChild(country);
    country.setAttribute('placeholder', 'country code');
    country.value='US';

    var toggle=document.createElement('a');
    toggle.href='javascript:void(0);';
    toggle.innerHTML = 'Show search';
    toggle.addEventListener('click', toggleDiv.bind(undefined, toggle, optionsDiv), false);

    var messageDiv=document.createElement('div');
    var image=document.createElement('input');
    image.setAttribute('style', 'width: 250px;');
    var rehostA=document.createElement('a');
    rehostA.href='javascript:void(0);';
    rehostA.innerHTML = 'Auto-rehost: Off';
    rehostA.addEventListener('click', toggleAutoRehost.bind(undefined, rehostA, image, messageDiv), false);

    image.addEventListener('keyup', rehost.bind(undefined, image, messageDiv), false);

    if(window.localStorage.autoUpload == "true")
    {
      image.setAttribute('autorehost', 'true');
      rehostA.innerHTML = 'Auto-rehost: On';
    }
    
    var imageDiv=document.createElement('div');
    var save=document.createElement('a');
    save.href='javascript:void(0);';
    save.innerHTML = 'Save';
    save.addEventListener('click', saveCover.bind(undefined, messageDiv, imageDiv, image, groupId), false);
    
    var a=document.createElement('a');
    div.appendChild(document.createElement('br'));
    div.appendChild(a);
    div.appendChild(document.createTextNode(' | '));
    div.appendChild(toggle);
    div.appendChild(optionsDiv);
    div.appendChild(document.createElement('br'));
    div.appendChild(image);
    div.appendChild(document.createTextNode(' '));
    div.appendChild(save);
    div.appendChild(document.createTextNode(' | '));
    div.appendChild(rehostA);
    div.appendChild(messageDiv);
    a.innerHTML='Get image from iTunes';
    a.href='javascript:void(0);';
    imageDiv.setAttribute('style', 'text-align: center;');
    div.appendChild(imageDiv);
    a.addEventListener('click', getAlbum.bind(undefined, country, search, image, div, messageDiv, imageDiv), false);
  }
}

function saveCover(messageDiv, imageDiv, image, groupId)
{
  messageDiv.innerHTML = 'Loading torrent group edit page';
  var xhr=new XMLHttpRequest();
  xhr.open('GET', "/torrents.php?action=editgroup&groupid="+groupId);
  xhr.onreadystatechange = xhr_func.bind(undefined, messageDiv, xhr, editPage.bind(undefined, messageDiv, imageDiv, image), saveCover.bind(undefined, messageDiv, imageDiv, image, groupId));
  xhr.send();
}

function editPage(messageDiv, imageDiv, image, response)
{
  var div=document.createElement('div');
  div.innerHTML = response;
  var form = div.getElementsByClassName('edit_form')[0];
  var image_input = form.getElementsByTagName('input')[3];
  image_input.value = image.value;
  form.getElementsByTagName('input')[4].value = 'iTunes userscript: added cover';
  
  var inputs = form.getElementsByTagName('input');
  var formData = new FormData();
  for(var i=0; i<inputs.length; i++)
  {
    if(inputs[i].name === "")
      continue;
    formData.append(inputs[i].name, inputs[i].value);
  }
  var textarea = form.getElementsByTagName('textarea')[0];
  formData.append(textarea.name, textarea.value);
  var release = form.getElementsByTagName('select')[0];
  if(release)
    formData.append(release.name, release.value);

  messageDiv.innerHTML = "Saving edited torrent group";
  
  var xhr = new XMLHttpRequest();
  xhr.open('POST', '/torrents.php');
  xhr.onreadystatechange = xhr_func.bind(undefined, messageDiv, xhr, submitted.bind(undefined, messageDiv, imageDiv), editPage.bind(undefined, messageDiv, imageDiv, image));
  xhr.send(formData);
}

function submitted(messageDiv, imageDiv)
{
  messageDiv.innerHTML = "Saved";
  imageDiv.innerHTML = '';
}

function saveArtist()
{
  var artist=document.getElementsByTagName('h2')[0].textContent.split(' - ')[0];
  window.localStorage.lastArtist=artist;
}

function showEdit()
{
  var before=document.getElementsByClassName('edit_form')[0].getElementsByTagName('br')[0];
  var image=document.getElementsByName('image')[0];
  var artist=window.localStorage.lastArtist;
  if(!artist)
    artist='';
  var album=document.getElementsByTagName('h2')[0].getElementsByTagName('a')[0].innerHTML;
  var div=document.createElement('div');
  before.parentNode.insertBefore(div, before);

  var messageDiv=document.createElement('div');

  if(image.parentNode.innerHTML.indexOf('Auto-rehost') == -1)
  {
    var a=document.createElement('a');
    div.parentNode.insertBefore(a, div);
    div.parentNode.insertBefore(document.createTextNode(' '), a);
    a.href='javascript:void(0);';
    a.innerHTML = 'Auto-rehost: Off';
    a.addEventListener('click', toggleAutoRehost.bind(undefined, a, image, messageDiv), false);

    image.addEventListener('keyup', rehost.bind(undefined, image, messageDiv), false);

    if(window.localStorage.autoUpload == "true")
    {
      image.setAttribute('autorehost', 'true');
      a.innerHTML = 'Auto-rehost: On';
    }
  }

  var optionsDiv=document.createElement('div');
  optionsDiv.style.display='none';
  var search=document.createElement('input');
  optionsDiv.appendChild(search);
  search.setAttribute('placeholder', 'search');
  search.value=(artist+' '+album).trim();
  var country=document.createElement('input');
  optionsDiv.appendChild(country);
  country.setAttribute('placeholder', 'country code');
  country.value='US';

  var toggle=document.createElement('a');
  toggle.href='javascript:void(0);';
  toggle.innerHTML = 'Show search';
  toggle.addEventListener('click', toggleDiv.bind(undefined, toggle, optionsDiv), false);

  var a=document.createElement('a');
  div.appendChild(a);
  div.appendChild(document.createTextNode(' | '));
  div.appendChild(toggle);
  div.appendChild(optionsDiv);
  div.appendChild(messageDiv);
  a.innerHTML='Get image from iTunes';
  a.href='javascript:void(0);';
  var imageDiv=document.createElement('div');
  imageDiv.setAttribute('style', 'text-align: center;');
  div.appendChild(imageDiv);
  a.addEventListener('click', getAlbum.bind(undefined, country, search, image, div, messageDiv, imageDiv), false);
}

function toggleDiv(a, div)
{
  if(a.innerHTML.indexOf('Show') != -1)
  {
    a.innerHTML = a.innerHTML.replace('Show', 'Hide');
    div.style.display='';
  }
  else
  {
    a.innerHTML = a.innerHTML.replace('Hide', 'Show');
    div.style.display='none';
  }
}

function showUpload()
{
  var artist=document.getElementById('artist');
  var album=document.getElementById('title');
  var image=document.getElementById('image');
  var imageTd=image.parentNode;

  var messageDiv=document.createElement('div');
  imageTd.appendChild(messageDiv);

  var div=imageTd;

  var optionsDiv=document.createElement('div');
  optionsDiv.style.display='none';
  var search=document.createElement('input');
  optionsDiv.appendChild(search);
  search.setAttribute('placeholder', 'search');
  search.value=(artist.value+' '+album.value).trim();
  var country=document.createElement('input');
  optionsDiv.appendChild(country);
  country.setAttribute('placeholder', 'country code');
  country.value='US';

  var toggle=document.createElement('a');
  toggle.href='javascript:void(0);';
  toggle.innerHTML = 'Show search';
  toggle.addEventListener('click', toggleDiv.bind(undefined, toggle, optionsDiv), false);

  var a=document.createElement('a');
  div.appendChild(a);
  div.appendChild(document.createTextNode(' | '));
  div.appendChild(toggle);
  div.appendChild(optionsDiv);
  a.innerHTML='Get image from iTunes';
  a.href='javascript:void(0);';
  var imageDiv=document.createElement('div');
  imageDiv.setAttribute('style', 'text-align: center;');
  div.appendChild(imageDiv);
  a.addEventListener('click', getAlbumUpload.bind(undefined, album, artist, country, search, image, imageTd, messageDiv, imageDiv), false);
}

function getAlbumUpload(album, artist, country, search, image, imageTd, messageDiv, imageDiv)
{
  if(search.value.length === 0)
    search.value=(artist.value+' '+album.value).trim();
  getAlbum(country, search, image, imageTd, messageDiv, imageDiv);
}

function getAlbum(country, search, im, td, messageDiv, imageDiv)
{
  //console.log(im);

  /*var xhr = new XMLHttpRequest();
  xhr.open('GET', "https://itunes.apple.com/search?"+encodeURIComponent(artist+' '+album));
  xhr.onreadystatechange = xhr_func.bind(undefined, messageDiv, xhr, gotAlbum.bind(undefined, im, td, messageDiv), getAlbum.bind(undefined, a, al, im, td, messageDiv));
  xhr.send();*/

  //console.log("https://itunes.apple.com/search?term="+encodeURIComponent(artist+' '+album));
  messageDiv.innerHTML = 'Searching for image on iTunes';
  var s="https://itunes.apple.com/search?term="+encodeURIComponent(search.value);
  if(country.value.length > 0 && country.value != 'US')
  {
    s+="&country="+encodeURIComponent(country.value);
  }
  GM_xmlhttpRequest({
    method: "GET",
    url: s,
    onload: function(response) { if(response.status == 200) {gotAlbum(im, td, messageDiv, imageDiv, response.responseText); } else { messageDiv.innerHTML = 'iTunes error: '+response.status; } }
  });
}

function gotAlbum(input, td, messageDiv, imageDiv, response)
{
  messageDiv.innerHTML = 'Got images';
  var r=JSON.parse(response);
  if(r.results.length > 0)
  {
    var div=imageDiv;
    div.innerHTML='Current: 1 | ';
    if(r.results.length > 1)
    {
      div.setAttribute('results', JSON.stringify(r.results));
      div.setAttribute('index', '0');
      var a=document.createElement('a');
      a.innerHTML='Next';
      a.href='javascript:void(0);';
      a.addEventListener('click', changeImage.bind(undefined, div, 1, input), false);
      div.appendChild(a);
      div.appendChild(document.createElement('br'));
    }
    var a=document.createElement('a');
    a.href='javascript:void(0);';
    div.appendChild(a);
    var img=document.createElement('img');
    a.setAttribute('imageSize', 'large');
    a.addEventListener('click', changeSize.bind(undefined, a, img, input, r.results[0].artworkUrl60), false);
    a.appendChild(img);
    img.src=r.results[0].artworkUrl60.replace("60x60bb", "10000x10000-999");
    input.value = img.src;
    if(window.localStorage.iTunesSize == 'small')
      a.click();
    else
    {
      var evt = document.createEvent("HTMLEvents");
      evt.initEvent("keyup", false, true);
      input.dispatchEvent(evt);
    }
  }
  else
    messageDiv.innerHTML = "no results";
}

function changeImage(div, amount, input)
{
  var r=JSON.parse(div.getAttribute('results'));
  var index=parseInt(div.getAttribute('index'));
  index+=amount;
  if(index < 0)
    index=0;
  if(index >= r.length)
    index=r.length-1;

  div.setAttribute('index', index);

  div.innerHTML='Current: '+(index+1)+' | ';

  if(index != r.length-1)
  {
    //div.setAttribute('results', JSON.stringify(r));
    div.setAttribute('index', index);
    var a=document.createElement('a');
    a.innerHTML='Next';
    a.href='javascript:void(0);';
    a.addEventListener('click', changeImage.bind(undefined, div, 1, input), false);
    div.appendChild(a);

    if(index !== 0)
      div.appendChild(document.createTextNode(' | '));
  }
  if(index !== 0)
  {
    //div.setAttribute('results', JSON.stringify(r));
    div.setAttribute('index', index);
    var a=document.createElement('a');
    a.innerHTML='Previous';
    a.href='javascript:void(0);';
    a.addEventListener('click', changeImage.bind(undefined, div, -1, input), false);
    div.appendChild(a);
  }
  div.appendChild(document.createTextNode(' | '));
  var a=document.createElement('a');
  div.appendChild(a);
  a.href='javascript:void(0);';
  a.innerHTML = 'Copy to input';
  var img=document.createElement('img');
  a.addEventListener('click', triggerKeyup.bind(undefined, input, img), false);

  div.appendChild(document.createElement('br'));

  var a=document.createElement('a');
  a.href='javascript:void(0);';
  div.appendChild(a);
  a.setAttribute('imageSize', 'large');
  a.addEventListener('click', changeSize.bind(undefined, a, img, input, r[index].artworkUrl60), false);
  a.appendChild(img);
  var artwork=r[index].artworkUrl60.replace("60x60bb", "10000x10000-999");
  if(window.localStorage.iTunesSize == 'small')
    artwork=r[index].artworkUrl60.replace("60x60bb", "600x600bb");
  img.src=artwork;
  //input.value = img.src;
}

function triggerKeyup(input, img)
{
  input.value=img.src;
  var evt = document.createEvent("HTMLEvents");
  evt.initEvent("keyup", false, true);
  input.dispatchEvent(evt);
}

function changeSize(a, img, input, url)
{
  if(a.getAttribute('imageSize') == 'large')
  {
    window.localStorage.iTunesSize='small';
    a.setAttribute('imageSize', 'small');
    url=url.replace("60x60bb", "600x600bb");
  }
  else
  {
    window.localStorage.iTunesSize='large';
    a.setAttribute('imageSize', 'large');
    url=url.replace("60x60bb", "10000x10000-999");
  }
  input.value=url;
  img.src=url;
  var evt = document.createEvent("HTMLEvents");
  evt.initEvent("keyup", false, true);
  input.dispatchEvent(evt);
}

function rehost(imageInput, span)
{
  if(imageInput.getAttribute('autorehost') != "true")
    return;
  var whitelisted = ["imgur.com", "ptpimg.me"];
  if(imageInput.value.length < 1)
    return;
  for(var i=0; i<whitelisted.length; i++)
  {
    var whitelist=whitelisted[i];
    if(imageInput.value.indexOf(whitelist) != -1)
      return;
  }

  if(imageInput.value.indexOf("discogs.com") != -1)
  {
    imageInput.value = "http://reho.st/"+imageInput.value;
  }

  span.innerHTML = 'Rehosting';
  var formData = new FormData();
  formData.append('image', imageInput.value);
  if(imageInput.getAttribute('working') == "true")
    return;
  imageInput.setAttribute('working', "true");
  window.setTimeout(unworking.bind(undefined, imageInput), 1000);

  var settings = getSettings();

  if(settings.site == 'imgur.com')
  {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'https://api.imgur.com/3/image');
    xhr.setRequestHeader('Authorization', 'Client-ID 735033a56fe790b');
    xhr.onreadystatechange = xhr_func.bind(undefined, span, xhr, rehosted.bind(undefined, imageInput, span), rehost.bind(undefined, imageInput, span));
    xhr.send(formData);
  }
  else if(settings.site == 'ptpimg.me')
  {    
    if(!settings.apiKey || settings.apiKey.length != 36)
    {
      span.innerHTML = 'No valid ptpimg.me API key set';
      return;
    }
    /*var formData = new FormData();
    formData.append('link-upload', image_input.value);
    formData.append('api_key', 'xx');
    // ptpimg.me doesn't have 'Access-Control-Allow-Origin' set
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'https://ptpimg.me/upload.php');
    xhr.onreadystatechange = xhr_func.bind(undefined, a, xhr, uploaded.bind(undefined, a, form, settings), doRehost.bind(undefined, a, image_input, form, settings));
    xhr.send(formData);*/
    // use GM_xmlhttpRequest for cross-domain
    GM_xmlhttpRequest({
      method: "POST",
      url: 'https://ptpimg.me/upload.php',
      data: "link-upload="+encodeURIComponent(imageInput.value)+'&api_key='+settings.apiKey,
      headers: {
        "Content-Type": "application/x-www-form-urlencoded"
      },
      onload: function(response) { rehosted(imageInput, span, response.responseText); }
    });
  }
}

function getSettings()
{
  var settings = window.localStorage.uploadFromUploadPageSettings;
  if(!settings)
  {
    settings = {site:'imgur.com', apiKey:window.localStorage.ptpimgAPIKey ? window.localStorage.ptpimgAPIKey : ''};
  }
  else
    settings = JSON.parse(settings);
  return settings;
}

function unworking(input)
{
  input.setAttribute('working', "false");
}

function rehosted(imageInput, span, response)
{
  var settings = getSettings();
  var newLink='';
  try
  {
    if(settings.site == 'imgur.com')
      newLink = JSON.parse(response).data.link.replace(/http:/, 'https:');
    else if(settings.site == 'ptpimg.me')
    {
      var r=JSON.parse(response)[0];
      newLink = "https://ptpimg.me/"+r.code+'.'+r.ext;
    }
  }
  catch(err)
  {
    span.innerHTML = err.message;
    return;
  }
  span.innerHTML = 'Rehosted';
  imageInput.value = newLink;
}

function toggleAutoRehost(a, input, span)
{
  if(a.innerHTML.indexOf('Off') != -1)
  {
    input.setAttribute('autorehost', 'true');
    a.innerHTML = 'Auto-rehost: On';
    window.localStorage.autoUpload = 'true';
    rehost(input, span);
  }
  else
  {
    input.setAttribute('autorehost', 'false');
    a.innerHTML = 'Auto-rehost: Off';
    window.localStorage.autoUpload = 'false';
  }
}

function xhr_func(messageDiv, xhr, func, repeatFunc)
{
  if(xhr.readyState == 4)
  {
    if(xhr.status == 200)
      func(xhr.responseText);
    else
    {
      messageDiv.innerHTML = 'Error: '+xhr.status+'<br />retrying in 1 second';
      window.setTimeout(repeatFunc, 1000);
    }
  }
}