Skip to content

Commit

Permalink
Tweak handling of announcements (especially to playergroups)
Browse files Browse the repository at this point in the history
  • Loading branch information
marcelveldt committed Oct 19, 2024
1 parent e8c504f commit 86f44c4
Show file tree
Hide file tree
Showing 14 changed files with 96 additions and 150 deletions.
56 changes: 2 additions & 54 deletions music_assistant/server/controllers/player_queues.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,15 +258,9 @@ def get_active_queue(self, player_id: str) -> PlayerQueue:
@api_command("player_queues/shuffle")
def set_shuffle(self, queue_id: str, shuffle_enabled: bool) -> None:
"""Configure shuffle setting on the the queue."""
# always fetch the underlying player so we can raise early if its not available
queue_player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
queue = self._queues[queue_id]
if queue.shuffle_enabled == shuffle_enabled:
return # no change

queue.shuffle_enabled = shuffle_enabled
queue_items = self._queue_items[queue_id]
cur_index = queue.index_in_buffer or queue.current_index
Expand All @@ -276,7 +270,6 @@ def set_shuffle(self, queue_id: str, shuffle_enabled: bool) -> None:
else:
next_items = []
next_index = 0

if not shuffle_enabled:
# shuffle disabled, try to restore original sort order of the remaining items
next_items.sort(key=lambda x: x.sort_index, reverse=False)
Expand All @@ -298,11 +291,6 @@ def set_dont_stop_the_music(self, queue_id: str, dont_stop_the_music_enabled: bo
@api_command("player_queues/repeat")
def set_repeat(self, queue_id: str, repeat_mode: RepeatMode) -> None:
"""Configure repeat setting on the the queue."""
# always fetch the underlying player so we can raise early if its not available
queue_player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
queue = self._queues[queue_id]
if queue.repeat_mode == repeat_mode:
return # no change
Expand Down Expand Up @@ -559,11 +547,6 @@ def move_item(self, queue_id: str, queue_item_id: str, pos_shift: int = 1) -> No
- pos_shift: move item x positions up if negative value
- pos_shift: move item to top of queue as next item if 0.
"""
# always fetch the underlying player so we can raise early if its not available
queue_player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
queue = self._queues[queue_id]
item_index = self.index_by_id(queue_id, queue_item_id)
if item_index <= queue.index_in_buffer:
Expand All @@ -588,11 +571,6 @@ def move_item(self, queue_id: str, queue_item_id: str, pos_shift: int = 1) -> No
@api_command("player_queues/delete_item")
def delete_item(self, queue_id: str, item_id_or_index: int | str) -> None:
"""Delete item (by id or index) from the queue."""
# always fetch the underlying player so we can raise early if its not available
queue_player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
if isinstance(item_id_or_index, str):
item_index = self.index_by_id(queue_id, item_id_or_index)
else:
Expand All @@ -610,11 +588,6 @@ def delete_item(self, queue_id: str, item_id_or_index: int | str) -> None:
@api_command("player_queues/clear")
def clear(self, queue_id: str) -> None:
"""Clear all items in the queue."""
# always fetch the underlying player so we can raise early if its not available
queue_player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
queue = self._queues[queue_id]
queue.radio_source = []
queue.stream_finished = None
Expand All @@ -634,10 +607,6 @@ async def stop(self, queue_id: str) -> None:
- queue_id: queue_id of the playerqueue to handle the command.
"""
queue_player: Player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
if (queue := self.get(queue_id)) and queue.active:
queue.resume_pos = queue.corrected_elapsed_time
queue.stream_finished = None
Expand All @@ -654,9 +623,6 @@ async def play(self, queue_id: str) -> None:
- queue_id: queue_id of the playerqueue to handle the command.
"""
queue_player: Player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
if (
(queue := self._queues.get(queue_id))
and queue.active
Expand Down Expand Up @@ -697,10 +663,6 @@ async def next(self, queue_id: str) -> None:
- queue_id: queue_id of the queue to handle the command.
"""
queue_player: Player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
if (queue := self.get(queue_id)) is None or not queue.active:
# TODO: forward to underlying player if not active
return
Expand All @@ -722,10 +684,6 @@ async def previous(self, queue_id: str) -> None:
- queue_id: queue_id of the queue to handle the command.
"""
queue_player: Player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
if (queue := self.get(queue_id)) is None or not queue.active:
# TODO: forward to underlying player if not active
return
Expand All @@ -741,10 +699,6 @@ async def skip(self, queue_id: str, seconds: int = 10) -> None:
- queue_id: queue_id of the queue to handle the command.
- seconds: number of seconds to skip in track. Use negative value to skip back.
"""
queue_player: Player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
if (queue := self.get(queue_id)) is None or not queue.active:
# TODO: forward to underlying player if not active
return
Expand All @@ -757,12 +711,9 @@ async def seek(self, queue_id: str, position: int = 10) -> None:
- queue_id: queue_id of the queue to handle the command.
- position: position in seconds to seek to in the current playing item.
"""
queue_player: Player = self.mass.players.get(queue_id, True)
if queue_player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
if not (queue := self.get(queue_id)):
return
queue_player: Player = self.mass.players.get(queue_id, True)
if not queue.current_item:
raise InvalidCommand(f"Queue {queue_player.display_name} has no item(s) loaded.")
if (
Expand Down Expand Up @@ -1409,15 +1360,12 @@ async def _fill_radio_tracks(self, queue_id: str) -> None:

async def _enqueue_next(self, queue: PlayerQueue, current_index: int | str) -> None:
"""Enqueue the next item in the queue."""
if (player := self.mass.players.get(queue.queue_id)) and player.announcement_in_progress:
self.logger.warning("Ignore queue command: An announcement is in progress")
return
if isinstance(current_index, str):
current_index = self.index_by_id(queue.queue_id, current_index)
with suppress(QueueEmpty):
next_item = await self.preload_next_item(queue.queue_id, current_index)
await self.mass.players.enqueue_next_media(
player_id=player.player_id,
player_id=queue.queue_id,
media=self.player_media_from_queue_item(next_item, queue.flow_mode),
)

Expand Down
Loading

0 comments on commit 86f44c4

Please sign in to comment.