feat: 添加 CUE 文件支持#72
Conversation
There was a problem hiding this comment.
Pull request overview
该 PR 在 SPlayer-Next 的本地曲库链路中引入 CUE 分轨支持:扫描阶段收集并解析 .cue 生成虚拟分轨(cue://),曲库展示时隐藏被引用的容器整轨;播放链路通过主进程对时间轴做“展示时间/引擎绝对时间”转换,并在渲染端基于分轨时长触发“结束结算/切歌”,从而让进度、跳转等行为对分轨成立。
Changes:
- 扫描链路:Rust 扫描遍历时额外收集 CUE 文件路径,主进程收尾阶段解析并 upsert 虚拟分轨,同时清理过期分轨。
- 播放链路:主进程按 CUE 分轨范围映射 position/duration,并在 seek/load 时做绝对时间换算;渲染端在分轨末尾触发结束逻辑。
- UI/交互:文件树、播放源解析、右键菜单、标签编辑等对 CUE 虚拟分轨做兼容与限制(如禁止对分轨进行“编辑标签/删除文件”)。
Reviewed changes
Copilot reviewed 16 out of 17 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| src/utils/folderTree.ts | CUE 分轨按真实容器音频路径归入磁盘目录树 |
| src/services/audioSource.ts | 本地播放源解析优先使用 cueAudioPath |
| src/core/player/events.ts | 抽出结束结算逻辑,并在 CUE 分轨末尾用 position 事件触发 |
| src/composables/useTrackMenu.ts | CUE 分轨禁用标签编辑/删文件,且“在资源管理器中显示/复制路径”指向容器路径 |
| src/components/modals/TagEditorDialog.vue | 标签编辑对 CUE 分轨禁用加载,并显示容器文件名 |
| shared/types/player.ts | Track 新增 CUE 相关字段(path/范围/容器路径) |
| native/audio-engine/src/scanner.rs | 遍历时收集 .cue 文件路径并随 done 事件上报 |
| native/audio-engine/src/lib.rs | 扫描 done 事件对外暴露 cueFiles |
| native/audio-engine/index.d.ts | 同步更新扫描事件类型声明(cueFiles) |
| electron/main/services/scanner.ts | 扫描收尾阶段解析 CUE 并同步虚拟分轨到数据库 |
| electron/main/services/cue.ts | 新增 CUE 解析与虚拟路径生成逻辑 |
| electron/main/services/cue.test.ts | 覆盖单文件 CUE 解析与虚拟路径生成的单元测试 |
| electron/main/ipc/player.ts | 加入 CUE 分轨时间轴映射与 seek/load 范围处理 |
| electron/main/ipc/library.ts | 获取曲目时隐藏被 CUE 引用的容器整轨 |
| electron/main/database/queries.ts | 增加 CUE 字段映射与多处查询对容器整轨的排除逻辑 |
| electron/main/database/migration.ts | schema v4:新增 cue_* 列迁移 |
| electron/main/database/index.ts | tracks 表新增 cue_* 列并导出新查询方法 |
| } catch (error) { | ||
| libraryLog.warn(`解析 CUE 失败 [${cuePath}]:`, error); | ||
| } | ||
| } | ||
|
|
||
| if (upserts.length > 0) upsertTracks(upserts); | ||
| const stalePaths = getCueTrackPathsByDirs(dirs).filter((trackPath) => !nextPaths.has(trackPath)); | ||
| if (stalePaths.length > 0) deleteTracksByPaths(stalePaths); | ||
| return nextPaths.size; |
| const stalePaths = getCueTrackPathsByDirs(dirs).filter((trackPath) => { | ||
| if (nextPaths.has(trackPath)) return false; | ||
| // 不可达目录下的分轨不删除 | ||
| return !unavailableDirs.some((dir) => trackPath.startsWith(dir)); | ||
| }); |
- 添加 extractCuePath 函数从虚拟路径提取真实 cuePath - 使用真实 cuePath 做目录前缀判断,而非虚拟路径 - 确保 NAS/移动盘等不可达目录下的 CUE 分轨不被误删
|
@copilot 请重新审查最新提交,已修复不可达目录下 CUE 分轨误删的问题:\n1. 添加了 extractCuePath 函数从虚拟路径提取真实 cuePath\n2. 使用真实 cuePath 做目录前缀判断,确保 NAS/移动盘等不可达目录下的 CUE 分轨不被误删 |
已审查最新提交,逻辑正确: 顺手修了一个小问题:原正则 |
改动类型
是否包含破坏性变更
改动说明
添加 CUE 文件支持,包括:
cue://协议),支持在曲库中显示独立分轨主要变更:
electron/main/services/cue.ts:CUE 文件解析和虚拟路径生成electron/main/services/scanner.ts:集成 CUE 文件扫描和分轨同步electron/main/ipc/player.ts:支持 CUE 分轨的播放范围控制cue_path、cue_audio_path、cue_start_ms、cue_end_ms)关联 Issue
无
测试情况
手动测试:
截图 / 录屏
无 UI 改动
自查清单
pnpm format,并确认pnpm typecheck、pnpm lint通过pnpm build:native验证;未手写native/*/index.d.tsdev分支提交