- url = SimaFM.root_url + SimaFM.request.get('top')
- self._url = url % (urllib.parse.quote(self.artist_utf8, safe=''))
- self._fetch()
- # TODO: controls name encoding
- elem = self.current_element
- for track in elem.getiterator(tag='track'):
- yield str(track.findtext('name')), int(track.attrib.get('rank'))
-
- def get_similartracks(self, track=None, artist=None):
- """
- """
- # Construct URL
- url = SimaFM.root_url + SimaFM.request.get('track')
- self._url = url % (urllib.parse.quote(artist.encode('UTF-8'), safe=''),
- urllib.parse.quote(track.encode('UTF-8'), safe=''))
- self._fetch()
- elem = self.current_element
- for trk in elem.getiterator(tag='track'):
- yield (str(trk.findtext('artist/name')),
- str(trk.findtext('name')),
- 100 * float(trk.findtext('match')))
-
- def get_mbid(self, artist=None):
- """
- """
- self._controls_artist(artist)
- # Construct URL
- url = SimaFM.root_url + SimaFM.request.get('info')
- self._url = url % (urllib.parse.quote(self.artist_utf8, safe=''))
- self._fetch()
- # TODO: controls name encoding
- elem = self.current_element
- return str(elem.find('artist').findtext('mbid'))
-
-
-def run():
- test = SimaFM()
- for t, a, m in test.get_similartracks(artist='Nirvana', track='Smells Like Teen Spirit'):
- print(a, t, m)
- return
-
-if __name__ == '__main__':
- try:
- run()
- except XmlFMHTTPError as conn_err:
- print("error trying to connect: %s" % conn_err)
- except XmlFMNotFound as not_found:
- print("looks like no artists were found: %s" % not_found)
- except XmlFMError as err:
- print(err)
+ 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))