Restricture musicbrainz.js.
[profile/ivi/cowhide.git] / examples / hoofbeats / javascripts / resolvers / musicbrainz.js
1 /* vi: set et sw=4 ts=4 si: */
2 (function(win, $) {
3     var musicbrainz = function() {
4         var _priv = {
5             _baseUrl: 'http://musicbrainz.org/ws/2/',
6             _fmtArg: 'fmt=json',
7             _interval: undefined,
8             _queue: [],
9             _url_cache: {},
10
11
12             /* Internal methods to perform XHR requests. */
13
14             _get: function(request) {
15                 if (request.url in _priv._url_cache) {
16                     request.deferred.resolve(_priv._url_cache[request.url]);
17                 } else {
18                     $.getJSON(request.url)
19                     .done(function(data, statusText, xhr) {
20                         _priv._url_cache[request.url] = data;
21                         request.deferred.resolve(data);
22                     })
23                     .error(function(xhr) {
24                         if (xhr.status === 503) {
25                             _priv._enqueue(request); // put it back in the queue
26                         }
27                     });
28                 }
29
30                 return request.deferred.promise();
31             },
32
33
34             /* Internal methods for the handling of the request queue */
35
36             _startQueue: function() {
37                 if (_priv._interval === undefined) {
38                     _priv._interval = setInterval(function() {
39                         _priv._dequeue();
40                     }, 2000);
41                 }
42             },
43
44             _stopQueue: function() {
45                 clearInterval(_priv._interval);
46                 _priv._interval = undefined;
47             },
48
49             _enqueue: function(request) {
50                 if ($.inArray(request.url, _priv._queue) < 0) {
51                     _priv._queue.push(request);
52                 }
53             },
54
55             _dequeue: function() {
56                 var request = _priv._queue.shift();
57                 if (request !== undefined) {
58                     _priv._get(request);
59                 }
60             }
61         }; // _priv
62
63
64         /* Public methods */
65         return {
66             name: function() { return "MusicBrainz"; },
67
68             getArtist: function(q) {
69                 var lookup_url = _priv._baseUrl + 'artist/?query="' + q +
70                                  '"&' + _priv._fmtArg,
71                     lookup_deferred = new $.Deferred(),
72                     returned_deferred = new $.Deferred();
73
74                 if (q !== undefined) {
75                     if (_priv._interval === undefined) {
76                         _priv._startQueue();
77                     }
78
79                     _priv._enqueue({url: lookup_url, deferred: lookup_deferred});
80                     lookup_deferred.done(function(data) {
81                         if (data.count > 0) {
82                             var artist_url = _priv._baseUrl + 'artist/' +
83                                              data.artist[0].id + '?' + _priv._fmtArg,
84                                 artist_deferred = new $.Deferred();
85
86                             _priv._get({url: artist_url, deferred: artist_deferred});
87                             artist_deferred.done(function(data) {
88                                 returned_deferred.resolve(data);
89                             });
90                         } else {
91                             returned_deferred.reject();
92                         }
93                     });
94                 } else {
95                     returned_deferred.reject();
96                 }
97
98                 return returned_deferred.promise();
99             }
100         };
101     };
102
103     win.MusicBrainz = new musicbrainz();
104 }(window, jQuery));