rendered paste body// ==UserScript==
// @name WhatWaffleBrainz
// @author Wizzcat, what support added by trsk
// @namespace http://waffles.fm/
// @description Creates waffles.fm and what.cd album descriptions out of thin air, *poof*!
// @include http://*waffles.fm/upload.php*
// @include http://*what.cd/upload.php*
// @include http://*christiantorrents.com/upload.php*// @include http://*waffles.fm/edit.php?*
// @version 0.1
// @date 2007-11-18
// ==/UserScript==
var waffleMonkey = function()
{
var self = this;
var artists = {};
var currentArtist;
var textfield = document.getElementsByName('descr')[0];
var artistfield;
var albumfield;
var datefield;
var button = document.createElement('button');
button.innerHTML = 'Fetch';
button.type = 'Button';
button.addEventListener('click', buttonClicked, false);
var tbody = textfield.parentNode.parentNode.parentNode;
var trtag = textfield.parentNode.parentNode;
var newtr = document.createElement('tr');
var newtd1 = document.createElement('td');
newtd1.className = "heading";
newtd1.align = "right";
newtd1.innerHTML = 'Fetch Info';
var newtd2 = document.createElement('td');
newtd2.align = "left";
var select = document.createElement('select');
select.style.display = 'none';
select.addEventListener('change', function(e){
showAlbum(e.target.value);
}, false);
newtd2.appendChild(button);
newtd2.appendChild(select);
newtr.appendChild(newtd1);
newtr.appendChild(newtd2);
tbody.insertBefore(newtr, trtag);
function buttonClicked()
{
disabled(false);
artistfield = document.getElementsByName('artist')[0];
if(document.URL.indexOf('what.cd') > 0){
albumfield = document.getElementsByName('name')[0];
}
if(document.URL.indexOf('waffles.fm') > 0){
albumfield = document.getElementsByName('album')[0];
}
datefield = document.getElementsByName('year')[0];
currentArtist = artistfield.value.toLowerCase();
if(!artists[currentArtist])
{
fetchArtist();
return;
}
var albumname = albumfield.value;
// Is the album in the list?
for(var i=0, album; album = artists[currentArtist].albums[i]; i++)
{
if(album.title.toLowerCase() == albumname.toLowerCase())
{
if(!album.tracklist)
{
return fetchAlbum(i);
}
return showAlbum(i);
}
}
// We didn't find the album we were looking for, so show dropdown
showDropdown();
}
function fetchAlbum(number)
{
xhr('http://musicbrainz.org/ws/1/release/' + artists[currentArtist].albums[number].id + '?type=xml&inc=tracks+release-events+label-rels', function(data) { processAlbum(data, number)});
}
function fetchAlbumList(d)
{
xhr('http://musicbrainz.org/ws/1/artist/' + artists[currentArtist].id + '?type=xml&inc=sa-Official', function(data) {
processAlbumlist(data);
buttonClicked();
});
}
function fetchArtist()
{
if(currentArtist == '') return;
xhr('http://musicbrainz.org/ws/1/artist/?type=xml&name=' + escape(currentArtist), function(data) {
processArtist(data);
fetchAlbumList();
});
}
function xhr(url, callback)
{
GM_xmlhttpRequest({
method: 'GET',
url: url,
onload: function(result){
// Check if we found anything
if(result.status != 200)
{
throwError();
}
else
{
callback(result.responseText);
}
},
onerror: throwError
});
}
function processArtist(data)
{
var name = data.match(/\<name\>(.*?)\<\/name\>/)[1];
var id = data.match(/id="(.*?)"/)[1];
artistfield.value = name;
artists[name.toLowerCase()] = {name: name, id: id};
currentArtist = name.toLowerCase();
}
function processAlbumlist(data)
{
var albums = new Array();
var types = new Object();
var expression = /\<release(.*?)\<\/release\>/g;
var release;
while(release = expression.exec(data))
{
var type = release[1].match(/type="(.*?) /)[1];
var title = release[1].match(/\<title\>(.*?)\<\/title\>/)[1];
var id = release[1].match(/id="(.*?)"/)[1];
albums.push({title: title, id: id, type: type});
if(!types[type]) types[type] = new Array();
types[type].push(albums.length - 1);
}
artists[currentArtist].albums = albums;
artists[currentArtist].types = types;
}
function processAlbum(data, number)
{
var album = artists[currentArtist].albums[number];
album.asin = data.match(/\<asin\>(.*?)\<\/asin\>/);
album.asin = album.asin ? album.asin[1] : null;
album.date = data.match(/event date="(.*?)"/);
album.date = album.date ? album.date[1] : null;
album.country = data.match(/country="(.*?)"/);
album.country = album.country ? album.country[1] : null;
album.tracks = new Array();
album.length = 0;
var trackExpression = /\<track.*?\<\/track\>/g;
var track;
while(track = trackExpression.exec(data))
{
var object = {title: track[0].match(/\<title\>(.*?)\<\/title\>/)[1]};
var duration = track[0].match(/\<duration\>(.*?)\<\/duration\>/);
if(duration)
{
object.dur = Math.round(parseInt(duration[1])/1000);
album.length += object.dur;
}
var artist = track[0].match(/\<name\>(.*?)\<\/name\>/);
if(artist)
{
object.artist = artist[1];
}
album.tracks.push(object);
}
showAlbum(number);
}
function showDropdown()
{
var artist = artists[currentArtist];
var string = new Array();
for(i in artist.types)
{
var type = artist.types[i];
string.push('<optgroup label="' + i + '">');
for(var p=0; p < type.length; p++)
{
string.push('<option value="' + type[p] + '">' + artist.albums[type[p]].title + '</option>');
}
string.push('</optgroup>');
}
select.innerHTML = string.join('');
select.style.display = 'inline';
disabled(false);
}
function showAlbum(number)
{
disabled(true);
var album = artists[currentArtist].albums[number];
if(!album.tracks)
{
return fetchAlbum(number);
}
albumfield.value = album.title;
var result = new Array();
if(album.asin)
{
result.push('[img]http://ec1.images-amazon.com/images/P/' + album.asin + '.jpg[/img]\n\n');
}
result.push('[b][size=4]' + artists[currentArtist].name + ' - ' + album.title + '[/size][/b]');
if(album.date)
{
datefield.value = album.date.match(/[0-9]{4}/);
result.push('\n[b]Release:[/b]\t' + album.date);
}
if(album.country)
{
result.push('\n[b]Country:[/b]\t' + album.country);
}
result.push('\n[b]Type:[/b]\t' + album.type);
if(album.length)
{
var min = (album.length % 60 < 10) ? '0' + (album.length % 60) : album.length % 60;
result.push('\n[b]Length:[/b]\t' + Math.floor(album.length / 60) + ':' + min);
}
result.push('\n\n[b][size=3]Tracklist:[/size][/b]\n');
for(var i=0, track; track = album.tracks[i]; i++)
{
var dur = '';
if(track.dur)
{
var min = Math.floor(track.dur / 60);
var sec = track.dur % 60;
if(sec < 10)
{
sec = '0' + sec;
}
dur = ' (' + min + ':' + sec + ')';
}
var artist = track.artist ? '[u]' + track.artist + '[/u] - ' : '';
result.push('[b]' + (i+1) + '.[/b]\t' + artist + track.title + dur + '\n');
}
textfield.value = result.join('');
disabled(false);
}
function disabled(bool)
{
var status = bool ? 'disabled' : false;
button.disabled = status;
select.disabled = status;
}
function throwError()
{
alert('Something went wrong!');
disabled(false);
}
return this;
}();