From 4c71a0a37ff4f49337139feed577fe998857de32 Mon Sep 17 00:00:00 2001 From: saopig1 Date: Mon, 30 Mar 2026 14:14:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20auto-play=20next=20song=20=E2=80=94=20se?= =?UTF-8?q?t=20ffmpeg=3Dnull=20on=20close,=20handle=20async=20playNext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- src/audio/player.ts | 2 +- src/bot/instance.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/audio/player.ts b/src/audio/player.ts index b641875..c3dbf5c 100644 --- a/src/audio/player.ts +++ b/src/audio/player.ts @@ -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) => { diff --git a/src/bot/instance.ts b/src/bot/instance.ts index 5529d30..1b902d4 100644 --- a/src/bot/instance.ts +++ b/src/bot/instance.ts @@ -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"); + }); }); }