return await self.async_cmd_power_off(player_id)
return await self.async_cmd_power_on(player_id)
- @api_route("players/:player_id/cmd/volume_set/:volume_level")
+ @api_route("players/:player_id/cmd/volume_set/:volume_level?")
async def async_cmd_volume_set(self, player_id: str, volume_level: int) -> None:
"""
Send volume level command to given player.
# TODO: handle mute on volumecontrol?
return await player_state.player.async_cmd_volume_mute(is_muted)
- @api_route("players/:queue_id/queue/cmd/shuffle_enabled/:enable_shuffle")
+ @api_route("players/:queue_id/queue/cmd/shuffle_enabled/:enable_shuffle?")
async def async_player_queue_cmd_set_shuffle(
self, queue_id: str, enable_shuffle: bool = False
):
return
return await player_queue.async_set_shuffle_enabled(enable_shuffle)
- @api_route("players/:queue_id/queue/cmd/repeat_enabled/:enable_repeat")
+ @api_route("players/:queue_id/queue/cmd/repeat_enabled/:enable_repeat?")
async def async_player_queue_cmd_set_repeat(
self, queue_id: str, enable_repeat: bool = False
):
return
return await player_queue.async_set_repeat_enabled(enable_repeat)
+ @api_route("players/:queue_id/queue/cmd/next")
+ async def async_player_queue_cmd_next(self, queue_id: str):
+ """
+ Send next track command to given playerqueue.
+
+ :param queue_id: player_id of the playerqueue to handle the command.
+ """
+ player_queue = self.get_player_queue(queue_id)
+ if not player_queue:
+ return
+ return await player_queue.async_next()
+
+ @api_route("players/:queue_id/queue/cmd/previous")
+ async def async_player_queue_cmd_previous(self, queue_id: str):
+ """
+ Send previous track command to given playerqueue.
+
+ :param queue_id: player_id of the playerqueue to handle the command.
+ """
+ player_queue = self.get_player_queue(queue_id)
+ if not player_queue:
+ return
+ return await player_queue.async_previous()
+
+ @api_route("players/:queue_id/queue/cmd/move/:queue_item_id?/:pos_shift?")
+ async def async_player_queue_cmd_move_item(
+ self, queue_id: str, queue_item_id: str, pos_shift: int = 1
+ ):
+ """
+ Move queue item x up/down the queue.
+
+ param pos_shift: move item x positions down if positive value
+ move item x positions up if negative value
+ move item to top of queue as next item if 0
+ """
+ player_queue = self.get_player_queue(queue_id)
+ if not player_queue:
+ return
+ return await player_queue.async_move_item(queue_item_id, pos_shift)
+
+ @api_route("players/:queue_id/queue/cmd/play_index/:index?")
+ async def async_play_index(self, queue_id: str, index: Union[int, str]) -> None:
+ """Play item at index (or item_id) X in queue."""
+ player_queue = self.get_player_queue(queue_id)
+ if not player_queue:
+ return
+ return await player_queue.async_play_index(index)
+
@api_route("players/:queue_id/queue/cmd/clear")
async def async_player_queue_cmd_clear(
self, queue_id: str, enable_repeat: bool = False
items = played_items + [self.cur_item] + next_items
self.mass.add_job(self.async_update(items))
self.mass.add_job(self.async_update_state())
+ self.mass.signal_event(EVENT_QUEUE_UPDATED, self.to_dict())
@property
def repeat_enabled(self) -> bool:
self._repeat_enabled = enable_repeat
self.mass.add_job(self.async_update_state())
self.mass.add_job(self.__async_save_state())
+ self.mass.signal_event(EVENT_QUEUE_UPDATED, self.to_dict())
@property
def cur_index(self) -> OptionalInt:
"resume queue requested for %s but queue is empty", self.queue_id
)
- async def async_play_index(self, index: int) -> None:
- """Play item at index X in queue."""
+ async def async_play_index(self, index: Union[int, str]) -> None:
+ """Play item at index (or item_id) X in queue."""
if not isinstance(index, int):
index = self.__index_by_id(index)
if not len(self.items) > index:
param pos_shift: move item x positions down if positive value
move item x positions up if negative value
- move item to top of queue as next item
+ move item to top of queue as next item if 0
"""
items = self.items.copy()
item_index = self.__index_by_id(queue_item_id)
"cmd_queue_update not supported by player, fallback to cmd_queue_load "
)
self._items = self._items[self.cur_index :]
- return await self.player.async_cmd_queue_load(self._items)
+ await self.player.async_cmd_queue_load(self._items)
self.mass.signal_event(EVENT_QUEUE_ITEMS_UPDATED, self.to_dict())
self.mass.add_job(self.__async_save_state())