Skip to content

v0.28.0

Choose a tag to compare

@deltrivx deltrivx released this 29 Sep 04:20
· 7 commits to main since this release

ToneCore v0.28.0

功能性按钮收纳进「更多」菜单(方便以后拓展);删除改为彻底删除(不走回收站)。

变更

1. 功能按钮收纳进「更多」菜单

新增可复用组件 RowActions(apps/web/src/components/RowActions.vue)。

为什么收纳:此前每个功能各占一个按钮(详情 / 删除 / 刮削…),
列表行已经被挤满,再加功能就没地方放了。

收纳后的好处:以后新增功能只需在 rowActions() 里加一项,
不用再改每一处的布局 —— 这正是你说的"方便以后功能性拓展"。

菜单当前包含:查看详情 / 加入队列 / 重新刮削 / 彻底删除。

细节处理:

  • 点击外部、按 Esc、页面滚动时都会关闭 —— 滚动不关的话,
    弹层会脱离原行浮在别处,挡住后面的行
  • 危险项(彻底删除)用红色标注,与常规项区分
  • 「加入队列」是高频操作,仍留在行内,不收进菜单

组件用法:

<RowActions :items="[{ label: '详情', icon: 'info', run: () => {} }]" />

2. 删除改为彻底删除

按你的要求:不走回收站,直接删。

服务端:Library.remove(relPath, hard) 新增 hard 参数

hard 行为
true 直接 unlinkSync 从磁盘删除(不可恢复)
false 移入 <dataDir>/_trash/(保留,默认)

两种模式共用同一套前置校验(目录穿越 / 文件不存在 / 索引清理),
只有最终「怎么处理文件」这一步不同,避免两处逻辑各自漂移。

接口:POST /api/library/delete 接受 hard;前端 libraryDelete(path, hard)。

关于二次确认 —— 我保留了,请看完这段再决定要不要去掉:

彻底删除是不可逆的真删盘操作。一次误点就永久丢失,代价远大于多一次确认。
所以我保留了确认弹窗,文案也写清了后果:

彻底删除「歌名」?

将直接从磁盘删除音频文件(及同名 .lrc),不可恢复。
确定要继续吗?

如果你确实想连确认也不要,告诉我,我去掉。

同步修正文案:详情弹窗按钮由「移入回收站」改为「彻底删除」——
行为变了而文案没变,会让用户以为还能找回。

验证

npm run build     ✅ web + server 均通过
npm test          ✅ 15 项全过

硬删的手工验证方式(未加自动测试)

现有 5 个测试均为纯函数单测(tags / player / queue / cover),
不碰数据库与真实音乐目录;而 remove() 依赖 loadConfig() 与真实 SQLite,
写自动测试会动到你的真实曲库 —— 风险大于收益,所以没加。

需要验证时按这个步骤(用一首无关紧要的测试曲目):

  1. 记下测试曲目的路径与磁盘上的文件
  2. 主页 → 该曲右侧「更多」→ 彻底删除 → 确认
  3. 确认:列表里该曲消失、统计数 -1、磁盘上音频文件确实没有了
  4. /data/_trash/ 下不应出现该文件(这是与旧软删的关键区别)

未改动(仍是待办)

  • 歌词「提前跑完」:v0.26.0 实测过,跑偏的集中在 online 来源
    (在线按歌名匹配,易命中翻唱版,时间轴天然对不上本地文件)。
    修法是按真实时长校验候选、命中率低就回退本地/内嵌来源,需更多样本验证。
  • 锁屏不显示动态歌词:Media Session API 不提供歌词接口,属浏览器能力边界,非 bug。
  • 酷我(kw)在线搜索封面;音源状态显示口径。