UNPKG

4.83 kBJavaScriptView Raw
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();
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, __bind(function(err, master) {
128 if ("main_release" in master) {
129 return this.release(master.main_release, next);
130 } else {
131 return next(null, master);
132 }
133 }, this));
134 } else if ("main_release" in res) {
135 return this.release(res.main_release, next);
136 } else {
137 return next(null, res);
138 }
139 }, this));
140 }, this));
141 }
142 };
143 };
144}).call(this);