Repository navigation
Description
检查清单
- 我已检索仓库中所有的 Issues,确保我没有重复提交问题;或有相似 Issue,但我觉得我的情况不包含在那个相似 Issue 之内
- 我已经找到了可以复现这个问题的方法,并且写在了下面的「具体信息」中
- 此问题可以在我的设备和当前环境中稳定复现
- 此问题可以在最新版本 (Latest Release) 中复现
- 此问题是在我更新到当前版本后才出现的
当前系统环境
Windows 11
当前版本
v1.2.0-alpha.1
具体信息
问题描述
酷狗歌单歌曲数超过 300 时,SPlayer-Next 只显示前 300 首,其余歌曲静默丢失,且界面无任何截断提示。
复现步骤
- 切换音源到「酷狗」,在「歌单」tab 搜索“抖音”
- 打开歌单《抖音歌曲最火的歌2026:热门音乐》(共 832+ 首):https://www.kugou.com/songlist/8540649/
- 查看曲目列表总数
实际行为:列表只显示 300 首,第 301 首起完全不存在、无法播放
预期行为:显示歌单全量歌曲(与酷狗官方页面一致)
补充对照:同一歌单在酷狗官方网页版可正常显示全部歌曲,说明服务端数据是完整的,问题在客户端拉取侧。
原因分析
electron/main/apis/kugou/modules/playlist.ts 中歌单歌曲接口只请求了单页:
// 修复前:page=1 写死,pagesize=300,拿完第一页就收工
kgRequest(.../special/song?specialid=${id}&page=1&pagesize=300&format=json)
而酷狗 special/song 接口本身支持分页(实测 page=2、page=3 均可正常返回数据,832 首 = 300+300+232)。同文件 album.ts 的 mobilecdn 通道(album/song)与网关通道(/v1/album_audio/lite)存在同款单页截断。
另外接口实测单请求耗时可达 15s+,默认 8s 超时对大歌单偏紧,翻页时建议放宽。
修复思路
先取第一页拿 total,再并发补拉剩余页拼接:
// 新增 electron/main/apis/kugou/core/pagination.ts
export const fetchAllPages = async (
requestPage: (page: number) => Promise<PagedResponse>,
): Promise<T[]> => {
const first = await requestPage(1);
const firstItems = first.data?.info ?? [];
const total = Math.min(first.data?.total ?? firstItems.length, MAX_SONGS);
const restCount = total - firstItems.length;
if (restCount <= 0) return firstItems;
const pages = Math.ceil(restCount / SONG_PAGESIZE);
const rest = await Promise.all(
Array.from({ length: pages }, (_, i) => requestPage(i + 2).catch(() => ({ data: {} }))),
);
return [...firstItems, ...rest.flatMap((r) => r.data?.info ?? [])].slice(0, total);
};
设计要点:
- pagesize 保持 300 不变,只补翻页逻辑,改动最小
- 剩余页并发拉取(Promise.all),大歌单总耗时 ≈ 两次往返
- 单页失败容错(catch 返回空页),个别页超时不影响整体
- MAX_SONGS = 5000 上限防御异常 total,最后 slice(0, total) 保证精确封顶
- 无 total 时不盲翻,按第一页数量收工
- 返回的 total 改为实际取回的 songs.length,界面数字与真实数据始终一致
三处调用点(playlist.ts 歌单、album.ts mobilecdn 专辑、album.ts 网关专辑)统一改走 fetchAllPages。
验证
- 单元测试 electron/main/apis/kugou/core/pagination.test.ts 覆盖 7 个场景:不足一页不翻页、多页拼接顺序、整页数翻页、单页失败容错、第一页失败抛错、异常 total 封顶、无 total 不盲翻
- 真实接口回归:歌单 8540649 声称 832 首时实际取回 832 首,第 301 首(接口第二页首条)在列表中可搜索到
- 实机验证:打开该歌单显示“共 833 首”,与酷狗服务端实时数据一致(歌单在验证期间被创建者加歌,恰好证明 total 与实际取回数始终同步)
Activity
github-actions commentedon Sep 7, 2026
👋 @abkkkbb
感谢提交 Issue!我们已经收到您的反馈,会尽快确认您的问题。
Thanks for opening this issue! We have received your report and will review it as soon as possible.
docs: ROADMAP 路线 A 核实更新(SPlayer-Dev#247 桌面专属 N/A、SPlayer-Dev#149/SPla…
docs: ROADMAP 路线 A 核实更新(SPlayer-Dev#247 桌面专属 N/A、SPlayer-Dev#149/SPla…