X-Git-Url: https://git.kaliko.me/?a=blobdiff_plain;f=sima%2Flib%2Fsimafm.py;h=3210fdcdf7a4beb8dca96755e0c0470b849f92d7;hb=78a694ddcd2a6ecc8b2b1fd3c74ee2d938707305;hp=04ee37b915386413d6ccd24d00865df8c72b42fd;hpb=00f3a52f35f709dd4c471cb6ad87dbd09cfd4aaf;p=mpd-sima.git diff --git a/sima/lib/simafm.py b/sima/lib/simafm.py index 04ee37b..3210fdc 100644 --- a/sima/lib/simafm.py +++ b/sima/lib/simafm.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- - -# Copyright (c) 2014 Jack Kaliko +# Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Jack Kaliko # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,10 +17,10 @@ # """ -Consume EchoNest web service +Consume Last.fm web service """ -__version__ = '0.0.1' +__version__ = '0.5.0' __author__ = 'Jack Kaliko' @@ -38,11 +37,11 @@ if len(LFM.get('apikey')) == 43: # simple hack allowing imp.reload # Some definitions WAIT_BETWEEN_REQUESTS = timedelta(0, 1) -SOCKET_TIMEOUT = 4 +SOCKET_TIMEOUT = 6 -class SimaFM(): - """ +class SimaFM: + """Last.fm http client """ root_url = 'http://{host}/{version}/'.format(**LFM) cache = {} @@ -64,7 +63,7 @@ class SimaFM(): self.current_element = SimaFM.cache.get(url).elem return try: - self._fetch_ech(payload) + self._fetch_ws(payload) except Timeout: raise WSTimeout('Failed to reach server within {0}s'.format( SOCKET_TIMEOUT)) @@ -72,7 +71,7 @@ class SimaFM(): raise WSError(err) @Throttle(WAIT_BETWEEN_REQUESTS) - def _fetch_ech(self, payload): + def _fetch_ws(self, payload): """fetch from web service""" req = get(self._url, params=payload, timeout=SOCKET_TIMEOUT) @@ -97,7 +96,7 @@ class SimaFM(): return True def _forge_payload(self, artist, method='similar', track=None): - """ + """Build payload """ payloads = dict({'similar': {'method':'artist.getsimilar',}, 'top': {'method':'artist.gettoptracks',}, @@ -112,18 +111,28 @@ class SimaFM(): if artist.mbid: payload.update(mbid='{0}'.format(artist.mbid)) else: - payload.update(artist=artist.name) + payload.update(artist=artist.name, + autocorrect=1) payload.update(results=100) if method == 'track': payload.update(track=track) return payload def get_similar(self, artist=None): - """ + """Fetch similar artists """ payload = self._forge_payload(artist) # Construct URL self._fetch(payload) + # Artist might be found be return no 'artist' list… + # cf. "Mulatu Astatqe" vs. "Mulatu Astatqé" with autocorrect=0 + # json format is broken IMHO, xml is more consistent IIRC + # Here what we got: + # >>> {"similarartists":{"#text":"\n","artist":"Mulatu Astatqe"}} + # autocorrect=1 should fix it, checking anyway. + simarts = self.current_element.get('similarartists').get('artist') + if not isinstance(simarts, list): + raise WSError('Artist found but no similarities returned') for art in self.current_element.get('similarartists').get('artist'): yield Artist(name=art.get('name'), mbid=art.get('mbid', None))