UNPKG

discogs

Version:

Simple client for Discogs API

168 lines (161 loc) 5.51 kB
// Generated by CoffeeScript 1.7.1 (function() { var discogs, exports, querystring, request, zlib, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; querystring = require('querystring'); request = require('request'); zlib = require('zlib'); discogs = require('../package.json'); exports = module.exports = function(format) { var discogsRequest, getUrl, responseHandler; if (format === 'json') { format = null; } getUrl = function(url) { var sep; if (url.substr(0, 7) !== 'http://') { url = "http://api.discogs.com/" + url; } sep = __indexOf.call(url, "?") >= 0 ? "&" : "?"; if (format) { url += "" + sep + "f=" + format; } return url; }; discogsRequest = function(url, next) { var parseResponse; parseResponse = function(err, res, body) { var e, _ref; if (err) { return next(err); } else if (~((_ref = res.headers['content-type']) != null ? _ref.indexOf('json') : void 0) || !format) { try { return next(null, JSON.parse(body)); } catch (_error) { e = _error; return next(e); } } else { return next(null, body); } }; return request({ uri: getUrl(url), headers: { 'accept-encoding': 'gzip', 'user-agent': "" + discogs.name + "/" + discogs.version + " +" + discogs.homepage }, encoding: null }, function(error, res, body) { var _ref, _ref1; if (!error && (200 <= (_ref = res.statusCode) && _ref < 400)) { if (~((_ref1 = res.headers['content-encoding']) != null ? _ref1.indexOf('gzip') : void 0)) { return zlib.gunzip(body, function(err, body) { return parseResponse(err, res, body); }); } else { return parseResponse(error, res, body.toString('utf8')); } } else { return next(error); } }); }; responseHandler = function(type, next) { return function(err, res) { var _ref; if (err) { return next(err); } else { return next(null, res != null ? (_ref = res.resp) != null ? _ref[type] : void 0 : void 0); } }; }; 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", (function(_this) { return 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.toLowerCase() === query.toLowerCase()) { _results.push(result); } } return _results; })(); if (matches.length) { results = matches; } release = results[0]; id = release.uri.split("/").pop(); return _this[release.type](id, function(err, res) { if ("master_id" in res) { return _this.master(res.master_id, function(err, master) { if ("main_release" in master) { return _this.release(master.main_release, next); } else { return next(null, master); } }); } else if ("main_release" in res) { return _this.release(res.main_release, next); } else { return next(null, res); } }); }; })(this)); } }; }; }).call(this);