1 /* vi: set et sw=4 ts=4 si: */
3 var musicbrainz = function() {
5 _baseUrl: 'http://musicbrainz.org/ws/2/',
12 /* Internal methods to perform XHR requests. */
14 _get: function(request) {
15 if (request.url in _priv._url_cache) {
16 request.deferred.resolve(_priv._url_cache[request.url]);
18 $.getJSON(request.url)
19 .done(function(data, statusText, xhr) {
20 _priv._url_cache[request.url] = data;
21 request.deferred.resolve(data);
23 .error(function(xhr) {
24 if (xhr.status === 503) {
25 _priv._enqueue(request); // put it back in the queue
30 return request.deferred.promise();
34 /* Internal methods for the handling of the request queue */
36 _startQueue: function() {
37 if (_priv._interval === undefined) {
38 _priv._interval = setInterval(function() {
44 _stopQueue: function() {
45 clearInterval(_priv._interval);
46 _priv._interval = undefined;
49 _enqueue: function(request) {
50 if ($.inArray(request.url, _priv._queue) < 0) {
51 _priv._queue.push(request);
55 _dequeue: function() {
56 var request = _priv._queue.shift();
57 if (request !== undefined) {
66 name: function() { return "MusicBrainz"; },
68 getArtist: function(q) {
69 var lookup_url = _priv._baseUrl + 'artist/?query="' + q +
71 lookup_deferred = new $.Deferred(),
72 returned_deferred = new $.Deferred();
74 if (q !== undefined) {
75 if (_priv._interval === undefined) {
79 _priv._enqueue({url: lookup_url, deferred: lookup_deferred});
80 lookup_deferred.done(function(data) {
82 var artist_url = _priv._baseUrl + 'artist/' +
83 data.artist[0].id + '?' + _priv._fmtArg,
84 artist_deferred = new $.Deferred();
86 _priv._get({url: artist_url, deferred: artist_deferred});
87 artist_deferred.done(function(data) {
88 returned_deferred.resolve(data);
91 returned_deferred.reject();
95 returned_deferred.reject();
98 return returned_deferred.promise();
103 win.MusicBrainz = new musicbrainz();