]> kaliko git repositories - mpd-sima.git/blobdiff - sima/lib/simafm.py
Clean some linter warnings and errors
[mpd-sima.git] / sima / lib / simafm.py
index a5f19d08593ef36055e67110a31d33fdc474e620..bd203f74f3330f1da06a0d7abd5d1f0c741e8a0b 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Jack Kaliko <kaliko@azylum.org>
+# Copyright (c) 2009-2014 kaliko <kaliko@azylum.org>
 #
 #   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
@@ -25,7 +25,6 @@ __version__ = '0.5.1'
 __author__ = 'Jack Kaliko'
 
 
-
 from sima import LFM
 from sima.lib.meta import Artist
 from sima.lib.track import Track
@@ -47,9 +46,9 @@ class SimaFM:
 
     :param BaseCache cache: Set a cache, defaults to `False`.
     """
-    stats = {'etag':0,
-             'ccontrol':0,
-             'total':0}
+    stats = {'etag': 0,
+             'ccontrol': 0,
+             'total': 0}
 
     def __init__(self):
         self.http = HttpClient(cache=self.cache, stats=self.stats)
@@ -69,11 +68,11 @@ class SimaFM:
     def _forge_payload(self, artist, method='similar', track=None):
         """Build payload
         """
-        payloads = dict({'similar': {'method':'artist.getsimilar',},
-                         'top': {'method':'artist.gettoptracks',},
-                         'track': {'method':'track.getsimilar',},
-                         'info': {'method':'artist.getinfo',},
-                        })
+        payloads = dict({'similar': {'method': 'artist.getsimilar',},
+                         'top': {'method': 'artist.gettoptracks',},
+                         'track': {'method': 'track.getsimilar',},
+                         'info': {'method': 'artist.getinfo',},
+                         })
         payload = payloads.get(method)
         payload.update(api_key=LFM.get('apikey'), format='json')
         if not isinstance(artist, Artist):
@@ -100,17 +99,22 @@ class SimaFM:
         payload = self._forge_payload(artist)
         # Construct URL
         ans = self.http(self.root_url, payload)
-        self._controls_answer(ans.json()) # pylint: disable=no-member
-        # Artist might be found be return no 'artist' list…
+        try:
+            ans.json()
+        except ValueError:
+            # Corrupted/malformed cache? cf. gitlab issue #35
+            raise WSError('Malformed json, try purging the cache: %s')
+        self._controls_answer(ans.json())  # pylint: disable=no-member
+        # Artist might be found but 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 = ans.json().get('similarartists').get('artist') # pylint: disable=no-member
+        simarts = ans.json().get('similarartists').get('artist')  # pylint: disable=no-member
         if not isinstance(simarts, list):
             raise WSError('Artist found but no similarities returned')
-        for art in ans.json().get('similarartists').get('artist'): # pylint: disable=no-member
+        for art in ans.json().get('similarartists').get('artist'):  # pylint: disable=no-member
             yield Artist(name=art.get('name'), mbid=art.get('mbid', None))
 
     def get_toptrack(self, artist):
@@ -121,8 +125,8 @@ class SimaFM:
         """
         payload = self._forge_payload(artist, method='top')
         ans = self.http(self.root_url, payload)
-        self._controls_answer(ans.json()) # pylint: disable=no-member
-        tops = ans.json().get('toptracks').get('track') # pylint: disable=no-member
+        self._controls_answer(ans.json())  # pylint: disable=no-member
+        tops = ans.json().get('toptracks').get('track')  # pylint: disable=no-member
         art = {'artist': artist.name,
                'musicbrainz_artistid': artist.mbid,}
         for song in tops: