200 lines
5.9 KiB
JavaScript
200 lines
5.9 KiB
JavaScript
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);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}();
|