diff --git a/.gitignore b/.gitignore index e7288ae..72eb345 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,4 @@ docs/_build/ # Test files test_pylast.yaml lastfm.txt.pkl +secrets.sh diff --git a/pylast.py b/pylast.py index 93abf58..57ab220 100644 --- a/pylast.py +++ b/pylast.py @@ -699,6 +699,39 @@ class _Network(object): if remaining_tracks: self.scrobble_many(remaining_tracks) + def get_play_links(self, type, things, cacheable=True): + method = type + ".getPlaylinks" + params = {} + + for i, thing in enumerate(things): + if type == "artist": + params['artist[' + str(i) + ']'] = thing + elif type == "album": + params['artist[' + str(i) + ']'] = thing.artist + params['album[' + str(i) + ']'] = thing.title + elif type == "track": + params['artist[' + str(i) + ']'] = thing.artist + params['track[' + str(i) + ']'] = thing.title + + doc = _Request(self, method, params).execute(cacheable) + + seq = [] + + for node in doc.getElementsByTagName("externalids"): + spotify = _extract(node, "spotify") + seq.append(spotify) + + return seq + + def get_artist_play_links(self, artists, cacheable=True): + return self.get_play_links("artist", artists) + + def get_album_play_links(self, albums, cacheable=True): + return self.get_play_links("album", albums) + + def get_track_play_links(self, tracks, cacheable=True): + return self.get_play_links("track", tracks) + class LastFMNetwork(_Network): """A Last.fm network object diff --git a/test_pylast.py b/test_pylast.py index cf62498..d027f59 100755 --- a/test_pylast.py +++ b/test_pylast.py @@ -972,6 +972,7 @@ class TestPyLast(unittest.TestCase): # Assert self.assertGreaterEqual(len(metros), 1) self.assertEqual(type(metros[0]), pylast.Metro) + self.assertEqual(metros[0].get_country(), "Poland") def test_geo_get_top_artists(self): @@ -1009,6 +1010,54 @@ class TestPyLast(unittest.TestCase): self.assertNotEqual(metro, pylast.Metro("Wellington", "New Zealand", self.network)) + def test_get_album_play_links(self): + # Arrange + album1 = self.network.get_album(artist = "Portishead", title = "Dummy") + album2 = self.network.get_album(artist = "Radiohead", title = "OK Computer") + albums = [album1, album2] + + # Act + links = self.network.get_album_play_links(albums) + + # Assert + self.assertEqual(type(links), list) + self.assertEqual(len(links), 2) + # How permanent are Spotify IDs? If they change, make tests more robust + self.assertEqual(links[0], "spotify:album:3gxOtUSRzweDWBKlpj7cG6") + self.assertEqual(links[1], "spotify:album:2fGCAYUMssLKiUAoNdxGLx") + + + def test_get_artist_play_links(self): + # Arrange + artists = ["Portishead", "Radiohead"] + # Act + links = self.network.get_artist_play_links(artists) + + # Assert + self.assertEqual(type(links), list) + self.assertEqual(len(links), 2) + # How permanent are Spotify IDs? If they change, make tests more robust + self.assertEqual(links[0], "spotify:artist:6liAMWkVf5LH7YR9yfFy1Y") + self.assertEqual(links[1], "spotify:artist:4Z8W4fKeB5YxbusRsdQVPb") + + + def test_get_track_play_links(self): + # Arrange + track1 = self.network.get_track(artist = "Portishead", title = "Mysterons") + track2 = self.network.get_track(artist = "Radiohead", title = "Creep") + tracks = [track1, track2] + + # Act + links = self.network.get_track_play_links(tracks) + + # Assert + self.assertEqual(type(links), list) + self.assertEqual(len(links), 2) + # How permanent are Spotify IDs? If they change, make tests more robust + self.assertEqual(links[0], "spotify:track:2bt04YlMnqiwA3T6O9UqBO") + self.assertEqual(links[1], "spotify:track:0KYHSg38GsU1naJ5jh1llP") + + if __name__ == '__main__': # For quick testing of a single case (eg. test = "test_scrobble")