Skip to content

feat: 新增网易云听歌排行页面 - #345

Open
AkiR1n wants to merge 1 commit into
SPlayer-Dev:devfrom
AkiR1n:feat/netease-listening-ranking
Open

AkiR1n wants to merge 1 commit into
SPlayer-Dev:devfrom
AkiR1n:feat/netease-listening-ranking

Conversation

@AkiR1n

@AkiR1n AkiR1n commented Oct 2, 2026 •

Copy link
Copy Markdown

改动类型

  • 新功能(feat)
  • 缺陷修复(fix)
  • 重构 / 优化(不改变对外行为)
  • 文档(docs)
  • 其他(请在「改动说明」中注明)

是否包含破坏性变更

  • 是(请在「改动说明」中详细描述)
  • 否

改动说明

新增「听歌排行」页面(/ranking),读取当前登录用户的网易云听歌排行,提供「最近一周」与「所有时间」两个榜单,可整单播放或追加到播放列表,并在每行显示播放次数。

页面复用 SongList,因此搜索、批量管理、右键菜单、红心等能力与普通歌单一致,只是多一列播放次数;结构对齐既有的 Liked.vue。

主要改动:

  • 新增 src/pages/Ranking.vue(229 行):页面本体。首次进入时并发拉取两个榜单,之后切换 tab 不再请求;用 Promise.allSettled 允许单边失败,只渲染成功的一侧。
  • src/apis/user/netease.ts:新增 fetchPlayRanking(uid, range)。type=1(一周)与 type=0(所有时间)返回的字段名不同(weekData / allData),已在 JSDoc 中注明;曲目转换复用既有的 songToTrack()。
  • src/types/user.ts:新增 PlayRankingRange 与 PlayRankingEntry。
  • src/components/list/SongList.vue:新增 extraHeader / extra 两个 slot(共 +2 行)。没有加 playCounts prop,是为了让列表组件保持通用,列宽与文案由页面自己掌控。
  • electron/main/apis/netease/index.ts:将 user_record 加入 NON_CACHEABLE。该模块在迁移到内置 NCM API 时就已存在,但此前没有任何渲染层调用;它原本会命中 2 分钟响应缓存(core/cache.ts 的 DEFAULT_TTL),导致「刷新排行」在 2 分钟内点了没反应,而播放次数恰好是刷新后想立刻看到变化的场景。
  • 其余为接线:路由、sidebarNav.ts、DEFAULT_SIDEBAR_NAV_GROUPS、cachedViews、PlaybackSourcePage,以及 zh-CN / en-US 双语文案。

注意侧边栏入口需要同时改 sidebarNav.ts 与 DEFAULT_SIDEBAR_NAV_GROUPS,否则 reconcileNavGroups() 会把该 key 从用户已保存的侧边栏配置中静默剔除。

关联 Issue

无。

测试情况

测试环境:

  • Windows 11(MSVC 工具链,6 个原生模块)
  • Linux:Ubuntu 24.04(WSL2,PipeWire + PulseAudio + D-Bus,4 个原生模块)
  • macOS(Apple Silicon)

静态检查在三平台各自独立执行,均通过:

  • pnpm typecheck、pnpm lint、pnpm prettier --check . 全部通过(lint 仅剩 2 条与本次改动无关的既有 warning)
  • pnpm test 通过:35 个 node test + 195 个 vitest,0 失败
  • pnpm build:native 在 Windows 与 Linux 均构建成功;pnpm exec electron-vite build 三端构建成功

运行时验证在三平台均以 --remoteDebuggingPort 挂 CDP 驱动真实窗口完成。为不影响本机既有数据,验证使用隔离 profile,仅复制登录会话:

  • 数据与线上接口逐项对齐:最近一周 84 首、所有时间 100 首;一周榜首 13 次、全时榜首 626 次,与接口 playCount 一致,降序正确。
  • 表头为 # / 标题 / 专辑 / 播放次数 / 操作 / 时长;新增列的右边缘与既有「时长」列几何一致。
  • 播放全部 以该榜单替换当前播放队列:最近一周 → 84 首、所有时间 → 100 首,队首切换为对应榜首。
  • 添加到播放列表 追加到队尾并去重:100 → 179(84 首中 5 首因已在队列中被跳过),符合 insertManyToQueue 的既有语义。
  • 未登录时展示「登录后查看听歌排行」空态,播放全部 置灰。
  • 可见行的专辑封面均正常加载,实测为 300×300 的 CDN 封面,无占位图回退。
  • 控制台无 error / exception。

三平台行为一致。

本 PR 包含 AI 辅助生成的代码,已自行完整测试与审阅,未做未经验证的提交(上述三平台运行时验证即为该过程的一部分)。

截图 / 录屏

macOS(最近一周,深色):

macOS 听歌排行 - 最近一周

Windows 11(所有时间,深色):

Windows 听歌排行 - 所有时间

Ubuntu 24.04(最近一周,浅色):

Linux 听歌排行 - 最近一周

自查清单

  • 本 PR 只包含一个主要功能 / 修复,没有夹带无关改动
  • 已在本地完整测试通过;AI 生成的代码同样自行测试并审阅过,未做未经验证的提交
  • 已运行 pnpm format,并确认 pnpm typecheck、pnpm lint 通过
  • 改动涉及原生模块时已 pnpm build:native 验证;未手写 native/*/index.d.ts
  • 已向 dev 分支提交

Copilot AI balanced review requested due to automatic review settings October 2, 2026 18:08

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants