UNPKG

discogs

Version:

Simple client for Discogs API

361 lines (243 loc) 16.6 kB
<!DOCTYPE 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">&#182;</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">&#182;</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> -&gt;</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">&#182;</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> -&gt;</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">"&amp;"</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">&#182;</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> -&gt;</span> <span class="hljs-function"><span class="hljs-title">parseResponse</span> = <span class="hljs-params">(err, res, body)</span> -&gt;</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> -&gt;</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> &lt;= res.statusCode &lt; <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> -&gt;</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> -&gt;</span> <span class="hljs-function"><span class="hljs-params">(err, res)</span> -&gt;</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">&#182;</a> </div> <p>API</p> </div> </li> <li id="section-6"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-6">&#182;</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> -&gt;</span> discogsRequest url, next</pre></div></div> </li> <li id="section-7"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-7">&#182;</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> -&gt;</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">&#182;</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> -&gt;</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">&#182;</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> -&gt;</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">&#182;</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> -&gt;</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">&#182;</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> -&gt;</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">&#182;</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> -&gt;</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> =&gt;</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">&#182;</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">&#182;</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> =&gt;</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">&#182;</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> =&gt;</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">&#182;</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">&#182;</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>