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(config) {
|
13 | var discogsRequest, getUrl, gunzip, params, responseHandler, _config;
|
14 | _config = {};
|
15 | _config.api_key = config.api_key;
|
16 | _config.f = config.f || 'json';
|
17 | params = querystring.stringify(_config);
|
18 | gunzip = new compress.Gunzip();
|
19 | gunzip.init();
|
20 | getUrl = function(url) {
|
21 | var sep;
|
22 | if (url.substr(0, 7) !== 'http://') {
|
23 | url = "http://www.discogs.com/" + (encodeURIComponent(url));
|
24 | }
|
25 | sep = __indexOf.call(url, "?") >= 0 ? "&" : "?";
|
26 | return "" + url + sep + params;
|
27 | };
|
28 | discogsRequest = function(url, next) {
|
29 | return request({
|
30 | uri: getUrl(url),
|
31 | headers: {
|
32 | 'accept-encoding': 'gzip'
|
33 | },
|
34 | encoding: 'binary'
|
35 | }, __bind(function(error, res, body) {
|
36 | var _ref;
|
37 | if (!error && (200 <= (_ref = res.statusCode) && _ref < 400)) {
|
38 | if (body) {
|
39 | if (__indexOf.call(res.headers['content-type'], 'gzip') >= 0) {
|
40 | body = gunzip.inflate(body);
|
41 | }
|
42 | if (__indexOf.call(res.headers['content-type'], 'json') >= 0 || _config.f === 'json') {
|
43 | body = JSON.parse(body);
|
44 | }
|
45 | }
|
46 | return next(null, body);
|
47 | } else {
|
48 | return next(error);
|
49 | }
|
50 | }, this));
|
51 | };
|
52 | responseHandler = function(type, next) {
|
53 | return function(err, res) {
|
54 | if (err || !(res instanceof Object) || !(type in (res != null ? res.resp : void 0))) {
|
55 | return next(err, res);
|
56 | }
|
57 | return next(null, res.resp[type]);
|
58 | };
|
59 | };
|
60 | return {
|
61 | get: function(url, next) {
|
62 | return discogsRequest(url, next);
|
63 | },
|
64 | release: function(id, next) {
|
65 | return discogsRequest('release/' + id, responseHandler('release', next));
|
66 | },
|
67 | artist: function(name, next) {
|
68 | return discogsRequest('artist/' + name, responseHandler('artist', next));
|
69 | },
|
70 | label: function(name, next) {
|
71 | return discogsRequest('label/' + name, responseHandler('label', next));
|
72 | },
|
73 | search: function(query, type, next) {
|
74 | if (type instanceof Function) {
|
75 | next = type;
|
76 | type = 'all';
|
77 | }
|
78 | return discogsRequest('search?' + querystring.stringify({
|
79 | type: type,
|
80 | q: query
|
81 | }), responseHandler('search', next));
|
82 | }
|
83 | };
|
84 | };
|
85 | }).call(this);
|