var musicbrainz = function() { var baseURL = 'http://musicbrainz.org/ws/2/'; var coverURL = 'http://coverartarchive.org/release/'; var queue = new Array(); var throttle = null; return { request: function(reqid, data, success, fail) { queue.push( {flag: false, reqid: reqid, data: data, success: success, fail: fail } ); debug.debug("MUSICBRAINZ","New request",data.url); if (throttle == null && queue.length == 1) { musicbrainz.getrequest(); } }, getrequest: function() { var req = queue[0]; clearTimeout(throttle); if (req) { if (req.flag) { debug.error("MUSICBRAINZ","Request just pulled from queue is already being handled"); return; } queue[0].flag = true; debug.debug("MUSICBRAINZ","Taking next request from queue",req.data); var getit = $.ajax({ method: 'POST', url: "browser/backends/getmbdata.php", data: req.data, dataType: "json", }) .done(function(data) { var c = getit.getResponseHeader('Pragma'); debug.debug("MUSICBRAINZ","Request success",c,data); if (c == "From Cache") { throttle = setTimeout(musicbrainz.getrequest, 100); } else { throttle = setTimeout(musicbrainz.getrequest, 1500); } req = queue.shift(); if (data === null) { data = {error: language.gettext("musicbrainz_error")}; } if (req.reqid != '') { data.id = req.reqid; } if (data.error) { req.fail(data); } else { req.success(data); } }) .fail(function(xhr,status,err) { throttle = setTimeout(musicbrainz.getrequest, 1500); req = queue.shift(); debug.warn("MUSICBRAINZ","Request failed",req,xhr); data = {error: language.gettext("musicbrainz_noinfo") + ' ('+xhr.status+' '+err+')'}; if (req.reqid != '') { data.id = req.reqid; } req.fail(data); }); } else { throttle = null; } }, artist: { getInfo: function(mbid, success, fail) { var data = { url: baseURL+'artist/'+mbid, inc: 'aliases+tags+ratings+release-groups+artist-rels+label-rels+url-rels+release-group-rels+annotation', fmt: 'json' }; musicbrainz.request('', data, success, fail); }, getReleases: function(mbid, reqid, success, fail) { var result = { id: reqid }; result['release-groups'] = new Array(); (function getAllReleaseGroups() { var data = { url: baseURL+'release-group', artist: mbid, limit: 100, fmt: 'json', inc: 'artist-credits+tags+ratings+url-rels+annotation', offset: result['release-groups'].length }; musicbrainz.request(reqid, data, function(data) { debug.debug("MUSICBRAINZ","Release group data:",data); if (data.error) { if (result['release-groups'].length > 0) { success(result); } else { fail(data); } } else { for (var i in data['release-groups']) { result['release-groups'].push(data['release-groups'][i]); } if (result['release-groups'].length == data['release-group-count']) { success(result); } else { getAllReleaseGroups(); } } }, fail); })(); } }, album: { getInfo: function(mbid, success, fail) { var data = { url: baseURL+'release/'+mbid, inc: 'annotation+tags+ratings+artists+labels+recordings+release-groups+artist-credits+url-rels+release-group-rels+recording-rels+artist-rels', fmt: 'json' }; musicbrainz.request('', data, success, fail); }, getCoverArt: function(id, success, fail) { var data = {url: coverURL + id + "/" }; musicbrainz.request('', data, success, fail); }, }, releasegroup: { getInfo: function(mbid, reqid, success, fail) { var data = { url: baseURL+'release-group/'+mbid, inc: 'artists+releases+artist-rels+label-rels+url-rels', fmt: 'json' }; musicbrainz.request(reqid, data, success, fail); } }, track: { getInfo: function(mbid, success, fail) { var data = { url: baseURL+'recording/'+mbid, inc: 'annotation+tags+ratings+releases+url-rels+work-rels+release-rels+release-group-rels+artist-rels+label-rels+recording-rels', fmt: 'json' }; var result = {}; // For a track, although there might be some good stuff in the recording data, what we really want // is the associated work, if there is one, because that's where the wiki and discogs links will probably be. musicbrainz.request('', data, function(data) { result.recording = data; debug.debug("MUSICBRAINZ","Scanning recording for work data"); for (var i in data.relations) { if (data.relations[i].work) { debug.debug("MUSICBRAINZ","Found work data",data.relations[i].work.id); var newdata = { url: baseURL+'work/'+data.relations[i].work.id, inc: 'annotation+tags+ratings+url-rels+artist-rels', fmt: 'json' }; musicbrainz.request('', newdata, function(workdata) { debug.debug("MUSICBRAINZ","Got work data",workdata); result.work = workdata; success(result); }, function(workdata) { debug.debug("MUSICBRAINZ","Got NO work data",workdata); success(result); }); return; } } success(result); }, fail); } } } }();