astrXbian/www/jukebox/browser/helpers/discogs.js

158 lines
4.5 KiB
JavaScript

var discogs = function() {
var baseURL = 'https://api.discogs.com/';
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("DISCOGS","New request",data.url,"throttle is",throttle,"length is",queue.length);
if (throttle == null && queue.length == 1) {
discogs.getrequest();
}
},
getrequest: function() {
var req = queue[0];
clearTimeout(throttle);
if (req !== undefined) {
if (req.flag) {
debug.error("DISCOGS","Request just pulled from queue is already being handled",req.data.url);
return;
}
queue[0].flag = true;
debug.debug("DISCOGS","Taking next request from queue",req.data);
var getit = $.ajax({
method: 'POST',
url: "browser/backends/getdidata.php",
data: req.data,
dataType: "json"
})
.done(function(data) {
var c = getit.getResponseHeader('Pragma');
debug.debug("DISCOGS", "Request Success",c,data);
if (c == "From Cache") {
throttle = setTimeout(discogs.getrequest, 100);
} else {
throttle = setTimeout(discogs.getrequest, 1500);
}
req = queue.shift();
if (data === null) {
data = {error: language.gettext("discogs_error")}
} else if (!data.error) {
// info_discogs.js was written to accept jsonp data passed back from $.jsonp
// However as Discogs now seem to be refusing to respond to those requests
// we're using a php script to get it instead. So here we bodge the response
// into the form that info_discogs.js is expecting.
data = {data: data};
}
if (req.reqid != '') {
data.id = req.reqid;
}
if (data.error) {
req.fail(data);
} else {
req.success(data);
}
})
.fail(function(xhr,status,err) {
throttle = setTimeout(discogs.getrequest, 1500);
req = queue.shift();
debug.warn("DISCOGS","Request failed",req,xhr);
data = {error: language.gettext("discogs_error") + ' ('+xhr.status+' '+err+')'};
if (req.reqid != '') {
data.id = req.reqid;
}
req.fail(data);
});
} else {
throttle = null;
}
},
artist: {
search: function(name, success, fail) {
var data = {
url: baseURL+'database/search',
type: 'artist',
q: name
}
discogs.request('', data, success, fail);
},
getInfo: function(reqid, id, success, fail) {
var data = {url: baseURL+'artists/'+id};
discogs.request(reqid, data, success, fail);
},
getReleases: function(name, page, reqid, success, fail) {
debug.log("DISCOGS","Get Artist Releases",name,page);
var data = {
url: baseURL+'artists/'+name+'/releases',
per_page: 25,
page: page
};
discogs.request(reqid, data, success, fail);
}
},
album: {
getInfo: function(reqid, id, success, fail) {
// NOTE id must be either releases/id or masters/id
var data = {url: baseURL+id};
discogs.request(reqid, data, success, fail);
},
search: function(artist, album, success, fail) {
var data = {
url: baseURL+'database/search',
type: 'release',
artist: artist,
release_title: album
};
discogs.request('', data, success, fail);
}
},
track: {
getInfo: function(reqid, id, success, fail) {
// NOTE id must be either releases/id or masters/id
var data = {url: baseURL+id};
discogs.request(reqid, data, success, fail);
},
search: function(artist, track, success, fail) {
var data = {
url: baseURL+'database/search',
type: 'release',
artist: artist,
track: track
};
discogs.request('', data, success, fail);
}
},
label: {
getInfo: function(reqid, id, success, fail) {
// NOTE id must be either releases/id or masters/id
var data = {url: baseURL+'labels/'+id};
discogs.request(reqid, data, success, fail);
}
}
}
}();