Skip to content

酷狗歌单超过 300 首时仅显示前 300 首,其余歌曲丢失 #247

Closed

Description

@elaina-agi

检查清单

  • 我已检索仓库中所有的 Issues,确保我没有重复提交问题;或有相似 Issue,但我觉得我的情况不包含在那个相似 Issue 之内
  • 我已经找到了可以复现这个问题的方法,并且写在了下面的「具体信息」中
  • 此问题可以在我的设备和当前环境中稳定复现
  • 此问题可以在最新版本 (Latest Release) 中复现
  • 此问题是在我更新到当前版本后才出现的

当前系统环境

Windows 11

当前版本

v1.2.0-alpha.1

具体信息


问题描述

酷狗歌单歌曲数超过 300 时,SPlayer-Next 只显示前 300 首,其余歌曲静默丢失,且界面无任何截断提示。

复现步骤

  1. 切换音源到「酷狗」,在「歌单」tab 搜索“抖音”
  2. 打开歌单《抖音歌曲最火的歌2026:热门音乐》(共 832+ 首):https://www.kugou.com/songlist/8540649/
  3. 查看曲目列表总数

实际行为:列表只显示 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

  1. github-actions commented on Sep 7, 2026

    @github-actions

    👋 @abkkkbb

    感谢提交 Issue!我们已经收到您的反馈,会尽快确认您的问题。

    Thanks for opening this issue! We have received your report and will review it as soon as possible.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions