📝 更新日志 - 2025年6月
🎉 v2.7.3 (配置系统革新与文件名处理增强)
日期:2025年6月16日
概述
本次更新带来了配置系统的重大改进,实现了完全基于数据库的配置管理和热重载功能,同时大幅增强了文件名处理能力,彻底解决了特殊字符问题。
✨ 主要亮点
配置系统全面升级:
- 配置完全迁移到数据库存储,不再依赖 config.toml 文件
- 支持配置热重载,无需重启程序即可生效
- 通过任务队列保存配置,彻底解决数据库锁定问题
文件名处理革新:
- 增强的 filenamify 函数,支持所有 Windows 不允许的字符
- 自动转换全角字符(如
:
→-
,「」
→[]
) - 处理特殊符号、数学符号等各种字符
- UTF-8 边界安全和长度限制
初始设置功能:
- 新增友好的初始设置向导界面
- 简化 Cookie 和基本配置设置流程
- 未设置凭证时以受限模式运行,不再强制退出
🐛 问题修复
1. 配置系统修复
- 数据库存储:配置现在完全存储在数据库中,config.toml 仅作为初始配置
- 热重载实现:使用 ArcSwap<ConfigBundle> 架构,实现高性能配置热更新
- 凭证保存:修复 BiliClient::check_refresh() 中 credential 刷新后无法持久化的问题
- 任务队列:配置保存通过专门的任务队列处理,避免并发冲突
2. 文件名处理修复
- 特殊字符支持:修复了 "文件名、目录名或卷标语法不正确" 错误
- 统一处理:所有文件路径生成都经过 filenamify 处理
- 合集命名:修复了合集视频直接使用原始名称的问题
3. 内存管理优化
- 内存泄漏修复:完全移除 Box::leak 导致的内存泄漏
- 配置管理器:新增
get_config_manager()
函数提供安全的配置访问
🔧 技术细节
配置系统架构
rust
// 新的配置管理结构
pub struct ConfigBundle {
pub config: Config,
pub handlebars: Handlebars<'static>,
pub rate_limiter: Arc<RateLimiter>,
}
// 使用 ArcSwap 实现热重载
static CONFIG_BUNDLE: Lazy<ArcSwap<ConfigBundle>> = ...
// 安全的配置访问
pub fn with_config<F, R>(f: F) -> R
where F: FnOnce(&ConfigBundle) -> R
文件名处理增强
rust
// 支持的字符转换
- 全角冒号 `:` → `-`
- 日文引号 `「」` → `[]`
- 全角括号 `()` → `()`
- 书名号 `《》` → `_`
- 全角空格 ` ` → ` `
- 各种特殊符号 → `_`
🚀 升级建议
本版本包含重要的系统改进,强烈建议所有用户升级到 v2.7.3:
- 配置系统更加稳定可靠
- 文件名处理更加智能
- 整体性能和用户体验提升
🎉 v2.7.0 (前端优化与配置修复)
日期:2025年6月6日
概述
本次更新重点解决了配置保存失败的问题,并对前端设置页面进行了全面优化,增加了完整的配置说明,将编解码器选项改为更符合逻辑的拖拽排序列表。
✨ 主要亮点
- 配置保存修复:彻底解决了新增配置项(如视频质量、弹幕、并发等)无法保存的问题。
- 前端UI大改版:
- 编解码器优先级排序:将原先的复选框改为可拖拽排序的列表,更直观地设置下载优先级。
- 完整的配置说明:在设置页面集成了详细的官方文档说明,方便用户随时查阅。
- Aria2 进程优化:修复了会为每个视频源启动一个aria2进程的问题,现在所有下载任务共享同一个aria2实例,大幅降低了资源占用。
🐛 问题修复与功能增强
1. 核心配置系统修复
- 后端:
- 同步更新了后端的
UpdateConfigRequest
,ConfigResponse
,UpdateConfigTask
等多个结构体,补全了约30个缺失的配置字段。 - 修复了
VideoQuality
,AudioQuality
等枚举类型缺少FromStr
实现导致解析失败的问题。 - 统一了
VideoCodecs
枚举的序列化/反序列化格式,解决了前后端格式不匹配的问题。
- 同步更新了后端的
- 前端:
- 修复了
a11y
可访问性警告,为图标按钮添加了aria-label
。
- 修复了
2. 前端设置页面 (Settings) 体验优化
- 新增配置说明:
- 在设置页面右侧增加了完整的配置项说明面板,内容同步自官方文档。
- 包含了文件命名、视频质量过滤、弹幕、并发控制等所有模块的详细解释。
- 编解码器优先级UI重构:
- 将原先的复选框(
checkbox
)修改为支持拖拽排序的列表(draggable list
)。 - 用户可以直观地拖拽
AVC
,HEV
,AV1
来调整其优先级顺序。 - 支持动态添加和移除编解码器选项。
- 将原先的复选框(
3. 下载进程优化
- 问题:之前版本的程序会为收藏夹、合集、番剧等每个视频源都启动一个独立的
aria2c.exe
进程,造成资源浪费。 - 修复:重构了下载器 (
UnifiedDownloader
) 的创建逻辑,改为在任务开始前创建单个共享实例,并将其传递给所有视频源处理函数。 - 效果:无论有多少视频源,程序现在只启动一个
aria2
进程,显著降低了内存和CPU占用。
🔧 技术细节
- 后端:涉及对
api/request.rs
,api/response.rs
,api/handler.rs
,task/mod.rs
,bilibili/analyzer.rs
等多个核心文件的修改,确保了配置数据流在整个后端的正确传递和处理。 - 前端 (
+page.svelte
):大量使用Svelte
的响应式绑定和事件处理,实现了拖拽排序逻辑和动态UI更新。
🚀 升级建议
强烈建议所有用户升级至此版本,以获得更稳定、更易用的配置体验和更高效的资源利用。
🎉 v2.6.2 版本发布
日期:2025年6月1日
概述
本次更新主要修复了番剧弹幕下载失败的问题,并大幅优化了番剧详情获取的性能,显著提升了下载体验。
🐛 问题修复
1. 修复番剧弹幕下载失败问题
问题描述:
- 番剧下载时弹幕文件获取失败,返回 304 错误
- 下载接口缺少必要的
pid
参数导致请求无效
解决方案:
- ✅ 添加了缺失的
pid
参数(分P ID) - ✅ 支持番剧专用的
aid
参数(番剧使用特殊的 aid 而非 bvid) - ✅ 改进了错误处理机制,避免无效的弹幕下载尝试
技术细节:
rust
// 修复前:缺少 pid 参数
let url = format!("https://api.bilibili.com/x/v1/dm/list.so?oid={}", cid);
// 修复后:添加 pid 参数
let params = vec![
("oid", cid.to_string()),
("pid", aid.to_string()), // 新增的关键参数
];
⚡ 性能优化
1. 番剧详情获取性能大幅提升
优化前:
- 串行获取每集详情,速度极慢
- 30 集番剧需要 50-60 秒
- 1221 集柯南需要近 50 分钟
优化后:
- 改为并发获取,性能提升 25-30 倍
- 30 集番剧仅需 2 秒
- 1221 集柯南仅需 100 秒
性能对比:
内容 | 优化前 | 优化后 | 提升倍数 |
---|---|---|---|
30集番剧 | 50-60秒 | 2秒 | 25-30x |
100集番剧 | 约3分钟 | 6-8秒 | 22-30x |
1221集柯南 | 近50分钟 | 100秒 | 30x |
实现方式:
rust
// 优化前:串行处理
for ep in episodes {
let detail = fetch_episode_detail(ep).await?;
results.push(detail);
}
// 优化后:并发处理
let tasks: Vec<_> = episodes.into_iter()
.map(|ep| fetch_episode_detail(ep))
.collect();
let results = futures::future::try_join_all(tasks).await?;
🔧 其他改进
日志优化
- 减少了不必要的警告日志
- 让日志输出更加清晰
代码质量
- 消除了编译警告
- 优化了代码结构
错误处理
- 改进了网络请求的错误处理
- 提供更友好的错误提示
📊 实际测试结果
在实际测试中,性能提升效果显著:
- 《工作细胞》(14集):2秒完成
- 《某科学的超电磁炮》系列(74集):8秒完成
- 《名侦探柯南》(1221集):100秒完成
🚀 升级建议
强烈建议所有用户升级到 v2.6.2 版本,特别是:
- 需要下载番剧的用户
- 下载大量剧集的用户
- 之前遇到弹幕下载失败的用户
📝 技术总结
本次更新通过添加关键参数和改进并发策略,不仅解决了功能性问题,还带来了显著的性能提升。这展示了正确的API使用和合理的并发设计对程序性能的重要影响。
相关提交:
fix: 修复番剧弹幕下载问题,添加缺失的pid参数
fix: 修复番剧弹幕下载,支持番剧的aid参数
feat: 优化番剧弹幕下载和详情获取性能
chore: 发布 bili-sync v2.6.2