All pastes #985618 Raw Edit

Anonymous

public text v1 · immutable
·published 2008-04-15 04:49 UTC
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;
}();