diff --git a/src/audio/queue.ts b/src/audio/queue.ts index b97444d..f63980c 100644 --- a/src/audio/queue.ts +++ b/src/audio/queue.ts @@ -161,4 +161,9 @@ export class PlayQueue { getCurrentIndex(): number { return this.currentIndex; } + + /** Number of songs not yet played in Random mode. */ + unplayedCount(): number { + return this.songs.length - this.playedIndices.size; + } } diff --git a/src/bot/instance.ts b/src/bot/instance.ts index 22314b8..8af5c0b 100755 --- a/src/bot/instance.ts +++ b/src/bot/instance.ts @@ -609,7 +609,7 @@ export class BotInstance extends EventEmitter { for (const song of songs) { this.queue.add({ ...song, platform: "netease" }); } - this.queue.setMode(PlayMode.RandomLoop); + this.queue.setMode(PlayMode.Random); this.isFmMode = true; this.player.resetFailures(); @@ -756,12 +756,12 @@ export class BotInstance extends EventEmitter { if (!started) { this.player.stop(); this.profileManager.onSongChange(null).catch(() => {}); - } else if (this.isFmMode && this.queue.size() - this.queue.getCurrentIndex() <= 3) { + } else if (this.isFmMode && this.queue.unplayedCount() <= 3) { // Proactive refill: when queue is running low, fetch more FM songs this.refillFm().catch(err => this.logger.error({ err }, "Proactive FM refill failed")); } } else { - // Defensive: only reached if play mode is changed away from RandomLoop during FM + // Queue exhausted — in FM Random mode, refill and continue if (this.isFmMode) { await this.refillFm(); const refillNext = this.queue.next();