1 | (function() {
|
2 | var compress, exports, querystring, request;
|
3 | var __indexOf = Array.prototype.indexOf || function(item) {
|
4 | for (var i = 0, l = this.length; i < l; i++) {
|
5 | if (this[i] === item) return i;
|
6 | }
|
7 | return -1;
|
8 | }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
9 | querystring = require('querystring');
|
10 | request = require('request');
|
11 | compress = require('compress');
|
12 | exports = module.exports = function(format) {
|
13 | var discogsRequest, getUrl, gunzip, responseHandler;
|
14 | gunzip = new compress.Gunzip();
|
15 | gunzip.init();
|
16 | getUrl = function(url) {
|
17 | var sep;
|
18 | sep = __indexOf.call(url, "?") >= 0 ? "&" : "?";
|
19 | if (url.substr(0, 7) !== 'http://') {
|
20 | url = "http://api.discogs.com/" + url;
|
21 | }
|
22 | if (format) {
|
23 | url += "" + sep + "f=" + format;
|
24 | }
|
25 | return url;
|
26 | };
|
27 | discogsRequest = function(url, next) {
|
28 | return request({
|
29 | uri: getUrl(url),
|
30 | headers: {
|
31 | 'accept-encoding': 'gzip'
|
32 | },
|
33 | encoding: 'binary'
|
34 | }, __bind(function(error, res, body) {
|
35 | var _ref;
|
36 | if (!error && (200 <= (_ref = res.statusCode) && _ref < 400)) {
|
37 | if (body) {
|
38 | if (__indexOf.call(res.headers['content-type'], 'gzip') >= 0) {
|
39 | body = gunzip.inflate(body);
|
40 | }
|
41 | if (__indexOf.call(res.headers['content-type'], 'json') >= 0 || !format) {
|
42 | body = JSON.parse(body);
|
43 | }
|
44 | }
|
45 | return next(null, body);
|
46 | } else {
|
47 | return next(error);
|
48 | }
|
49 | }, this));
|
50 | };
|
51 | responseHandler = function(type, next) {
|
52 | return function(err, res) {
|
53 | if (err || !(res instanceof Object) || !(type in (res != null ? res.resp : void 0))) {
|
54 | return next(err, res);
|
55 | }
|
56 | return next(null, res.resp[type]);
|
57 | };
|
58 | };
|
59 | return {
|
60 | get: function(url, next) {
|
61 | return discogsRequest(url, next);
|
62 | },
|
63 | master: function(id, next) {
|
64 | return discogsRequest('master/' + id, responseHandler('master', next));
|
65 | },
|
66 | release: function(id, next) {
|
67 | return discogsRequest('release/' + id, responseHandler('release', next));
|
68 | },
|
69 | artist: function(name, next) {
|
70 | return discogsRequest('artist/' + name, responseHandler('artist', next));
|
71 | },
|
72 | label: function(name, next) {
|
73 | return discogsRequest('label/' + name, responseHandler('label', next));
|
74 | },
|
75 | search: function(query, type, next) {
|
76 | if (type instanceof Function) {
|
77 | next = type;
|
78 | type = 'all';
|
79 | }
|
80 | return discogsRequest('search?' + querystring.stringify({
|
81 | type: type,
|
82 | q: query
|
83 | }), responseHandler('search', next));
|
84 | },
|
85 | lookup: function(query, next) {
|
86 | return this.search(query, "releases", __bind(function(err, res) {
|
87 | var id, masters, matches, release, result, results, _ref;
|
88 | if (err) {
|
89 | return next(err);
|
90 | }
|
91 | results = res != null ? (_ref = res.searchresults) != null ? _ref.results : void 0 : void 0;
|
92 | if (!results) {
|
93 | return next(new Error("No hits"));
|
94 | }
|
95 | masters = (function() {
|
96 | var _i, _len, _results;
|
97 | _results = [];
|
98 | for (_i = 0, _len = results.length; _i < _len; _i++) {
|
99 | result = results[_i];
|
100 | if (result.type === "master") {
|
101 | _results.push(result);
|
102 | }
|
103 | }
|
104 | return _results;
|
105 | })();
|
106 | if (masters.length) {
|
107 | results = masters;
|
108 | }
|
109 | matches = (function() {
|
110 | var _i, _len, _results;
|
111 | _results = [];
|
112 | for (_i = 0, _len = results.length; _i < _len; _i++) {
|
113 | result = results[_i];
|
114 | if (result.title === query) {
|
115 | _results.push(result);
|
116 | }
|
117 | }
|
118 | return _results;
|
119 | })();
|
120 | if (matches.length) {
|
121 | results = matches;
|
122 | }
|
123 | release = results[0];
|
124 | id = release.uri.split("/").pop();
|
125 | return this[release.type](id, __bind(function(err, res) {
|
126 | if ("master_id" in res) {
|
127 | return this.master(res.master_id, next);
|
128 | } else if ("main_release" in res) {
|
129 | return this.release(res.main_release, next);
|
130 | } else {
|
131 | return next(null, res);
|
132 | }
|
133 | }, this));
|
134 | }, this));
|
135 | }
|
136 | };
|
137 | };
|
138 | }).call(this);
|