- self._fetch(payload)
- for art in self.current_element.get('similarartists').get('artist'):
- match = 100 * float(art.get('match'))
- yield Artist(mbid=art.get('mbid', None),
- name=art.get('name')), match
-
+ ans = 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 = ans.get('similarartists').get('artist')
+ if not isinstance(simarts, list):
+ raise WSError('Artist found but no similarities returned')
+ for art in ans.get('similarartists').get('artist'):
+ yield Artist(name=art.get('name'), mbid=art.get('mbid', None))
+
+ def get_toptrack(self, artist=None):
+ """Fetch artist top tracks
+ """
+ payload = self._forge_payload(artist, method='top')
+ ans = self._fetch(payload)
+ tops = ans.get('toptracks').get('track')
+ art = {
+ 'artist': artist.name,
+ 'musicbrainz_artistid': artist.mbid,
+ }
+ for song in tops:
+ for key in ['artist', 'streamable', 'listeners',
+ 'url', 'image', '@attr']:
+ if key in song:
+ song.pop(key)
+ song.update(art)
+ song.update(title=song.pop('name'))
+ song.update(time=song.pop('duration'))
+ yield Track(**song)