fix(player): 私人 FM 模式下点击下一首按钮可正常切歌

FM 播放列表只保留 1 首,原 _nextPlay 走到"顺序模式 + 最后一首"
分支只弹"列表已播完"提示,仅 audioService end 事件中拉取下一首
FM 的逻辑生效,导致用户手动点击下一首无效(issue #666)。

抽出 _nextFmPlay,_nextPlay 入口检测 isFmPlaying 直接路由到 FM
分支;MusicHook end 事件去掉重复的 FM 处理,统一走 nextPlayOnEnd。
This commit is contained in:
alger
2026-05-10 13:00:55 +08:00
parent d722728ee0
commit ee98eb0266
2 changed files with 52 additions and 37 deletions
+47 -1
View File
@@ -424,8 +424,55 @@ export const usePlaylistStore = defineStore(
}
};
/**
* 私人FM:拉取下一首并播放(FM 列表始终只保留当前一首)
*/
const _nextFmPlay = async () => {
const playerCore = usePlayerCoreStore();
try {
const { getPersonalFM } = await import('@/api/home');
const res = await getPersonalFM();
const songs = res.data?.data;
if (!Array.isArray(songs) || songs.length === 0) {
playerCore.setIsPlay(false);
return;
}
const song = songs[0];
const fmSong = {
id: song.id,
name: song.name,
picUrl: song.al?.picUrl || song.album?.picUrl,
ar: song.artists || song.ar,
al: song.al || song.album,
source: 'netease' as const,
song,
...song,
playLoading: false
} as any;
await setPlayList([fmSong], false, false);
playerCore.isFmPlaying = true;
const { playTrack } = await import('@/services/playbackController');
await playTrack(fmSong, true);
} catch (error) {
console.error('FM切换下一首失败:', error);
playerCore.setIsPlay(false);
}
};
const _nextPlay = async (retryCount: number = 0, autoEnd: boolean = false) => {
try {
const playerCore = usePlayerCoreStore();
// 私人FM模式:忽略 playMode 与列表长度,直接拉取新的 FM 歌曲
if (playerCore.isFmPlaying) {
if (retryCount === 0) {
cancelRetryTimer();
consecutiveFailCount.value = 0;
}
await _nextFmPlay();
return;
}
if (playList.value.length === 0) return;
// User-initiated (retryCount=0): reset state
@@ -434,7 +481,6 @@ export const usePlaylistStore = defineStore(
consecutiveFailCount.value = 0;
}
const playerCore = usePlayerCoreStore();
const sleepTimerStore = useSleepTimerStore();
if (consecutiveFailCount.value >= MAX_CONSECUTIVE_FAILS) {