Skip to content

fix: 拒绝嵌套扫描目录时误删已入库曲目 - #414

Open
abkkkbb wants to merge 1 commit into
SPlayer-Dev:devfrom
abkkkbb:fix/nested-scan-dir-deletes-tracks
Open

abkkkbb wants to merge 1 commit into
SPlayer-Dev:devfrom
abkkkbb:fix/nested-scan-dir-deletes-tracks

Conversation

@abkkkbb

@abkkkbb abkkkbb commented Oct 25, 2026

Copy link
Copy Markdown
Contributor

改动类型

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

是否包含破坏性变更

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

改动说明

问题

添加与已有扫描目录存在嵌套关系的目录时,曲库中已入库的歌曲会被误删,且本地歌单中对应条目永久丢失(playlist_tracks 关联行被删除,重新扫描只恢复歌曲本身,不恢复歌单成员关系)。

复现步骤:

  1. 添加 C:\Music\Pop 为扫描目录并扫描完成,将其中一首歌加入本地歌单
  2. 再次添加父目录 C:\Music
  3. 弹出「该目录与已添加目录嵌套,已自动跳过」提示
  4. 曲库中 Pop 下所有歌曲消失;重新全量扫描后歌曲恢复,但此前加入歌单的条目不再出现

反向操作(先扫父目录、再添加子目录)同样触发。

原因

  • library:addScanDir(electron/main/ipc/library.ts)先将目录写入 store 再返回成功
  • 渲染层 addScanDir(src/stores/library.ts)拿到成功结果后才做嵌套检测,检测到嵌套后调用 library:removeScanDir 撤销
  • 但 removeScanDir 是「用户主动移除目录」的语义:除移除目录记录外还会通过 deleteTracksByDir() 删除该目录下全部曲目及歌单关联
  • 于是「撤销一次误添加」变成「删除另一目录覆盖下的合法数据」

修复

将嵌套检测前移到主进程写入 store 之前:命中嵌套直接返回新增的 SCAN_DIR_NESTED 错误码,目录不入库,撤销路径整体移除。渲染层只在成功时同步本地列表,UI 提示文案沿用原有「该目录与已添加目录嵌套,已自动跳过」。

removeScanDir 本身未改动:用户主动移除扫描目录时「连同曲目一起清理」的设计行为保持不变。

测试情况

  • 新增 src/stores/library.spec.ts(vitest,2 用例通过):约束「添加扫描目录无论成功或被拒绝,均不触发 removeScanDir」
  • 手动验证(Windows 11,修复前后对照):修复前嵌套提示弹出后曲库清空、重扫后歌单条目缺失;修复后提示弹出,曲库与歌单均不受影响
  • pnpm typecheck(node + web)、pnpm lint 通过,改动文件已过 Prettier
  • 覆盖平台: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.

1 participant