UNPKG

discogs

Version:

Simple client for Discogs API

139 lines (138 loc) 4.58 kB
(function() { var compress, exports, querystring, request; var __indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (this[i] === item) return i; } return -1; }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; querystring = require('querystring'); request = require('request'); compress = require('compress'); exports = module.exports = function(format) { var discogsRequest, getUrl, gunzip, responseHandler; gunzip = new compress.Gunzip(); gunzip.init(); getUrl = function(url) { var sep; sep = __indexOf.call(url, "?") >= 0 ? "&" : "?"; if (url.substr(0, 7) !== 'http://') { url = "http://api.discogs.com/" + url; } if (format) { url += "" + sep + "f=" + format; } return url; }; discogsRequest = function(url, next) { return request({ uri: getUrl(url), headers: { 'accept-encoding': 'gzip' }, encoding: 'binary' }, __bind(function(error, res, body) { var _ref; if (!error && (200 <= (_ref = res.statusCode) && _ref < 400)) { if (body) { if (__indexOf.call(res.headers['content-type'], 'gzip') >= 0) { body = gunzip.inflate(body); } if (__indexOf.call(res.headers['content-type'], 'json') >= 0 || !format) { body = JSON.parse(body); } } return next(null, body); } else { return next(error); } }, this)); }; responseHandler = function(type, next) { return function(err, res) { if (err || !(res instanceof Object) || !(type in (res != null ? res.resp : void 0))) { return next(err, res); } return next(null, res.resp[type]); }; }; return { get: function(url, next) { return discogsRequest(url, next); }, master: function(id, next) { return discogsRequest('master/' + id, responseHandler('master', next)); }, release: function(id, next) { return discogsRequest('release/' + id, responseHandler('release', next)); }, artist: function(name, next) { return discogsRequest('artist/' + name, responseHandler('artist', next)); }, label: function(name, next) { return discogsRequest('label/' + name, responseHandler('label', next)); }, search: function(query, type, next) { if (type instanceof Function) { next = type; type = 'all'; } return discogsRequest('search?' + querystring.stringify({ type: type, q: query }), responseHandler('search', next)); }, lookup: function(query, next) { return this.search(query, "releases", __bind(function(err, res) { var id, masters, matches, release, result, results, _ref; if (err) { return next(err); } results = res != null ? (_ref = res.searchresults) != null ? _ref.results : void 0 : void 0; if (!results) { return next(); } masters = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = results.length; _i < _len; _i++) { result = results[_i]; if (result.type === "master") { _results.push(result); } } return _results; })(); if (masters.length) { results = masters; } matches = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = results.length; _i < _len; _i++) { result = results[_i]; if (result.title === query) { _results.push(result); } } return _results; })(); if (matches.length) { results = matches; } release = results[0]; id = release.uri.split("/").pop(); return this[release.type](id, __bind(function(err, res) { if ("master_id" in res) { return this.master(res.master_id, next); } else if ("main_release" in res) { return this.release(res.main_release, next); } else { return next(null, res); } }, this)); }, this)); } }; }; }).call(this);