from .endpoints_base import EndpointsBase
from spotify_py_sdk.types import *
[docs]
class QueryRange:
def __init__(self, timestamp: int, type: Literal["before", "after"]):
self.timestamp = timestamp
self.type = type
[docs]
class Player(EndpointsBase):
def __init__(self, api):
super().__init__(api)
[docs]
def get_playback_state(self, market: Optional[MARKET] = None, additional_types: Optional[str] = None):
params = EndpointsBase.params_for({
"market": market,
"additional_types": additional_types
})
return self.get_request(f"me/player{params}")
[docs]
def get_available_devices(self):
return self.get_request(f"me/player/devices")
[docs]
def get_current_playing_track(self, market: Optional[MARKET] = None, additional_types: Optional[str] = None):
params = EndpointsBase.params_for({
"market": market,
"additional_types": additional_types
})
return self.get_request(f"me/player/currently-playing{params}")
[docs]
def get_recently_played_tracks(self, limit: Optional[int] = None, query_range: Optional[QueryRange] = None):
param_obj = {"limit": limit}
if query_range:
if query_range.type == "before":
param_obj["before"] = query_range.timestamp
elif query_range.type == "after":
param_obj["after"] = query_range.timestamp
params = EndpointsBase.params_for(param_obj)
return self.get_request(f"me/player/recently-played{params}")
[docs]
def get_users_queue(self):
return self.get_request("me/player/queue")
[docs]
def transfer_playback(self, device_ids: list[str], play: Optional[bool] = None):
if len(device_ids) > 1:
raise "Although a list is accepted, only a single device_id is currently supported. Supplying more than one will return 400 Bad Request"
self.put_request("me/player", {
"device_ids": device_ids,
"play": play
})
[docs]
def start_resume_playback(self, device_id: str, context_uri: Optional[str] = None, uris: Optional[list[str]] = None, offset: Optional[Any] = None, position_ms: Optional[int] = None):
params = EndpointsBase.params_for({
"device_id": device_id
})
self.put_request(f"me/player/play{params}", {
"context_uri": context_uri,
"uris": uris,
"offset": offset,
"position_ms": position_ms
})
[docs]
def pause_playback(self, device_id: str):
params = EndpointsBase.params_for({
"device_id": device_id
})
self.put_request(f"me/player/pause{params}")
[docs]
def skip_to_next(self, device_id: str):
params = EndpointsBase.params_for({
"device_id": device_id
})
self.post_request(f"me/player/next{params}")
[docs]
def skip_to_previous(self, device_id: str):
params = EndpointsBase.params_for({
"device_id": device_id
})
self.post_request(f"me/player/previous{params}")
[docs]
def seek_to_position(self, position_ms: int, device_id: Optional[str] = None):
params = EndpointsBase.params_for({
"position_ms": position_ms,
"device_id": device_id
})
self.put_request(f"me/player/seek{params}")
[docs]
def set_repeat_mode(self, state: Literal["track", "context", "off"], device_id: Optional[str] = None):
params = EndpointsBase.params_for({
"state": state,
"device_id": device_id
})
self.put_request(f"me/player/repeat{params}")
[docs]
def set_playback_volume(self, volume_percent: int, device_id: Optional[str] = None):
params = EndpointsBase.params_for({
"volume_percent": volume_percent,
"device_id": device_id
})
self.put_request(f"me/player/volume{params}")
[docs]
def toggle_playback_shuffle(self, state: bool, device_id: Optional[str] = None):
params = EndpointsBase.params_for({
"state": state,
"device_id": device_id
})
self.put_request(f"me/player/shuffle{params}")
[docs]
def add_item_to_playback_queue(self, uri: str, device_id: Optional[str] = None):
params = EndpointsBase.params_for({
"uri": uri,
"device_id": device_id
})
self.post_request(f"me/player/queue{params}")