diff --git a/app/services/player.py b/app/services/player.py index f395cba..ec2ad06 100644 --- a/app/services/player.py +++ b/app/services/player.py @@ -65,6 +65,7 @@ class PlayerState: self.playlist_duration: int = 0 self.playlist_sounds: list[Sound] = [] self.play_next_queue: list[Sound] = [] + self.playlist_index_before_play_next: int | None = None def to_dict(self) -> dict[str, Any]: """Convert player state to dictionary for serialization.""" @@ -353,6 +354,26 @@ class PlayerService: await self._play_next_from_queue() return + # If currently playing from play_next queue (no index but have stored index) + if ( + self.state.current_sound_index is None + and self.state.playlist_index_before_play_next is not None + and self.state.playlist_sounds + ): + # Skipped the last play_next track, go to next in playlist + restored_index = self.state.playlist_index_before_play_next + next_index = self._get_next_index(restored_index) + + # Clear the stored index + self.state.playlist_index_before_play_next = None + + if next_index is not None: + await self.play(next_index) + else: + await self._stop_playback() + await self._broadcast_state() + return + if not self.state.playlist_sounds: return @@ -467,6 +488,20 @@ class PlayerService: if not self.state.play_next_queue: return + # Store current playlist index before switching to play_next track + # Only store if we're currently playing from the playlist + if ( + self.state.current_sound_index is not None + and self.state.playlist_index_before_play_next is None + ): + self.state.playlist_index_before_play_next = ( + self.state.current_sound_index + ) + logger.info( + "Stored playlist index %s before playing from play_next queue", + self.state.playlist_index_before_play_next, + ) + # Get the first sound from the queue next_sound = self.state.play_next_queue.pop(0) @@ -581,6 +616,11 @@ class PlayerService: logger.info("Clearing play_next queue due to playlist change") self.state.play_next_queue.clear() + # Clear stored playlist index + if self.state.playlist_index_before_play_next is not None: + logger.info("Clearing stored playlist index due to playlist change") + self.state.playlist_index_before_play_next = None + if self.state.status != PlayerStatus.STOPPED: await self._stop_playback() @@ -881,9 +921,29 @@ class PlayerService: else: await self._stop_playback() await self._broadcast_state() - elif self.state.playlist_sounds: - # Current track was from play_next, go to playlist - await self.play(0) + elif ( + self.state.playlist_sounds + and self.state.playlist_index_before_play_next is not None + ): + # Current track was from play_next queue, restore to next track in playlist + restored_index = self.state.playlist_index_before_play_next + logger.info( + "Play next queue finished, continuing from playlist index %s", + restored_index, + ) + + # Get the next index based on the stored position + next_index = self._get_next_index(restored_index) + + # Clear the stored index since we're done with play_next queue + self.state.playlist_index_before_play_next = None + + if next_index is not None: + await self.play(next_index) + else: + # No next track (end of playlist in non-loop mode) + await self._stop_playback() + await self._broadcast_state() else: await self._stop_playback() await self._broadcast_state()