diff --git a/pylast/__init__.py b/pylast/__init__.py index 46a61b5..f1b5880 100644 --- a/pylast/__init__.py +++ b/pylast/__init__.py @@ -296,24 +296,6 @@ class _Network(object): self.last_call_time = now - def create_new_playlist(self, title, description): - """ - Creates a playlist for the authenticated user and returns it - title: The title of the new playlist. - description: The description of the new playlist. - """ - - params = {} - params['title'] = title - params['description'] = description - - doc = _Request(self, 'playlist.create', params).execute(False) - - e_id = doc.getElementsByTagName("id")[0].firstChild.data - user = doc.getElementsByTagName('playlists')[0].getAttribute('user') - - return Playlist(user, e_id, self) - def get_top_artists(self, limit=None, cacheable=True): """Returns the most played artists as a sequence of TopItem objects.""" @@ -815,7 +797,6 @@ class LastFMNetwork(_Network): "artist": "music/%(artist)s", "event": "event/%(id)s", "country": "place/%(country_name)s", - "playlist": "user/%(user)s/library/playlists/%(appendix)s", "tag": "tag/%(name)s", "track": "music/%(artist)s/_/%(title)s", "group": "group/%(name)s", @@ -880,7 +861,6 @@ class LibreFMNetwork(_Network): "artist": "artist/%(artist)s", "event": "event/%(id)s", "country": "place/%(country_name)s", - "playlist": "user/%(user)s/library/playlists/%(appendix)s", "tag": "tag/%(name)s", "track": "music/%(artist)s/_/%(title)s", "group": "group/%(name)s", @@ -2458,148 +2438,6 @@ class Library(_BaseObject): return seq -class Playlist(_BaseObject): - """A Last.fm user playlist.""" - - id = None - user = None - - __hash__ = _BaseObject.__hash__ - - def __init__(self, user, playlist_id, network): - _BaseObject.__init__(self, network, "playlist") - - if isinstance(user, User): - self.user = user - else: - self.user = User(user, self.network) - - self.id = playlist_id - - @_string_output - def __str__(self): - return repr(self.user) + "'s playlist # " + repr(self.id) - - def _get_info_node(self): - """ - Returns the node from user.getPlaylists where this playlist's info is. - """ - - doc = self._request("user.getPlaylists", True) - - for node in doc.getElementsByTagName("playlist"): - if _extract(node, "id") == str(self.get_id()): - return node - - def _get_params(self): - return {'user': self.user.get_name(), 'playlistID': self.get_id()} - - def get_id(self): - """Returns the playlist ID.""" - - return self.id - - def get_user(self): - """Returns the owner user of this playlist.""" - - return self.user - - def get_tracks(self): - """Returns a list of the tracks on this user playlist.""" - - uri = _unicode('lastfm://playlist/%s') % self.get_id() - - return XSPF(uri, self.network).get_tracks() - - def add_track(self, track): - """Adds a Track to this Playlist.""" - - params = self._get_params() - params['artist'] = track.get_artist().get_name() - params['track'] = track.get_title() - - self._request('playlist.addTrack', False, params) - - def get_title(self): - """Returns the title of this playlist.""" - - return _extract(self._get_info_node(), "title") - - def get_creation_date(self): - """Returns the creation date of this playlist.""" - - return _extract(self._get_info_node(), "date") - - def get_size(self): - """Returns the number of tracks in this playlist.""" - - return _number(_extract(self._get_info_node(), "size")) - - def get_description(self): - """Returns the description of this playlist.""" - - return _extract(self._get_info_node(), "description") - - def get_duration(self): - """Returns the duration of this playlist in milliseconds.""" - - return _number(_extract(self._get_info_node(), "duration")) - - def is_streamable(self): - """ - Returns True if the playlist is streamable. - For a playlist to be streamable, it needs at least 45 tracks by 15 - different artists.""" - - if _extract(self._get_info_node(), "streamable") == '1': - return True - else: - return False - - def has_track(self, track): - """Checks to see if track is already in the playlist. - * track: Any Track object. - """ - - return track in self.get_tracks() - - def get_cover_image(self, size=COVER_EXTRA_LARGE): - """ - Returns a uri to the cover image - size can be one of: - COVER_MEGA - COVER_EXTRA_LARGE - COVER_LARGE - COVER_MEDIUM - COVER_SMALL - """ - - return _extract(self._get_info_node(), "image")[size] - - def get_url(self, domain_name=DOMAIN_ENGLISH): - """Returns the url of the playlist on the network. - * domain_name: The network's language domain. Possible values: - o DOMAIN_ENGLISH - o DOMAIN_GERMAN - o DOMAIN_SPANISH - o DOMAIN_FRENCH - o DOMAIN_ITALIAN - o DOMAIN_POLISH - o DOMAIN_PORTUGUESE - o DOMAIN_SWEDISH - o DOMAIN_TURKISH - o DOMAIN_RUSSIAN - o DOMAIN_JAPANESE - o DOMAIN_CHINESE - """ - - english_url = _extract(self._get_info_node(), "url") - appendix = english_url[english_url.rfind("/") + 1:] - - return self.network._get_url(domain_name, "playlist") % { - 'appendix': appendix, "user": self.get_user().get_name()} - - class Tag(_BaseObject, _Chartable): """A Last.fm object tag.""" @@ -2895,51 +2733,6 @@ class Group(_BaseObject, _Chartable): return users -class XSPF(_BaseObject): - "A Last.fm XSPF playlist.""" - - uri = None - - __hash__ = _BaseObject.__hash__ - - def __init__(self, uri, network): - _BaseObject.__init__(self, network, None) - - self.uri = uri - - def _get_params(self): - return {'playlistURL': self.get_uri()} - - @_string_output - def __str__(self): - return self.get_uri() - - def __eq__(self, other): - return self.get_uri() == other.get_uri() - - def __ne__(self, other): - return self.get_uri() != other.get_uri() - - def get_uri(self): - """Returns the Last.fm playlist URI. """ - - return self.uri - - def get_tracks(self): - """Returns the tracks on this playlist.""" - - doc = self._request('playlist.fetch', True) - - seq = [] - for node in doc.getElementsByTagName('track'): - title = _extract(node, 'title') - artist = _extract(node, 'creator') - - seq.append(Track(artist, title, self.network)) - - return seq - - class User(_BaseObject, _Chartable): """A Last.fm user.""" @@ -3101,18 +2894,6 @@ class User(_BaseObject, _Chartable): return seq - def get_playlists(self): - """Returns a list of Playlists that this user owns.""" - - doc = self._request(self.ws_prefix + ".getPlaylists", True) - - playlists = [] - for playlist_id in _extract_all(doc, "id"): - playlists.append( - Playlist(self.get_name(), playlist_id, self.network)) - - return playlists - def get_now_playing(self): """ Returns the currently playing track, or None if nothing is playing. diff --git a/tests/test_pylast.py b/tests/test_pylast.py index e5e415e..1739bd9 100755 --- a/tests/test_pylast.py +++ b/tests/test_pylast.py @@ -5,7 +5,6 @@ Integration (not unit) tests for pylast.py from flaky import flaky import os import pytest -from random import choice import time import unittest @@ -302,14 +301,6 @@ class TestPyLast(unittest.TestCase): # Act/Assert self.helper_is_thing_hashable(library) - def test_playlist_is_hashable(self): - # Arrange - playlist = pylast.Playlist( - user="RJ", playlist_id="1k1qp_doglist", network=self.network) - - # Act/Assert - self.helper_is_thing_hashable(playlist) - def test_tag_is_hashable(self): # Arrange tag = self.network.get_top_tags(limit=1)[0] @@ -341,14 +332,6 @@ class TestPyLast(unittest.TestCase): # Act/Assert self.helper_is_thing_hashable(venue) - def test_xspf_is_hashable(self): - # Arrange - xspf = pylast.XSPF( - uri="lastfm://playlist/1k1qp_doglist", network=self.network) - - # Act/Assert - self.helper_is_thing_hashable(xspf) - def test_invalid_xml(self): # Arrange # Currently causes PCDATA invalid Char value 25 @@ -1356,69 +1339,6 @@ class TestPyLast(unittest.TestCase): self.network.disable_caching() self.assertFalse(self.network.is_caching_enabled()) - def test_create_playlist(self): - # Arrange - title = "Test playlist" - description = "Testing" - lastfm_user = self.network.get_user(self.username) - - # Act - playlist = self.network.create_new_playlist(title, description) - - # Assert - self.assertIsInstance(playlist, pylast.Playlist) - self.assertEqual(playlist.get_title(), "Test playlist") - self.assertEqual(playlist.get_description(), "Testing") - self.assertEqual(playlist.get_user(), lastfm_user) - - def test_empty_playlist_unstreamable(self): - # Arrange - title = "Empty playlist" - description = "Unstreamable" - - # Act - playlist = self.network.create_new_playlist(title, description) - - # Assert - self.assertEqual(playlist.get_size(), 0) - self.assertEqual(playlist.get_duration(), 0) - self.assertFalse(playlist.is_streamable()) - - def test_big_playlist_is_streamable(self): - # Arrange - # Find a big playlist on Last.fm, eg "top 100 classick rock songs" - user = "kaxior" - id = 10417943 - playlist = pylast.Playlist(user, id, self.network) - self.assertEqual( - playlist.get_url(), - "https://www.last.fm/user/kaxior/library/" - "playlists/67ajb_top_100_classick_rock_songs") - - # Act - # Nothing - - # Assert - self.assertIsInstance(playlist, pylast.Playlist) - self.assertGreaterEqual(playlist.get_size(), 45) - self.assertGreater(playlist.get_duration(), 0) - self.assertTrue(playlist.is_streamable()) - - def test_add_track_to_playlist(self): - # Arrange - title = "One track playlist" - description = "Testing" - playlist = self.network.create_new_playlist(title, description) - track = pylast.Track("Test Artist", "test title", self.network) - - # Act - playlist.add_track(track) - - # Assert - self.assertEqual(playlist.get_size(), 1) - self.assertEqual(len(playlist.get_tracks()), 1) - self.assertTrue(playlist.has_track(track)) - def test_album_mbid(self): # Arrange mbid = "a6a265bf-9f81-4055-8224-f7ac0aa6b937"