// ==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\>/)[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 = /\/g; var release; while(release = expression.exec(data)) { var type = release[1].match(/type="(.*?) /)[1]; var title = release[1].match(/\(.*?)\<\/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\>/); 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 = /\/g; var track; while(track = trackExpression.exec(data)) { var object = {title: track[0].match(/\(.*?)\<\/title\>/)[1]}; var duration = track[0].match(/\(.*?)\<\/duration\>/); if(duration) { object.dur = Math.round(parseInt(duration[1])/1000); album.length += object.dur; } var artist = track[0].match(/\(.*?)\<\/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(''); for(var p=0; p < type.length; p++) { string.push(''); } string.push(''); } 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; }();