diff --git a/pylast.py b/pylast.py index 49a2f1a..7b72178 100644 --- a/pylast.py +++ b/pylast.py @@ -121,10 +121,10 @@ RE_XML_ILLEGAL = (u'([\u0000-\u0008\u000b-\u000c\u000e-\u001f\ufffe-\uffff])' + u'|' + u'([%s-%s][^%s-%s])|([^%s-%s][%s-%s])|([%s-%s]$)|(^[%s-%s])' % - (unichr(0xd800), unichr(0xdbff), unichr(0xdc00), - unichr(0xdfff), unichr(0xd800), unichr(0xdbff), - unichr(0xdc00), unichr(0xdfff), unichr(0xd800), - unichr(0xdbff), unichr(0xdc00), unichr(0xdfff))) + (unichr(0xd800), unichr(0xdbff), unichr(0xdc00), + unichr(0xdfff), unichr(0xd800), unichr(0xdbff), + unichr(0xdc00), unichr(0xdfff), unichr(0xd800), + unichr(0xdbff), unichr(0xdc00), unichr(0xdfff))) XML_ILLEGAL = re.compile(RE_XML_ILLEGAL) @@ -1023,7 +1023,7 @@ class _Request(object): def sign_it(self): """Sign this request.""" - if not "api_sig" in self.params.keys(): + if "api_sig" not in self.params.keys(): self.params['api_sig'] = self._get_signature() def _get_signature(self): @@ -2093,6 +2093,17 @@ class Artist(_BaseObject, _Taggable): self._request("artist.Shout", False, params) + def get_band_members(self): + """Returns a list of band members or None if unknown.""" + + names = None + doc = self._request(self.ws_prefix + ".getInfo", True) + + for node in doc.getElementsByTagName("bandmembers"): + names = _extract_all(node, "name") + + return names + class Event(_BaseObject): """An event.""" @@ -4115,7 +4126,7 @@ def _number(string): def _unescape_htmlentity(string): - #string = _unicode(string) + # string = _unicode(string) mapping = htmlentitydefs.name2codepoint for key in mapping: diff --git a/test_pylast.py b/test_pylast.py index ed2bf9b..0f71c65 100755 --- a/test_pylast.py +++ b/test_pylast.py @@ -1251,7 +1251,7 @@ class TestPyLast(unittest.TestCase): # Assert # Check inbox for spam! - #album/artist/event/track/user + # album/artist/event/track/user def test_album_shouts(self): # Arrange @@ -1750,7 +1750,6 @@ class TestPyLast(unittest.TestCase): self.assertEqual(mbid, "a74b1b7f-71a5-4011-9441-d0b5e4122711") self.assertIsInstance(streamable, bool) - def test_events(self): # Arrange event_id_1 = 3162700 # Glasto 2013 @@ -1803,7 +1802,6 @@ class TestPyLast(unittest.TestCase): self.assertTrue(country1 != country2) self.assertEqual(url, "http://www.last.fm/place/italy") - def test_track_eq_none_is_false(self): # Arrange track1 = None @@ -1820,6 +1818,26 @@ class TestPyLast(unittest.TestCase): # Act / Assert self.assertTrue(track1 != track2) + def test_band_members(self): + # Arrange + artist = pylast.Artist("The Beatles", self.network) + + # Act + band_members = artist.get_band_members() + + # Assert + self.assertGreaterEqual(len(band_members), 4) + + def test_no_band_members(self): + # Arrange + artist = pylast.Artist("John Lennon", self.network) + + # Act + band_members = artist.get_band_members() + + # Assert + self.assertIsNone(band_members) + if __name__ == '__main__': parser = argparse.ArgumentParser(