Greasy Fork

Greasy Fork is available in English.

GMTI:Gazelle框架音乐PT上传自动填充助手

通过分析上传的torrent文件来自动填充歌手和专辑,歌曲列表等信息.

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Gazelle Music Tracker Autofill from torrent
// @name:zh      GMTI:Gazelle框架音乐PT上传自动填充助手
// @name:zh-CN   GMTI:Gazelle框架音乐PT上传自动填充助手
// @name:zh-TW   GMTI:Gazelle框架音樂PT上傳自動填充助手
// @version      1.7
// @description  Attempt to read the .torrent file and fill in the artist and album
// @description:zh      通过分析上传的torrent文件来自动填充歌手和专辑,歌曲列表等信息.
// @description:zh-CN   通过分析上传的torrent文件来自动填充歌手和专辑,歌曲列表等信息.
// @description:zh-TW   通過分析上傳的torrent文件來自動填充歌手和專輯,歌曲列表等信息.
// @author       Chameleon
// @include      http*://redacted.ch/upload.php*
// @include      http*://orpheus.network/upload.php*
// @include      http*://dicmusic.club/upload.php*
// @include      http*://konor.net/upload.php*
// @grant        none
// @run-at       document-idle
// @namespace http://greasyfork.icu/users/87476
// ==/UserScript==

(function() {
  'use strict';

  var a=document.createElement('a');
  a.innerHTML = 'Auto-fill from torrent: On';
  if(window.location.href.indexOf('groupid=') != -1)
    a.innerHTML = 'Auto-fill from torrent: Off';
  a.href='javascript:void(0);';
  a.addEventListener('click', toggle.bind(undefined, a), false);
  a.setAttribute('style', 'display: block; text-align: center;');
  var before=document.getElementById('upload_table');
  before.parentNode.insertBefore(a, before);

  var format=document.getElementById('format');
  var bitrate=document.getElementById('bitrate');

  document.getElementById('file').addEventListener('change', fileAdded.bind(undefined, a, format, bitrate, true), false);

  addToExisting(a);

  // select the target node
  var target = document.getElementById('upload_table');

  // create an observer instance
  var observer = new MutationObserver(addedToTable.bind(undefined, a));

  // configuration of the observer:
  var config = { childList: true, subtree: true };

  // pass in the target node, as well as the observer options
  observer.observe(target, config);

})();

function addToExisting(a)
{
  var tr=document.getElementById('extra_format_row_1');
  var index=1;
  while(tr)
  {
    var input=tr.getElementsByTagName('input')[0];
    var format=tr.getElementsByTagName('select');
    var bitrate=format[1];
    format=format[0];

    input.addEventListener('change', fileAdded.bind(undefined, a, format, bitrate, false), false);

    index++;
    tr=document.getElementById('extra_format_row_'+index);
  }
}

function addedToTable(a, mutations)
{
  for(var i=0; i<mutations.length; i++)
  {
    var m=mutations[i];
    if(m.addedNodes.length == 1)
    {
      var id=m.addedNodes[0].getAttribute('id');
      if(id && id.indexOf('extra_format_row') != -1)
      {
        var tr=m.addedNodes[0];
        var input=tr.getElementsByTagName('input')[0];
        var format=tr.getElementsByTagName('select');
        var bitrate=format[1];
        format=format[0];

        input.addEventListener('change', fileAdded.bind(undefined, a, format, bitrate, false), false);
      }
    }
  }
}

function toggle(a)
{
  if(a.innerHTML.indexOf('On') != -1)
  {
    a.innerHTML=a.innerHTML.replace('On', 'Off');
  }
  else
  {
    a.innerHTML=a.innerHTML.replace('Off', 'On');
  }
}

function fileAdded(a, format, bitrate, full, event)
{
  if(a.innerHTML.indexOf('Off') != -1)
    return;
  var file=event.target.files[0];
  if(!file)
    return;

  var type=document.getElementById('categories').selectedOptions[0].textContent;
  if(type==="E-Books" || type==="Audiobooks")
  {
    document.getElementById('title').value=file.name.replace(/.torrent$/, '');
    return;
  }

  if(full)
  {
    var spl=file.name.replace(/ - [0-9][0-9][0-9][0-9]/, '').split(' - ');
    if(spl.length == 1)
    {
      var fn=file.name;
      var length=4;
      var search=fn.search(/[0-9][0-9][0-9][0-9]/);
      if(search != -1)
      {
        if(fn[search-1] == '(')
        {
          search--;
          length=6;
        }
        spl=[];
        spl.push(fn.substring(0, search).trim());
        spl.push(fn.substring(search+length).trim());
      }
    }
    var artist=spl[0].split('] ');
    if(artist.length > 1)
      artist=artist[1];
    else
      artist=artist[0];
    document.getElementById('artist').value=artist;
    var album=spl[1].split(' (')[0].split(' [')[0].split(' {')[0].replace(/.torrent$/, '');
    document.getElementById('title').value=album;

    var yadg=document.getElementById('yadg_input');
    if(yadg)
    {
      yadg.value=artist+' '+album;
      document.getElementById('yadg_submit').click();
    }
  }

  var f=file.name.toLowerCase();

  var formatTemp=-1;
  var bitrateTemp=-1;
  var mediaTemp=-1;

  if(f.indexOf('mp3') != -1)
  {
    formatTemp=1;
  }
  else if(f.indexOf('flac') != -1)
  {
    formatTemp=2;
    bitrateTemp=9;
  }
  else if(f.indexOf('aac') != -1)
  {
    formatTemp=3;
  }
  else if(f.indexOf('ac3') != -1)
  {
    formatTemp=4;
  }
  else if(f.indexOf('dts') != -1)
  {
    formatTemp=5;
  }

  if(f.indexOf('v0') != -1)
  {
    bitrateTemp=7;
    formatTemp=1;
  }
  else if(f.indexOf('v1') != -1)
  {
    bitrateTemp=4;
    formatTemp=1;
  }
  else if(f.indexOf('v2') != -1)
  {
    bitrateTemp=3;
    formatTemp=1;
  }
  else if(f.indexOf('192') != -1)
  {
    bitrateTemp=1;
    formatTemp=1;
  }
  else if(f.indexOf('256') != -1)
  {
    bitrateTemp=5;
    formatTemp=1;
  }
  else if(f.indexOf('320') != -1)
  {
    bitrateTemp=8;
    formatTemp=1;
  }

  var media=document.getElementById('media');
  if(f.indexOf('dvd') != -1)
  {
    mediaTemp=2;
  }
  else if(f.indexOf('vinyl') != -1)
  {
    mediaTemp=3;
  }
  else if(f.indexOf('soundboard') != -1)
  {
    mediaTemp=4;
  }
  else if(f.indexOf('sacd') != -1)
  {
    mediaTemp=5;
  }
  else if(f.indexOf('dat') != -1)
  {
    mediaTemp=6;
  }
  else if(f.indexOf('cassette') != -1)
  {
    mediaTemp=7;
  }
  else if(f.indexOf('web') != -1)
  {
    mediaTemp=8;
  }
  else if(f.indexOf('blu-ray') != -1 || f.indexOf('bluray') != -1)
  {
    mediaTemp=9;
  }
  else
    mediaTemp=1;

  if(formatTemp != -1)
  {
    format.selectedIndex=formatTemp;
    triggerChange(format);
  }
  if(bitrateTemp != -1)
  {
    bitrate.selectedIndex=bitrateTemp;
    triggerChange(bitrate);
  }
  if(mediaTemp != -1)
  {
    media.selectedIndex=mediaTemp;
    triggerChange(media);
  }

  var r=new FileReader();
  r.onload=readFile;
  r.readAsText(file);
}

function readFile(event)
{
  var contents=event.target.result;
  //console.log(contents);
  var paths=contents.split('piece length')[0].split('filesld')[1].split(':path');
  var desc=document.getElementById('album_desc');
  if(desc.value !== '')
    return;
  var extensions=[];
  var tracks=[];
  for(var i=1; i<paths.length-1; i++)
  {
    var p=paths[i];
    p=p.substring(p.indexOf(':')+1).split('eed6:length')[0];
    var extension=p.substring(p.lastIndexOf('.'));
    var hasE=false;
    for(var j=0; j<extensions.length; j++)
    {
      if(extension == extensions[j].extension)
      {
        hasE=true;
        extensions[j].count++;
      }
    }
    if(!hasE)
    {
      extensions.push({extension:extension, count:1});
    }
    tracks.push({track:p, extension:extension});
    //p=p.substring(0, p.lastIndexOf('.'));
    //console.log(p);
    //desc.value+='\r'+p;
  }
  var highCount=0;
  var index=-1;
  for(var i=0; i<extensions.length; i++)
  {
    if(extensions[i].count > highCount)
    {
      highCount=extensions[i].count;
      index=i;
    }
  }
  var finalTracks=[];
  for(var i=0; i<tracks.length; i++)
  {
    var t=tracks[i];
    if(t.extension != extensions[index].extension)
      continue;
    finalTracks.push(t.track);
  }
  finalTracks.sort();

  desc.value='Track list:';
  for(var i=0; i<finalTracks.length; i++)
  {
    var f=finalTracks[i];
    f=f.replace(/^[0-9][0-9]?[0-9]?\.?[\s-_]?[\s-_]?[\s-_]/, '');
    f=f.substring(0, f.lastIndexOf('.'));
    desc.value+='\r[#]'+f;
  }
}

function triggerChange(input)
{
  var evt = document.createEvent("HTMLEvents");
  evt.initEvent("change", false, true);
  input.dispatchEvent(evt);
}