Skip to content

Releases: emoeem/voicefox

voicefox v0.3.10

Choose a tag to compare

@github-actions github-actions released this 13 Sep 02:52

Full Changelog: v0.3.9...v0.3.10

v0.3.9

Choose a tag to compare

@emoeem emoeem released this 10 Sep 05:03

完善了歌手的介绍界面,同时加了一个按键展示界面,默认是反斜杠

v0.3.8

Choose a tag to compare

@emoeem emoeem released this 03 Sep 05:37

更新日志

✨ 新功能

🎨 歌手 / 专辑详情页

  • 激活 details.rs 中原本未接入主流程的详情页实现。

  • 新增 AppAction::ShowArtistDetails / ShowAlbumDetails

  • 歌曲右键菜单新增:

    • 查看歌手
    • 查看专辑
  • 详情页以全屏浮层形式接入主循环。

  • 完善详情页的键盘、鼠标事件路由与渲染流程。

  • core 键位表新增 Details 页默认快捷键。

  • 歌手详情页中选中专辑后支持按 Enter 继续下钻到专辑详情。

🐛 歌词获取与网络错误修复

歌词网络错误不再被误判为空歌词

修复酷狗 / JavaScript 音源获取歌词失败时被错误吞掉的问题。

现在:

  • 网络错误、HTTP 错误等异常会继续向上传播
  • 只有音源明确确认「没有歌词」时,才会被视为无歌词。
  • get_lyric_with_fallback 重新设计 fallback 逻辑。
  • 只有所有音源都确认无歌词时,才写入 10 分钟负缓存
  • 网络类错误不会再污染负缓存。

负缓存管理

  • 新增负缓存 TTL 清理。
  • 增加 1024 条容量上限
  • 修复负缓存可能无限增长的问题。

URL / HTTP 错误处理

  • 修复 kw/js URL 处理中的 UTF-8 切片 panic。
  • URL 截断改为按字符处理,不再直接按字节切割字符串。
  • 2xx HTTP 响应不再错误映射为 NotFound
  • 改为明确的 Network 错误,避免被换源逻辑误判为「版权缺失」。

🛡️ 稳定性提升

锁毒化级联修复

批量修复约 338 处

.lock().unwrap()
.read().unwrap()
.write().unwrap()

统一改为在锁毒化情况下恢复底层数据:

.unwrap_or_else(|e| e.into_inner())

这样即使某个持锁代码发生 panic,也不会因为 PoisonError 继续触发连锁崩溃,大幅提升 TUI 的异常恢复能力。

MPRIS 韧性

  • MPRIS 更新循环中的单次 zbus 错误现在只记录日志,不再永久退出更新循环。
  • 修复桌面媒体控件可能因一次 D-Bus 错误而永久冻结的问题。
  • 单首队列循环播放时,can_go_next / can_go_previous 现在正确返回 true

⏱️ 播放与网络超时

新增明确的外层超时限制:

  • 获取歌曲播放地址:30 秒
  • 获取歌词:20 秒
  • HTTP 连接建立:8 秒
  • HTTP 连接池增加 pool_idle_timeout
  • 新增 get_with_retry
  • 对连接错误、超时等临时性网络错误进行指数退避重试。
  • 酷我播放地址请求接入新的重试机制。

同时修复 JavaScript 音源串行 fallback 在异常情况下等待时间无限放大的问题。

💾 配置与数据安全

配置写盘防抖

音量、播放速度、左右平衡等高频修改现在采用:

修改 → 标记脏数据 → 2 秒防抖 → 主循环统一写盘

避免拖动滑块等操作产生大量磁盘写入。

设置页中需要即时生效的开关仍保持即时保存。

导入事务性

重构 persist_backup

  • 先完整写入临时文件。
  • 所有文件准备完成后再统一 rename
  • 磁盘空间不足或中途写入失败时,不再留下半完成的导入状态。
  • Windows 平台采用「先移动旧文件,再替换」策略。

配置保存

  • Windows 配置保存移除「先删除再修改」的危险窗口。
  • save_file 序列化失败时不再错误增加数据代次。

🚀 性能与资源管理

封面缓存

  • 改为基于访问时间的 LRU 淘汰策略。
  • 缓存容量限制为 512 个封面
  • 避免封面缓存无界增长。

搜索

  • 搜索防抖切页后继续计时,不再因为切换页面导致搜索任务丢失。
  • 搜索追加结果的去重从 O(n²) 优化为 O(n),使用 HashSet 加速。

队列播放

  • 队列为空时执行「下一首播放」或「加入队尾」,现在会直接开始播放。
  • 修复此前操作静默进入队列、但没有实际开始播放的问题。

🎵 播放 / 歌词显示修复

进度条点击

修复进度条渲染区域与鼠标命中区域存在 3 列错位的问题。

现在渲染和点击命中统一使用 13 列标签宽度计算。

⚠️ 行为变化:
进度条相关测试的点击坐标断言已经从旧的错误几何调整为真实渲染中的位置(列 60 / 103)。

如果外部代码或测试依赖旧的点击坐标,需要同步调整。

YRC / QRC

  • 修复逐字时间戳计算中的舍入误差。
  • 时间戳不再错误叠加整行偏移。
  • 改为钳制到对应行首,避免歌词逐字高亮出现累计漂移。

🧭 TUI 交互修复

诊断浮层

  • 本地库诊断浮层的 Esc / i 操作提升至主循环层级处理。
  • 浮层打开期间独占键盘输入。
  • 修复切页后诊断浮层按键状态残留的问题。

设置页

  • 移除已经失效的 j 刷新键。
  • 补上正确的 z 刷新键。
  • enabled_source_index 增加取模保护,避免音源索引越界。

🧹 代码质量

  • 清理全部 TODO: Phase X 残留注释。
  • 清零 Clippy 警告。
  • 使用 clippy --fix 自动修复可安全修复的问题。
  • 清理详情页死代码并正式接入主应用流程。
  • 对锁、网络请求、缓存、配置持久化等基础设施进行了统一的错误处理规范化。

📌 本次更新重点

这次更新主要集中在 「详情页接入 + 网络错误处理 + TUI 稳定性 + 数据持久化安全」 四个方向:

  • 🎨 新增歌手 / 专辑详情页及下钻流程
  • 🎵 歌词 fallback 不再吞掉网络错误
  • 🛡️ 大规模修复锁毒化导致的级联崩溃
  • 🌐 完善 HTTP 超时、重试与错误分类
  • 💾 配置保存与导入改为更加安全的事务式处理
  • 🚀 优化搜索去重、封面缓存和高频配置写盘
  • 🖱️ 修复进度条鼠标命中区域错位
  • 🧹 Clippy 警告清零,清理遗留 TODO

总体而言,本版本不仅增加了详情页功能,也对播放、歌词、网络、缓存、配置持久化以及 TUI 事件系统进行了较大规模的稳定性重构。

v0.3.7

Choose a tag to compare

@emoeem emoeem released this 29 Aug 01:58
fe97d5a

② 数据安全(638aabe):

收藏/历史/歌单 JSON 解析失败时,坏文件改名为 *.corrupt-<时间戳> 保留现场并记录 error 日志,不再被空数据覆盖;
save_atomic 写完 fsync 再 rename(unix 上连父目录一起刷);Windows 分支改为“先挪旧文件、失败回滚”,消除目标文件短暂不存在的窗口;
播放会话这类可再生数据走免 fsync 的分级写入,5 秒一次的持久化不再刷盘。
③ 过滤下标统一(73959ab):本地音乐页新建 LocalSongView 下标视图,键盘/鼠标/渲染三条路径共用,过滤时双击播放和光标完全一致;历史页鼠标命中偏移一行同步修复;两页的过滤条可见时数据行/命中区域都正确下移。另修复收藏页右键退出过滤后高亮指错行。

④ JS 音源链路(97bdfdb):JS 搜索结果按 extra["source"] 平台标记路由到 JS 音源解析(此前必然失败),全部失败后回退到平台对应的内置音源;聚合搜索去重键带平台标记防止不同平台同数字 id 互相吞歌;歌词加了 10 分钟负缓存,纯音乐不再每次播放都触发全源聚合。

⑤ 性能(73959ab):队列改为 RwLock<Arc>——快照/切歌变 O(1),Arc::make_mut 增删改,大队列下每首歌的两次整表深拷贝消失;event::poll 超时改为 min(render_interval, 50ms),max_fps=60 真正生效;歌单页同步按 storage generation 门控,不再每轮主循环全量克隆。

其余 P1/P2:引擎的 StartFile 代次归因、fade_out 永久静音、seek 假进度(2f4c6e6);GBK CUE/LRC、酷我 URL 校验+封面并发、酷狗音质、B 站风控提示、JS 沙箱路径/下载上限、YRC/LRC 解析、正则静态化(97bdfdb/955ec7c);清历史/清队列/删音源/删目录二次确认、右键移除队列校验、panic hook 只在主线程恢复终端、详情页/搜索页/通知/锁中毒/CJK 截断、键位配置告警(51c457c)、移除未使用的 lru 依赖。

0.3.6

Choose a tag to compare

@emoeem emoeem released this 19 Aug 01:34

本次更新包含:

  • 优化搜索结果排序
  • @ 追搜歌手 / B 站 UP 主
  • 追搜专辑

  • 再次按 @/# 删除对应搜索条件
  • 新增歌单关键词搜索
  • 网易云歌单搜索支持
  • 不支持搜索的音源自动回退热门歌单
  • 歌单搜索分页和请求一致性优化
  • 更新配置、搜索和歌单操作文档

0.3.5

Choose a tag to compare

@emoeem emoeem released this 16 Aug 13:31

进行界面优化。

v0.34

Choose a tag to compare

@emoeem emoeem released this 10 Aug 09:55
perf: reduce memory footprint across queue, history, local scan and a…

v0.3.3

Choose a tag to compare

@emoeem emoeem released this 10 Aug 00:47

修复与性能

  • 本地音乐监听自激循环:过滤 Access(Open/Read/Close(Read)) 等只读事件,修复 Linux 上扫描动作触发监听事件、导致每秒上万次重扫的问题。
  • 歌单导入提速:改为先解析去重再一次性写入,N 首歌曲从 N 次全量写盘降为 1 次;导入移到后台线程执行,不再卡住 TUI。
  • 歌词渲染优化:播放进度高频更新时共享歌词快照(Arc)+ 二分查找当前行,消除每帧整份歌词深拷贝。
  • 配置写入原子化config.toml 改为临时文件 + rename 写入,进程崩溃或断电不再损坏配置。
  • QQ 音乐播放地址:统一使用 HTTPS 并规范化 purl 路径,规避明文 HTTP 被拦截的问题。
  • 清理:移除未接入的 KRC 解析器(仅支持 UTF-8,无法解析真实 GBK KRC);lx-test 本地扫描目录改为命令行参数或 LXTEST_MUSIC_DIR 环境变量,不再硬编码路径。

文档

  • README 重构:新增项目简介与文档导航,精简快捷键章节,移除更新日志段落。
  • 新增 docs/CONFIGURATION.md:完整配置字段说明、推荐配置、数据文件说明与键位自定义指南。
  • config.example.toml 更新为开箱即用的推荐配置。
  • 移除 CHANGELOG.md,更新内容以 GitHub Release 为准。

验证

  • cargo clippy --workspace --all-targets 零警告。
  • 单元测试:core 21 / lyric 13 / player 12 / source 55 / app 135,全部通过。

v0.3.2

Choose a tag to compare

@github-actions github-actions released this 09 Aug 00:47

Full Changelog: v0.3.1...v0.3.2

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 09 Aug 00:48

Full Changelog: v0.3.0...v0.3.1