- 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.http(self.root_url, payload)
+ self._controls_answer(ans.json()) # pylint: disable=no-member
+ # 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.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
+ yield Artist(name=art.get('name'), mbid=art.get('mbid', None))
+
+ def get_toptrack(self, artist):
+ """Fetch artist top tracks
+
+ :param sima.lib.meta.Artist artist: `Artist` to fetch top tracks from
+ :returns: generator of :class:`sima.lib.track.Track`
+ """
+ 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
+ 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', 0))
+ yield Track(**song)