fix: auto-play next song — set ffmpeg=null on close, handle async playNext

Two bugs prevented auto-advance:
1. FFmpeg close handler was empty — ChildProcess object persisted after
   close, so frame loop check `!this.ffmpeg` never triggered trackEnd
2. playNext() is async (resolves URL) but trackEnd handler didn't catch
   rejected promises, causing silent failures

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
saopig1andClaude Opus 4.6 committed 2026-03-30 14:14:56 +08:00
1 parent 5c4c7051d7
commit 4c71a0a37f
2 files changed
+7 -3

No files matched your search

+1 -1
View File
@@ -79,7 +79,7 @@ export class AudioPlayer extends EventEmitter {
});
this.ffmpeg.on("close", () => {
// Let frame loop drain remaining buffer
this.ffmpeg = null; // Signal frame loop that no more data is coming
});
this.ffmpeg.on("error", (err) => {
+6 -2
View File
@@ -80,12 +80,16 @@ export class BotInstance extends EventEmitter {
this.player.on("trackEnd", () => {
this.logger.debug("Track ended, advancing queue");
this.playNext();
this.playNext().catch((err) => {
this.logger.error({ err }, "playNext failed after trackEnd");
});
});
this.player.on("error", (err: Error) => {
this.logger.error({ err }, "Player error");
this.playNext();
this.playNext().catch((err2) => {
this.logger.error({ err: err2 }, "playNext failed after player error");
});
});
}