Skip to content

feat: 本地歌词库支持多目录与多格式匹配 - #362

Open
OMSociety wants to merge 5 commits into
SPlayer-Dev:devfrom
OMSociety:feat/local-lyric-library
Open

OMSociety wants to merge 5 commits into
SPlayer-Dev:devfrom
OMSociety:feat/local-lyric-library

Conversation

@OMSociety

@OMSociety OMSociety commented Oct 10, 2026 •

Copy link
Copy Markdown

改动类型

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

是否包含破坏性变更

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

改动说明

把「本地 TTML 歌词库」扩展为通用「本地歌词库」:

  • 多目录:localLyric.repoDir(单个目录)改为 localLyric.repoDirs(目录列表),设置页可添加 / 移除多个目录,每个目录都会递归扫描,靠前的目录优先。
  • 多格式:除 .ttml 外支持 .lrc、.lys、.ass、.srt;同一首歌命中多个文件时按全局歌词格式优先级取值。
  • 按文件名中的歌曲 ID 匹配:文件命名为 歌曲ID.后缀名 或 任意前缀.歌曲ID.后缀名 即可命中,与旧版 SPlayer 的命名规则一致。
  • 元信息匹配保留并扩充:TTML 继续读 <amll:meta>(musicName / artists / ncmMusicId / qqMusicId),LRC / LyS 额外读 [ti:] / [ar:] 参与标题匹配;原有「标题 + 艺术家软性区分」与「匹配缓存 id 回查」流程不变。
  • 仍然优先于在线歌词:加载顺序未改动,本地命中依旧以最高优先级提交;设置项开关同步改名为「启用本地歌词库」(enableLocalLyricOverride)。
  • 老配置自动迁移:主进程 store 增加 version 1 迁移,原 repoDir 并入 repoDirs、enableLocalTTMLOverride 值搬到新键,升级后已有设置不丢。
  • 配套改动:IPC 通道 lyrics:matchLocalTTML → lyrics:matchLocalLyric(仍返回文件原文,渲染层用 detectFormat 判断实际格式,不再硬编码 ttml);设置页组件改为多目录管理;中英文案与文档同步更新。
  • 说明:本 PR 占用 store 迁移 version 1(electron/main/store/migrations.ts)。

关联 Issue

Closes #357

测试情况

自动化:

  • 新增 electron/main/services/localLyricRepo.spec.ts(vitest,12 例):按文件名 ID 命中(含子目录)、同 ID 多格式取格式优先级最高者、LRC [ti:] / [ar:] 标题匹配、TTML AMLL 元信息匹配(含多个 ncmMusicId 全部入索引)、多目录靠前者优先、QQ songmid 不参与文件名匹配而数字 songId 参与、开关关闭时不读盘、根目录与子目录新增文件后重建索引、构建途中更换目录集合、匹配缓存 id 回查。
  • 新增 electron/main/store/migrations.spec.ts(vitest,2 例):单目录与旧开关迁移到新键、未设置目录时不产生脏数据。
  • pnpm format、pnpm typecheck、pnpm lint、pnpm test(63 个文件 / 489 例)全部通过。

手动(Windows 11,pnpm build 产出的打包版,独立 user-data 目录,未触碰既有安装版配置):

  • 以旧版本配置(localLyric.repoDir 单目录 + enableLocalTTMLOverride)首启,落盘后的 settings.json 变为 repoDirs: [...] 与 enableLocalLyricOverride: true,旧键已清除,__configVersion 为 1。
  • 配置两个歌词库目录后,在渲染进程直接调用 window.api.lyrics.matchLocalLyric(...):
    • id: 314572 → 命中目录 A 的 314572.ttml(AMLL 元信息);
    • title: 测试歌曲 → 命中同名条目并按格式优先级取 .ttml;
    • id: 88(同 ID 同时有 .lrc 与 .srt)→ 取 .lrc;
    • id: 999(只存在于目录 B)→ 命中目录 B 的文件;
    • 库中不存在的歌曲 → data: null。
  • 设置页与多目录管理弹窗显示正常(见截图)。
  • 播放实测(QQ 音乐源《晴天》/ 周杰伦,同一首歌、同一次会话内切换开关):关闭开关时歌词来源为在线 QRC;打开后同一首歌的来源变为本地 LRC,播放页显示的就是本地 97773.lrc 的内容(对照见下方截图)。

截图 / 录屏

设置页「歌词设置 → 启用本地歌词库 / 歌词库目录」与多目录管理弹窗(Windows 11 打包版实测):

本地歌词库设置

歌词库目录管理

同一首歌的本地歌词生效对照(播放页,格式标记随来源变化):

关闭时的在线歌词

开启后的本地歌词

自查清单

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

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.

希望恢复旧项目 SPlayer 指定本地歌词文件夹的功能:支持本地 LRC 等多格式的歌词库并优先覆盖在线歌词

1 participant