Source code for asyncspotify.playlist

from .mixins import ExternalURLMixin, ImageMixin, TrackMixin
from .object import SpotifyObject
from .user import PublicUser
from .track import PlaylistTrack


class _BasePlaylist(SpotifyObject, TrackMixin, ExternalURLMixin, ImageMixin):
	_type = 'playlist'
	_track_class = PlaylistTrack

	def __init__(self, client, data):
		super().__init__(client, data)

		TrackMixin.__init__(self, data)
		ExternalURLMixin.__init__(self, data)
		ImageMixin.__init__(self, data)

		self.snapshot_id = data.pop('snapshot_id')
		self.collaborative = data.pop('collaborative')
		self.public = data.pop('public')

		self.owner = PublicUser(client, data.pop('owner'))

	async def edit(self, name=None, public=None, collaborative=None, description=None):
		'''
		Edit the playlist.
		
		:param str name: New name of the playlist.
		:param str description: New description of the playlist.
		:param bool public: New public state of the playlist.
		:param bool collaborative: New collaborative state of the playlist.
		'''

		await self._client.edit_playlist(
			playlist=self.id,
			name=name,
			public=public,
			collaborative=collaborative,
			description=description,
		)

	async def add_track(self, track, position=None):
		'''
		Add a track to the playlist.

		:param track: Spotify ID or :class:`Track` instance.
		:param int position: Position in the playlist to insert tracks.
		'''

		await self._client.playlist_add_tracks(self.id, track, position=position)

	async def add_tracks(self, *tracks, position=None):
		'''
		Add several tracks to the playlist.

		:param tracks: Several Spotify IDs or :class:`Track` instances (or a mix).
		:param int position: Position in the playlist to insert tracks.
		'''

		await self._client.playlist_add_tracks(self.id, *tracks, position=position)


[docs]class SimplePlaylist(_BasePlaylist): ''' Represents a playlist object. .. note:: To iterate all tracks, you have to use the ``async for`` construct or fill the object with ``.fill()`` before iterating ``.tracks``. id: str Spotify ID of the playlist. name: str Name of the playlist. tracks: List[:class:`SimpleTrack`] All tracks in the playlist. track_count: int The expected track count as advertised by the last paging object. ``is_filled()`` can return True even if fewer tracks than this exists in ``tracks``, since some fetched tracks from the API can be None for various reasons. uri: str Spotify URI of the playlist. link: str Spotify URL of the playlist. snapshot_id: str Spotify ID of the current playlist snapshot. Read about snapshots `here. <https://developer.spotify.com/documentation/general/guides/working-with-playlists/>`_ collaborative: bool Whether the playlist is collaborative. public: bool Whether the playlist is public. owner: :class:`PublicUser` Owner of the playlist. external_urls: dict Dictionary that maps type to url. images: List[:class:`Image`] List of associated images. '''
[docs]class FullPlaylist(_BasePlaylist): ''' Represents a complete playlist object. This type has some additional attributes not existent in :class:`SimplePlaylist`. description: str Description of the playlist, as set by the owner. primary_color: str Primary color of the playlist, for aesthetic purposes. follower_count: int Follower count of the playlist. ''' def __init__(self, client, data): super().__init__(client, data) self.description = data.pop('description') self.primary_color = data.pop('primary_color') self.follower_count = data['followers']['total']