from .endpoints_base import EndpointsBase
from spotify_py_sdk.types import *
[docs]
class RemovePlaylistItemsRequest:
def __init__(self, tracks: list[dict[str]], snapshot_id: Optional[str] = None):
self.tracks = tracks
self.snapshot_id = snapshot_id
[docs]
class UpdatePlaylistItemsRequest:
def __init__(self, uris: Optional[list[str]] = None, range_start: Optional[int] = None, insert_before: Optional[int] = None, range_length: Optional[int] = None, snapshot_id: Optional[str] = None):
self.uris = uris
self.range_start = range_start
self.insert_before = insert_before
self.range_length = range_length
self.snapshot_id = snapshot_id
[docs]
class ChangePlaylistDetailsRequest:
def __init__(self, name: Optional[str] = None, public: Optional[bool] = None, collaborative: Optional[bool] = None, description: Optional[str] = None):
self.name = name
self.public = public
self.collaborative = collaborative
self.description = description
[docs]
class CreatePlaylistRequest:
def __init__(self, name: str, public: Optional[bool] = None, collaborative: Optional[bool] = None, description: Optional[str] = None):
self.name = name
self.public = public
self.collaborative = collaborative
self.description = description
[docs]
class Playlists(EndpointsBase):
def __init__(self, api):
super().__init__(api)
[docs]
def get_playlist(self, playlist_id: str, market: Optional[MARKET] = None, fields: Optional[str] = None, additional_types: Optional[list[QueryAdditionalTypes]] = None):
params = EndpointsBase.params_for({"market": market, "fields": fields, "additional_types": ",".join(additional_types) if additional_types else None})
return self.get_request(f"playlists/{playlist_id}{params}")
[docs]
def get_playlist_items(self, playlist_id: str, market: Optional[MARKET] = None, fields: Optional[str] = None, limit: Optional[int] = None, offset: Optional[int] = None, additional_types: Optional[list[QueryAdditionalTypes]] = None):
params = EndpointsBase.params_for({"market": market, "fields": fields, "limit": limit, "offset": offset, "additional_types": ",".join(
additional_types) if additional_types else None})
return self.get_request(f"playlists/{playlist_id}/tracks{params}")
[docs]
def change_playlist_details(self, playlist_id: str, request: ChangePlaylistDetailsRequest):
self.put_request(f"playlists/{playlist_id}", request)
[docs]
def move_playlist_items(self, playlist_id: str, range_start: int, range_length: int, move_to_position: int):
return self.update_playlist_items(playlist_id, UpdatePlaylistItemsRequest(range_start, move_to_position, range_length))
[docs]
def update_playlist_items(self, playlist_id: str, request: UpdatePlaylistItemsRequest):
return self.put_request(f"playlists/{playlist_id}/tracks", request)
[docs]
def add_items_to_playlist(self, playlist_id: str, uris: Optional[list[str]] = None, position: Optional[int] = None):
self.post_request(f"playlists/{playlist_id}/tracks", {
"position": position,
"uris": uris
})
[docs]
def remove_items_from_playlist(self, playlist_id: str, request: RemovePlaylistItemsRequest):
self.delete_request(f"playlists/{playlist_id}/tracks", request)
[docs]
def get_users_playlists(self, user_id: str, limit: Optional[int] = None, offset: Optional[int] = None):
params = EndpointsBase.params_for({"limit": limit, "offset": offset})
return self.get_request(f"users/{user_id}/playlists{params}")
[docs]
def create_playlist(self, user_id: str, request: CreatePlaylistRequest):
return self.post_request(f"users/{user_id}/playlists", request)
[docs]
def get_playlist_cover_image(self, playlist_id: str):
return self.get_request(f"playlists/{playlist_id}/images")
# TODO
# def add_custom_playlist_cover_image(self, playlist_id: str, image_data: Union[str]):
[docs]
def add_custom_playlist_cover_image_from_base64_string(self, playlist_id: str, base64_encoded_jpeg: str):
self.put_request(f"playlists/{playlist_id}/images", base64_encoded_jpeg, "image/jpeg")