feat: Clear and manage play_next queue on playlist changes
This commit is contained in:
@@ -576,6 +576,11 @@ class PlayerService:
|
|||||||
current_id,
|
current_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Clear play_next queue when playlist changes
|
||||||
|
if self.state.play_next_queue:
|
||||||
|
logger.info("Clearing play_next queue due to playlist change")
|
||||||
|
self.state.play_next_queue.clear()
|
||||||
|
|
||||||
if self.state.status != PlayerStatus.STOPPED:
|
if self.state.status != PlayerStatus.STOPPED:
|
||||||
await self._stop_playback()
|
await self._stop_playback()
|
||||||
|
|
||||||
@@ -591,6 +596,9 @@ class PlayerService:
|
|||||||
sounds: list[Sound],
|
sounds: list[Sound],
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Handle track checking when playlist ID is the same."""
|
"""Handle track checking when playlist ID is the same."""
|
||||||
|
# Remove tracks from play_next queue that are no longer in the playlist
|
||||||
|
self._clean_play_next_queue(sounds)
|
||||||
|
|
||||||
# Find the current track in the new playlist
|
# Find the current track in the new playlist
|
||||||
new_index = self._find_sound_index(previous_sound_id, sounds)
|
new_index = self._find_sound_index(previous_sound_id, sounds)
|
||||||
|
|
||||||
@@ -648,6 +656,29 @@ class PlayerService:
|
|||||||
return i
|
return i
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def _clean_play_next_queue(self, playlist_sounds: list[Sound]) -> None:
|
||||||
|
"""Remove tracks from play_next queue that are no longer in the playlist."""
|
||||||
|
if not self.state.play_next_queue:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Get IDs of all sounds in the current playlist
|
||||||
|
playlist_sound_ids = {sound.id for sound in playlist_sounds}
|
||||||
|
|
||||||
|
# Filter out tracks that are no longer in the playlist
|
||||||
|
original_length = len(self.state.play_next_queue)
|
||||||
|
self.state.play_next_queue = [
|
||||||
|
sound
|
||||||
|
for sound in self.state.play_next_queue
|
||||||
|
if sound.id in playlist_sound_ids
|
||||||
|
]
|
||||||
|
|
||||||
|
removed_count = original_length - len(self.state.play_next_queue)
|
||||||
|
if removed_count > 0:
|
||||||
|
logger.info(
|
||||||
|
"Removed %s track(s) from play_next queue (no longer in playlist)",
|
||||||
|
removed_count,
|
||||||
|
)
|
||||||
|
|
||||||
def _set_first_track_as_current(self, sounds: list[Sound]) -> None:
|
def _set_first_track_as_current(self, sounds: list[Sound]) -> None:
|
||||||
"""Set the first track as the current track."""
|
"""Set the first track as the current track."""
|
||||||
self.state.current_sound_index = 0
|
self.state.current_sound_index = 0
|
||||||
|
|||||||
@@ -537,6 +537,7 @@ class TestPlayerEndpoints:
|
|||||||
"duration": 30000,
|
"duration": 30000,
|
||||||
"sounds": [],
|
"sounds": [],
|
||||||
},
|
},
|
||||||
|
"play_next_queue": [],
|
||||||
}
|
}
|
||||||
mock_player_service.get_state.return_value = mock_state
|
mock_player_service.get_state.return_value = mock_state
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user