diff --git a/zyrarbot/music/music_player.py b/zyrarbot/music/music_player.py index c37e73f..c612e11 100644 --- a/zyrarbot/music/music_player.py +++ b/zyrarbot/music/music_player.py @@ -177,7 +177,8 @@ class MusicPlayer: # --- Odtwarzanie -------------------------------------------------------- - async def play_next(self, guild_id: int, advance: bool = True) -> None: + async def play_next(self, guild_id: int, advance: bool = True, _failures: int = 0) -> None: + """Przechodzi do kolejnego utworu; ``_failures`` chroni przed pętlą pomijania.""" state = self.state(guild_id) voice_client = self.voice_client(guild_id) if not voice_client: @@ -211,7 +212,7 @@ class MusicPlayer: await self.notify( guild_id, f"⚠️ Nie udało się odtworzyć: {track.title} ({error}). Pomijam." ) - await self.play_next(guild_id, advance=True) + await self._skip_failed(guild_id, _failures + 1) return track.played = True @@ -236,6 +237,18 @@ class MusicPlayer: embed = self._embeds.now_playing(track, position=next_index + 1, total=total) await self.notify(guild_id, embed=embed) + async def _skip_failed(self, guild_id: int, failures: int) -> None: + """Pomija niedziałający utwór, ale zatrzymuje się, gdy zawiodła cała kolejka.""" + state = self.state(guild_id) + if failures >= max(len(state.queue), 1): + state.current = None + await self.trigger_state_change() + await self.notify( + guild_id, "⛔ Nie udało się odtworzyć żadnego utworu z kolejki. Zatrzymuję." + ) + return + await self.play_next(guild_id, advance=True, _failures=failures) + def _next_index(self, state: GuildMusicState, *, advance: bool) -> int: index = state.index if state.index != -1 else 0