From daa590b11d8ad0640d18db66106aeba3d14d29e8 Mon Sep 17 00:00:00 2001 From: hugovk Date: Tue, 4 Mar 2014 18:56:28 +0200 Subject: [PATCH] Implement geo.getMetroHypeTrackChart, geo.getMetroTrackChart and geo.getMetroUniqueTrackChart. Closes #44. --- pylast.py | 55 +++++++++++++++++++++++++++++++++++++------------- test_pylast.py | 27 +++++++++++++++++++------ 2 files changed, 62 insertions(+), 20 deletions(-) diff --git a/pylast.py b/pylast.py index 134b49d..93abf58 100644 --- a/pylast.py +++ b/pylast.py @@ -2158,7 +2158,7 @@ class Metro(_BaseObject): return self.country - def _get_chart(self, method, limit=None, from_date=None, to_date=None, cacheable=True): + def _get_chart(self, method, tag="artist", limit=None, from_date=None, to_date=None, cacheable=True): """Internal helper for getting geo charts.""" params = self._get_params() if limit: params["limit"] = limit @@ -2166,49 +2166,76 @@ class Metro(_BaseObject): params["from"] = from_date params["to"] = to_date - doc = self._request("geo.getMetroArtistChart", cacheable, params) + doc = self._request(method, cacheable, params) seq = [] - for node in doc.getElementsByTagName("artist"): - item = Artist(_extract(node, "name"), self.network) + for node in doc.getElementsByTagName(tag): + if tag == "artist": + item = Artist(_extract(node, "name"), self.network) + elif tag == "track": + title = _extract(node, "name") + artist = _extract_element_tree(node).get('artist')['name'] + item = Track(artist, title, self.network) + else: + return None weight = _number(_extract(node, "listeners")) seq.append(TopItem(item, weight)) return seq - def get_artist_chart(self, limit=None, from_date=None, to_date=None, cacheable=True): + def get_artist_chart(self, tag="artist", limit=None, from_date=None, to_date=None, cacheable=True): """Get a chart of artists for a metro. Parameters: from_date (Optional) : Beginning timestamp of the weekly range requested to_date (Optional) : Ending timestamp of the weekly range requested limit (Optional) : The number of results to fetch per page. Defaults to 50. """ - return self._get_chart("geo.getMetroArtistChart", limit, from_date, to_date, cacheable) + return self._get_chart("geo.getMetroArtistChart", tag = tag, limit = limit, from_date = from_date, to_date = to_date, cacheable = cacheable) - def get_hype_artist_chart(self, limit=None, from_date=None, to_date=None, cacheable=True): + def get_hype_artist_chart(self, tag="artist", limit=None, from_date=None, to_date=None, cacheable=True): """Get a chart of hyped (up and coming) artists for a metro. Parameters: from_date (Optional) : Beginning timestamp of the weekly range requested to_date (Optional) : Ending timestamp of the weekly range requested limit (Optional) : The number of results to fetch per page. Defaults to 50. """ - return self._get_chart("geo.getMetroHypeArtistChart", limit, from_date, to_date, cacheable) + return self._get_chart("geo.getMetroHypeArtistChart", tag = tag, limit = limit, from_date = from_date, to_date = to_date, cacheable = cacheable) - def get_unique_artist_chart(self, limit=None, from_date=None, to_date=None, cacheable=True): + def get_unique_artist_chart(self, tag="artist", limit=None, from_date=None, to_date=None, cacheable=True): """Get a chart of the artists which make that metro unique. Parameters: from_date (Optional) : Beginning timestamp of the weekly range requested to_date (Optional) : Ending timestamp of the weekly range requested limit (Optional) : The number of results to fetch per page. Defaults to 50. """ - return self._get_chart("geo.getMetroUniqueArtistChart", limit, from_date, to_date, cacheable) + return self._get_chart("geo.getMetroUniqueArtistChart", tag = tag, limit = limit, from_date = from_date, to_date = to_date, cacheable = cacheable) + def get_track_chart(self, tag="track", limit=None, from_date=None, to_date=None, cacheable=True): + """Get a chart of tracks for a metro. + Parameters: + from_date (Optional) : Beginning timestamp of the weekly range requested + to_date (Optional) : Ending timestamp of the weekly range requested + limit (Optional) : The number of results to fetch per page. Defaults to 50. + """ + return self._get_chart("geo.getMetroTrackChart", tag = tag, limit = limit, from_date = from_date, to_date = to_date, cacheable = cacheable) - # TODO? - # geo.getMetroHypeTrackChart - # geo.getMetroTrackChart - # geo.getMetroUniqueTrackChart + def get_hype_track_chart(self, tag="track", limit=None, from_date=None, to_date=None, cacheable=True): + """Get a chart of tracks for a metro. + Parameters: + from_date (Optional) : Beginning timestamp of the weekly range requested + to_date (Optional) : Ending timestamp of the weekly range requested + limit (Optional) : The number of results to fetch per page. Defaults to 50. + """ + return self._get_chart("geo.getMetroHypeTrackChart", tag = tag, limit = limit, from_date = from_date, to_date = to_date, cacheable = cacheable) + def get_unique_track_chart(self, tag="track", limit=None, from_date=None, to_date=None, cacheable=True): + """Get a chart of tracks for a metro. + Parameters: + from_date (Optional) : Beginning timestamp of the weekly range requested + to_date (Optional) : Ending timestamp of the weekly range requested + limit (Optional) : The number of results to fetch per page. Defaults to 50. + """ + return self._get_chart("geo.getMetroUniqueTrackChart", tag = tag, limit = limit, from_date = from_date, to_date = to_date, cacheable = cacheable) class Library(_BaseObject): """A user's Last.fm library.""" diff --git a/test_pylast.py b/test_pylast.py index 67b6d49..cf62498 100755 --- a/test_pylast.py +++ b/test_pylast.py @@ -916,9 +916,9 @@ class TestPyLast(unittest.TestCase): self.assertLess(start, end) - def helper_get_metro_and_dates(self, function_name): + def helper_geo_chart(self, function_name, expected_type = pylast.Artist): # Arrange - metro = self.network.get_metro("Salamanca", "Spain") + metro = self.network.get_metro("Madrid", "Spain") dates = self.network.get_metro_weekly_chart_dates() (from_date, to_date) = dates[0] @@ -931,22 +931,37 @@ class TestPyLast(unittest.TestCase): # Assert self.assertEqual(len(chart), 1) self.assertEqual(type(chart[0]), pylast.TopItem) - self.assertEqual(type(chart[0].item), pylast.Artist) + self.assertEqual(type(chart[0].item), expected_type) def test_get_metro_artist_chart(self): # Arrange/Act/Assert - self.helper_get_metro_and_dates("get_artist_chart") + self.helper_geo_chart("get_artist_chart") def test_get_metro_hype_artist_chart(self): # Arrange/Act/Assert - self.helper_get_metro_and_dates("get_hype_artist_chart") + self.helper_geo_chart("get_hype_artist_chart") def test_get_metro_unique_artist_chart(self): # Arrange/Act/Assert - self.helper_get_metro_and_dates("get_unique_artist_chart") + self.helper_geo_chart("get_unique_artist_chart") + + + def test_get_metro_track_chart(self): + # Arrange/Act/Assert + self.helper_geo_chart("get_track_chart", expected_type = pylast.Track) + + + def test_get_metro_hype_track_chart(self): + # Arrange/Act/Assert + self.helper_geo_chart("get_hype_track_chart", expected_type = pylast.Track) + + + def test_get_metro_unique_track_chart(self): + # Arrange/Act/Assert + self.helper_geo_chart("get_unique_track_chart", expected_type = pylast.Track) def test_geo_get_metros(self):