discogs
Version:
Simple client for Discogs API
361 lines (243 loc) • 16.6 kB
HTML
<html>
<head>
<title>discogs.coffee</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul class="sections">
<li id="title">
<div class="annotation">
<h1>discogs.coffee</h1>
</div>
</li>
<li id="section-1">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-1">¶</a>
</div>
</div>
<div class="content"><div class='highlight'><pre>querystring = <span class="hljs-built_in">require</span> <span class="hljs-string">'querystring'</span>
request = <span class="hljs-built_in">require</span> <span class="hljs-string">'request'</span>
zlib = <span class="hljs-built_in">require</span> <span class="hljs-string">'zlib'</span>
discogs = <span class="hljs-built_in">require</span> <span class="hljs-string">'../package.json'</span></pre></div></div>
</li>
<li id="section-2">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-2">¶</a>
</div>
<p>This is the entry point.</p>
<p>Takes an optional format parameter, defaulting to ‘json’. If ‘xml’ consumer is expected to take care of parsing</p>
<pre><code>client = discogs(<span class="hljs-string">"xml"</span>)
</code></pre>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-built_in">exports</span> = <span class="hljs-built_in">module</span>.<span class="hljs-function"><span class="hljs-title">exports</span> = <span class="hljs-params">(format)</span> -></span>
format = <span class="hljs-literal">null</span> <span class="hljs-keyword">if</span> format <span class="hljs-keyword">is</span> <span class="hljs-string">'json'</span> <span class="hljs-comment"># JSON is the default and the API doesn't work with f=json</span></pre></div></div>
</li>
<li id="section-3">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-3">¶</a>
</div>
<p>Return a proper url with optional format</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-function"><span class="hljs-title">getUrl</span> = <span class="hljs-params">(url)</span> -></span>
url = <span class="hljs-string">"http://api.discogs.com/<span class="hljs-subst">#{url}</span>"</span> <span class="hljs-keyword">if</span> url.substr(<span class="hljs-number">0</span>, <span class="hljs-number">7</span>) <span class="hljs-keyword">isnt</span> <span class="hljs-string">'http://'</span>
sep = <span class="hljs-keyword">if</span> <span class="hljs-string">"?"</span> <span class="hljs-keyword">in</span> url <span class="hljs-keyword">then</span> <span class="hljs-string">"&"</span> <span class="hljs-keyword">else</span> <span class="hljs-string">"?"</span>
url += <span class="hljs-string">"<span class="hljs-subst">#{sep}</span>f=<span class="hljs-subst">#{format}</span>"</span> <span class="hljs-keyword">if</span> format
url</pre></div></div>
</li>
<li id="section-4">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-4">¶</a>
</div>
<p>Make a request</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-function"><span class="hljs-title">discogsRequest</span> = <span class="hljs-params">(url, next)</span> -></span>
<span class="hljs-function"><span class="hljs-title">parseResponse</span> = <span class="hljs-params">(err, res, body)</span> -></span>
<span class="hljs-keyword">if</span> err <span class="hljs-keyword">then</span> next err
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ~res.headers[<span class="hljs-string">'content-type'</span>]?.indexOf(<span class="hljs-string">'json'</span>) <span class="hljs-keyword">or</span> <span class="hljs-keyword">not</span> format
<span class="hljs-keyword">try</span>
next <span class="hljs-literal">null</span>, JSON.parse body
<span class="hljs-keyword">catch</span> e
next e
<span class="hljs-keyword">else</span>
next <span class="hljs-literal">null</span>, body
request
<span class="hljs-attribute">uri</span>: getUrl url
<span class="hljs-attribute">headers</span>:
<span class="hljs-string">'accept-encoding'</span>: <span class="hljs-string">'gzip'</span>
<span class="hljs-string">'user-agent'</span>: <span class="hljs-string">"<span class="hljs-subst">#{discogs.name}</span>/<span class="hljs-subst">#{discogs.version}</span> +<span class="hljs-subst">#{discogs.homepage}</span>"</span>
<span class="hljs-attribute">encoding</span>: <span class="hljs-literal">null</span>
<span class="hljs-function"><span class="hljs-params">(error, res, body)</span> -></span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> error <span class="hljs-keyword">and</span> <span class="hljs-number">200</span> <= res.statusCode < <span class="hljs-number">400</span>
<span class="hljs-keyword">if</span> ~res.headers[<span class="hljs-string">'content-encoding'</span>]?.indexOf <span class="hljs-string">'gzip'</span>
zlib.gunzip body, <span class="hljs-function"><span class="hljs-params">(err, body)</span> -></span>
parseResponse err, res, body
<span class="hljs-keyword">else</span>
parseResponse error, res, body.toString <span class="hljs-string">'utf8'</span>
<span class="hljs-keyword">else</span>
next error
<span class="hljs-function"><span class="hljs-title">responseHandler</span> = <span class="hljs-params">(type, next)</span> -></span> <span class="hljs-function"><span class="hljs-params">(err, res)</span> -></span>
<span class="hljs-keyword">if</span> err <span class="hljs-keyword">then</span> next err
<span class="hljs-keyword">else</span> next <span class="hljs-literal">null</span>, res?.resp?[type]</pre></div></div>
</li>
<li id="section-5">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-5">¶</a>
</div>
<p>API</p>
</div>
</li>
<li id="section-6">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-6">¶</a>
</div>
<p>Use this if you have a discogs url</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-attribute">get</span>: <span class="hljs-function"><span class="hljs-params">(url, next)</span> -></span>
discogsRequest url, next</pre></div></div>
</li>
<li id="section-7">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-7">¶</a>
</div>
<p>Get a master release</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-attribute">master</span>: <span class="hljs-function"><span class="hljs-params">(id, next)</span> -></span>
discogsRequest <span class="hljs-string">'master/'</span> + id,
responseHandler(<span class="hljs-string">'master'</span>, next)</pre></div></div>
</li>
<li id="section-8">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-8">¶</a>
</div>
<p>Get a release</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-attribute">release</span>: <span class="hljs-function"><span class="hljs-params">(id, next)</span> -></span>
discogsRequest <span class="hljs-string">'release/'</span> + id,
responseHandler(<span class="hljs-string">'release'</span>, next)</pre></div></div>
</li>
<li id="section-9">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-9">¶</a>
</div>
<p>Get an artist</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-attribute">artist</span>: <span class="hljs-function"><span class="hljs-params">(name, next)</span> -></span>
discogsRequest <span class="hljs-string">'artist/'</span> + name,
responseHandler(<span class="hljs-string">'artist'</span>, next)</pre></div></div>
</li>
<li id="section-10">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-10">¶</a>
</div>
<p>Get a label</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-attribute">label</span>: <span class="hljs-function"><span class="hljs-params">(name, next)</span> -></span>
discogsRequest <span class="hljs-string">'label/'</span> + name,
responseHandler(<span class="hljs-string">'label'</span>, next)</pre></div></div>
</li>
<li id="section-11">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-11">¶</a>
</div>
<p>Search for something
Valid types:
<code>all</code>, <code>artists</code>, <code>labels</code>, <code>releases</code>, <code>needsvote</code>, <code>catno</code>, <code>forsale</code></p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-attribute">search</span>: <span class="hljs-function"><span class="hljs-params">(query, type, next)</span> -></span>
<span class="hljs-keyword">if</span> type <span class="hljs-keyword">instanceof</span> Function
next = type
type = <span class="hljs-string">'all'</span>
discogsRequest <span class="hljs-string">'search?'</span> + querystring.stringify(<span class="hljs-attribute">type</span>: type, <span class="hljs-attribute">q</span>: query),
responseHandler(<span class="hljs-string">'search'</span>, next)</pre></div></div>
</li>
<li id="section-12">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-12">¶</a>
</div>
<p>Do a search and try to find the master or main release in all results.
Uses 2 or 3 requests per lookup, to find the best result.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-attribute">lookup</span>: <span class="hljs-function"><span class="hljs-params">(query, next)</span> -></span>
<span class="hljs-property">@search</span> query, <span class="hljs-string">"releases"</span>, <span class="hljs-function"><span class="hljs-params">(err, res)</span> =></span>
<span class="hljs-keyword">return</span> next err <span class="hljs-keyword">if</span> err
results = res?.searchresults?.results
<span class="hljs-keyword">return</span> next() <span class="hljs-keyword">unless</span> results
masters = (result <span class="hljs-keyword">for</span> result <span class="hljs-keyword">in</span> results <span class="hljs-keyword">when</span> result.type <span class="hljs-keyword">is</span> <span class="hljs-string">"master"</span>)</pre></div></div>
</li>
<li id="section-13">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-13">¶</a>
</div>
<p>Did we find masters already?</p>
</div>
<div class="content"><div class='highlight'><pre> results = masters <span class="hljs-keyword">if</span> masters.length
matches = (result <span class="hljs-keyword">for</span> result <span class="hljs-keyword">in</span> results <span class="hljs-keyword">when</span> result.title.toLowerCase() <span class="hljs-keyword">is</span> query.toLowerCase())</pre></div></div>
</li>
<li id="section-14">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-14">¶</a>
</div>
<p>Take only the best results</p>
</div>
<div class="content"><div class='highlight'><pre> results = matches <span class="hljs-keyword">if</span> matches.length
release = results[<span class="hljs-number">0</span>]
id = release.uri.split(<span class="hljs-string">"/"</span>).pop()
@[release.type] id, <span class="hljs-function"><span class="hljs-params">(err, res)</span> =></span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"master_id"</span> <span class="hljs-keyword">of</span> res</pre></div></div>
</li>
<li id="section-15">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-15">¶</a>
</div>
<p>Did we find a master now?</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-property">@master</span> res.master_id, <span class="hljs-function"><span class="hljs-params">(err, master)</span> =></span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"main_release"</span> <span class="hljs-keyword">of</span> master
<span class="hljs-property">@release</span> master.main_release, next
<span class="hljs-keyword">else</span>
next <span class="hljs-literal">null</span>, master
<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> <span class="hljs-string">"main_release"</span> <span class="hljs-keyword">of</span> res</pre></div></div>
</li>
<li id="section-16">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-16">¶</a>
</div>
<p>Or maybe a main release?</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-property">@release</span> res.main_release, next
<span class="hljs-keyword">else</span></pre></div></div>
</li>
<li id="section-17">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-17">¶</a>
</div>
<p>This is the best we can do</p>
</div>
<div class="content"><div class='highlight'><pre> next <span class="hljs-literal">null</span>, res</pre></div></div>
</li>
</ul>
</div>
</body>
</html>