Skip to content

Releases: komorebiCarry/BaiduPCS-Rust

v2.2.0

Choose a tag to compare

@github-actions github-actions released this 10 Aug 07:47

BaiduPCS-Rust v2.2.0 发行说明

发布日期:2026-08-10


🎯 版本说明

v2.2.0 是在 v2.1.6 基础上的功能版本,核心是支持百度网盘企业版(apaas)分享转存,并围绕文件夹下载分享同步做了一轮系统性修复。

  • 核心新功能:企业版(apaas)分享转存 —— pan.baidu.com/apaas/share?surl=... 这类链接终于能转存了
  • 下载体验:速度与预计剩余时间不再乱跳(感谢 @wlbksy PR #145);文件夹「跳过」的文件在详情里可见
  • 下载正确性:设置页的冲突策略对内部发起的下载真正生效;重启不再重复下载已完成的文件;失败子任务自动重试而不是把整个文件夹卡死
  • 分享同步:多个订阅同时跑不再互相抢槽位;重启后接着跑而不是推倒重来
  • 转存:网盘空间不足不再被误判成文件数超限空转;普通转存补上分批,超过 500 文件的目录不再直接失败

平滑升级:本版本不涉及破坏性数据迁移,从 v2.1.x 升级无感知。新增的数据库列会在启动时自动补齐(ALTER TABLE ... ADD COLUMN),老数据按默认值兼容。仍建议升级前按惯例备份数据目录(见下方「升级说明」)。

⚠️ 由于本版本新增了数据库列,不建议直接用升级后的数据目录回退到 v2.1.x;如需回退请先恢复升级前的备份。


✨ 企业版(apaas)分享转存

百度网盘的企业版分享与个人版是两套互不兼容的体系,端点、鉴权令牌、参数格式全不相同:

个人版 企业版(apaas)
链接 pan.baidu.com/s/1xxxx pan.baidu.com/apaas/share?surl=xxxx
短链 surl 要补 1 前缀 surl 原样,不能补前缀
分享页 HTML 里刨 yunData 片段 window.yunData = {...} 干净 JSON
验证提取码 /share/verifyrandsk /apaas/api/share/getspwdspwd
列目录 /share/list /apaas/1.0/share/list
转存 /share/transfer /apaas/1.0/share/transfer

此前的现象:拿企业版链接去调个人版接口,/s/1<surl> 会命中一个「链接不存在」的错误页,而该错误页里仍嵌着一个无关的 shareid,于是解析看起来「成功」了,后续 /share/verify 却稳定返回 errno=-12——用户看到的是「提取码错误」,怎么试都过不去。

本版本的做法:新增 netdisk::share 策略层,把两套体系的差异收敛到 ShareProvider 的 6 个方法上,公共部分(文件项解析、异步任务轮询节奏、结果提取)复用同一份实现。

  • 自动识别:解析链接时判定 ShareKindpersonal / apaas),后续走哪套接口由它决定,用户无需做任何选择。
  • 凭据通道复用:企业版的 spwd 与个人版的 randsk 语义相同(都是校验提取码后换来的、后续请求要带的凭据),直接复用现有 randsk 通道,上层无需感知差异。
  • 三条路径全覆盖:普通转存、分享直下、分享同步订阅均自动适配。
  • 向后兼容:老任务持久化的 JSON 里没有 kind 字段,反序列化时退化为个人版,行为与升级前一致。
  • 前端:预览接口回包带 kindtoken,子目录导航原样回传(企业版的 spwd 不在 Cookie 里,翻子目录必须带上)。

✨ 更平稳的速度与预计剩余时间

感谢 @wlbksy 贡献 PR #145

此前的现象:下载速度在 0 / 285 KB/s / 5.2 MB/s 之间反复横跳,ETA 跟着一起跳,完全没法参考。

根因:旧算法是「窗口内字节数 ÷ (now − 最早样本时间)」,分子分母口径不一致。下载按分片落盘,进度回调并非匀速触发——实测出现过「连续 5 秒已下载不动,然后一次跳 256KB」,那一刻窗口里只剩一两个间隔几十毫秒的样本,算出 256KB / 0.05s ≈ 5.2 MB/s,而真实速率只有约 65 KB/s。

改动

  • 存累计值而非增量:速度直接由「两个快照的字节差 ÷ 两个快照的时间差」得出,分子分母取自同一对时间点,天然自洽。
  • 固定间隔采样:快照按 500ms 落点,窗口内样本数量有上界,速度不再随回调疏密漂移。
  • 跨度不足一秒宁可报 0:不拿几十毫秒的样本外推——那正是分母塌缩的来源。
  • 空闲时间参与平均:即使没有新字节也定期落快照,否则下载停滞时最老的快照永远滚不出窗口,速度会一直停在最后那个值不动(实测见过卡在 5.33 MB/s 好几秒)。
  • 保留窗口外的基准点:只要第二个快照还在窗口内,第一个就得留着当左端点,否则没法算差值。

合并后做了一轮取舍调整(cfd412c):独立下载模式不经过分片调度器、没有它的刷新循环兜底,补了一个自带的刷新协程;同时恢复了进度回调里的事件发布路径(文件夹子任务聚合、备份任务通知),避免统一采样把这两条通知漏掉。


✨ 文件夹「跳过」可见

命中冲突策略被跳过的文件不会创建子任务,此前既不出现在下载详情里、也不产生任何事件,用户看到的是「已完成 + 空列表」,甚至无法判断队列是卡住了还是在正常跳过。

  • 新增 skipped 事件:带 group_id,前端据此把跳过归到对应文件夹,实时证明队列在推进。
  • 新增聚合字段skipped_files / skipped_sizecompleted_count 分开统计,但共同参与终态判定。
  • 明细可查:跳过的文件级明细持久化,通过 GET /downloads/folder/:id/skipped 单独取回(不塞进列表接口,避免大文件夹响应膨胀),前端合成「跳过」状态行并入详情列表。
  • 进度口径修正:整体进度改用 (已下载 + 已跳过) / 总大小——此前一个「全部跳过」的文件夹会显示 0% 却又是「已完成」状态,用户无从判断发生了什么。

🐛 下载·正确性修复

内部发起的下载忽略设置页冲突策略(重要)

问题:用户在设置页选了「跳过」,但离线下载完成后转本地下载转存完成后自动下载这两条路径照样覆盖本地已有文件,表现为「跳过时灵时不灵」。

根因:HTTP handler 会自己读配置后把策略传进来,但这两条内部路径一直传 None,此前被硬编码兜底成 Overwrite

修复:策略解析改为三级回退——调用方显式指定 > 设置页全局默认 > Overwrite;配置存引用而非快照,设置页改动即时生效。

重启后重复下载 / 跳过策略失效 / 进度虚高(重要)

三个问题同源于文件夹快照落盘不全:

  • 重复下载:已完成的子任务归档后会从活跃集合移走,重启时待处理队列里仍留着它们,于是已下完的文件被重新下载一遍。现按 group_id 从历史库查回已成功完成的相对路径集合做对账,剔除后再补任务。
  • 跳过策略失效:文件夹的 conflict_strategy 未持久化,重启后回落到默认值。现随快照一起落盘。
  • 进度虚高已下载max() 保证单调性,一旦「已完成子任务之和」与「活跃任务之和」有一次重复累加,虚高值就被永久锁死——实测出现过 30.78 GB / 31.35 GB = 98.2%,而真实下载量只有 17 GB。现封顶到 total_size 并打告警,把静默的数据损坏变成可定位的信号(total_size == 0 表示扫描未完成,此时不封顶)。

跳过统计与明细同时补进已完成文件夹的归档表,重启后不再丢失。

失败重试无上限导致文件夹永不终态(重要)

问题:子任务耗尽分片级 / 链接级 / 调度级重试后直接判死并计入 failed_count,而「恢复文件夹」只接受 Paused/Failed 状态——用户在下载途中对单个失败文件无法做任何操作,只能删掉整个文件夹任务重来

修复:增加第四层——文件夹层的自动重试(默认上限 3 次)。

  • 立即重新入队:放在「释放槽位 + 拉起等待任务」之后,此刻空出的槽位已被排在前面的子任务抢走,本任务只能进等待队列——即「回到队尾」,不会插队。
  • 复用原任务(Failed → Pending)而非重建:已下载的分片全部保留,大文件在 90% 处失败不会前功尽弃。
  • 刻意不做延迟重试:定时器只存在于内存,服务在退避窗口内重启会把重试整个吞掉(任务永远停在 Failed 无人再管);立即入队则任务以 Pending 落进 WAL,重启后能正常恢复。
  • 重试期间不计入 failed_count:否则 已完成 + 已跳过 + 已失败 会提前凑满总文件数,重试还没跑文件夹就被判成终态。

同时补齐了重启时失败子任务的恢复路径。

403/404/410 被当成网络抖动反复轰炸

问题:一个 CDN 节点对某文件持续返回 403 时,任务会以 100ms 退避反复重试同一个坏链接,直到连续 6 次分片失败才触发换链接——实测因此卡了 8 分钟才自愈。

根因:错误分类只看「链接是否用尽」,没用尽就一律判 Transient

修复:永久性 HTTP 错误(403/404/410)直接判 Fatal,并立刻把该链接打入指数退避冷却(10s→40s,复用探测失败那套),链接选择器随即跳过它。


🐛 分享同步

多个订阅同时执行时互相抢槽位(重要)

问题:多个分享同步都显示「在下载」,但交替推进、谁也不快。

根因:发放「文件夹固定任务位」时只校验了「固定位是否已被别的子任务占用」,漏掉了「文件夹自己是否确实持有一个固定位」。文件夹创建时若抢不到槽位(例如只有 1 个任务槽、且已被另一个文件夹以 Normal 优先级持有——Normal 抢不动 Normal),fixed_slot_id 会是 None 且没有任何重试补偿;此时子任务仍带着 uses_folder_fixed_slot=true 被拉起,却不占用任务槽池的任何槽位——直接绕过任务槽上限进入活跃集合。实测日志(1 个任务槽、3 个目录分享同步):

文件夹 4803c7cd 无法获得固定任务位
→ 分配文件夹固定槽位: folder=4803c7cd, folder_fixed_slot_id=None
→ ⚠️ 活跃任务数 2 超过任务槽上限 1

两个任务随后在分片调度器里 round-robin 瓜分唯一的下载线程,于是谁都很慢。

修复:补上「文件夹自己持有固定位」这一条件,这类子任务会回落到全局槽位分配路径,拿不到就正常进等待队列,等持有者释放后按序拉起。

顺带修正槽位优先级:文件夹下载此前无条件用 Normal,两个后果——① 后台同步占住槽位后用户临时想下载别的文件会被挡住;② 分享同步的文件夹会把同一个订阅里正在跑的单文件下载(Backup)踢下槽位。现在自动备份与分享同步的内部下载归为 Backup(只用空闲槽、不抢占任何在跑的任务、自身可被用户手动下载抢占),只有用户手动发起的文件夹下载才是 Normal

重启后接着跑,而不是推倒重来(重要)

问题:进程重启后,run 永远停在 Interrupted、基线永远不推进、下一轮全部重做。

根因:等待转存任务的 future 跑在执行栈里,进程一重启就没了。转存任务本身会被恢复、下载监控也会重建,但没有任何东西在等它、给 run 收尾

修复:新增「续跑接管」。判定能否续跑要三个条件缺一不可——

  1. 候选快照还在:没有它就无法在收尾时推进基线,续跑的活儿等于白干;
  2. run_items 里记着 transfer_task_id:这是找回「上一轮在做什么」的唯一线索;
  3. 该订阅还有没下完的下载:注意看的是下载而不是转存任务——转存任务一旦启动了自动下载就会被落盘成 completed 并移入历史库,重启后根本不会被恢复成活跃任务,拿它当判据永远判不出「可续跑」。

接管后唤醒残留下载(重启后都是暂停态,没人拉起就永远不动)、等转存跑完、正常收尾并推进基线。几个细节:

  • 接管即把 run 标回 running:启动时只收编 running 的 run,若留在 interrupted,进程再被杀一次这批活儿就成孤儿(实测踩到过:接管跑到一半被杀,重启后一条续跑日志都没有,前端全是暂停)。
  • 硬上限兜底:waiter 期间占着该订阅的 in-flight 标记,调度器无法再起新一轮;万一转存任务永远不到终态,没有上限就意味着这个订阅永久停摆。复用与正常 run 相同的 7 天上限(BAIDUPCS_SHARE_SYNC_TASK_HARD_TIMEOUT_SECS)。

转存记账时机导致续跑判据丢失

transfer_task_id 原来是「等待完成后」才写进 run_items,进程若在下载途中被杀,那个正在跑的任务压根没进 run_items——续跑判据找不到它,只能退化成清理重跑,已下载的进度全部作废。现改为提交成功就先记账(在途状态),成功/失败分支再覆盖成终态。

续跑期间速度不动

正常 run 会启动每秒一帧的 item_progress 广播器,续跑接管路径漏掉了——前端在整个续跑期间收不到任何推送,界面停在接管那一刻不动,只能靠切页面触发 REST 兜底拉取(表现就是「速度不动,切菜单回来才刷新」)。现已补齐,并保证任一退出分支都停掉广播器。


🐛 转存

网盘空间不足被误判为文件数超限(重要)

问题:网盘空间满了以后,分享同步会一路对半拆批重试,每批都因空间不足失败——实测刷出 347 次 errno=-32 仍在原地空转。

根因:百度返回 errno=12 + info[0].errno=-32(剩余空间不足)的这条响应里不带 target_file_nums_limit 字段,旧代码 unwrap_or(0) 后判定「转存文件数 32 超过上限 0」——文案离谱,更糟的是分享同步按「超过上限」把它归类成可二分重试

修复-32 在文件数检查之前拦截,归类为 quota_full(资源类错误,拆多小都没用),走早停并提示用户清理空间后手动触发;同时只有响应确实带了 target_file_nums_limit(>0)才做超限判定,避免字段缺失时把任意错误都算成「超过上限 0」。

超过 500 文件的目录直接 errno=12 失败(重要)

问题:百度单次转存有目标文件数上限(默认 500),且按「递归展开后的文件总数」判定,不是按提交的 fs_id 个数——选中一个含 800 个文件的目录只有 1 个 fs_id,照样撞 errno=12。此前只有分享同步侧有拆批,普通转存完全没有。

修复:普通转存补上分批,采用「零请求预拆 + 惰性下钻」两段式:

  • 预拆(零请求):先按父目录分组还原目录结构,再按上限把每组切成多批。只按选中项个数切,一个组里塞了 1200 个文件时必然超限,不用问百度也知道要拆。
  • 惰性下钻:选中项是目录时无从判断(1 个 fs_id 底下可能有上万文件),真撞上超限了才去爬那一批的子树,用与分享同步同一套拆分函数精确拆分后重提。没超限的转存一路零额外请求。
  • 为什么不做主动预扫:要知道一个目录底下有多少文件就得递归列目录,而绝大多数转存根本不到 500——实测选中 99 项含目录时预扫要跑十分钟。
  • 共享上下文:目录缓存让多个批次下钻到同一目录时不重复列;限速器让「列目录 + 转存提交」合计受同一个全局 RPS 约束,防 errno=132
  • 临时错误退避重试errno=4「请求超时,请稍后再试」 这类重试同一批就能过,不该让一次抖动废掉整批(实测批次 2/3 就是这么挂的)。
  • 进度分母跟随:下钻把目录展开成子项后分母随之增长,不再出现「转存 34 / 共 8」这种分子大于分母的显示。

混合虚拟根前缀导致目标多一层 /sharelink…/

前端在分享内导航时,不同目录可能拿到不同的 uk(取不到时为 0),于是同一次选择里会混进 /sharelink0-<shareid>//sharelink<真实uk>-<shareid>/ 两种前缀——整体剥离随即失效,虚拟根被当成目录名转存出来(用户看到目标位置多出一层 /sharelink…/,实测日志里出现过两次)。现改为逐项各剥各的,混合前缀也能归到同一命名空间;同时以根目录响应里的 uk/shareid 为权威值(分享页常常提取不到 uk,而超限后下钻列子目录必须带正确的 uk)。

跨账号聚合把部分成功显示成全部成功

历史库是全局共享的,非归属账号的 manager 也会从里面捞到同一条任务并重建,而那份重建副本的 transferred_count 是按「全部成功」伪造的;「先到先得」的去重会让伪造副本盖掉真实进度(实测部分成功的任务被显示成 7/7)。现在聚合时先收集内存里的活跃任务


🔧 工程

  • 修复两个既有失败用例:分片测试的构造尺寸必须大于小文件单分片阈值(10MB),否则永远只得到 1 个分片;槽位回收测试改用 checked_sub 构造过去时刻,避免开机不足 31 分钟时 Instant::now() - 31min 直接 panic(overflow when subtracting duration from instant)。

🔧 升级说明

Docker 用户

# 升级前建议先备份挂载的 data 卷

# 拉取指定版本镜像
docker pull komorebicarry/baidupcs-rust:v2.2.0

# 或使用 latest 标签
docker pull komorebicarry/baidupcs-rust:latest

# 重启容器
docker-compose down && docker-compose up -d

二进制用户

Releases 页面下载对应平台的二进制文件,替换原有可执行文件后重启服务。

配置与数据

  • 本版本无破坏性数据迁移,从 v2.1.x 升级无需任何手动操作。启动时会自动补齐新增的数据库列(文件夹历史的跳过统计与明细、分享同步快照的 run_id),老数据按默认值兼容。
  • 由于新增了数据库列,不建议直接用升级后的数据目录回退到 v2.1.x;如需回退请先恢复升级前的备份。
  • 升级仍建议按惯例备份 backend/config/backend/wal/(Docker 用户备份挂载的 data 卷)。
  • 默认端口仍为 18888,不影响现有反向代理 / 防火墙 / 书签。
  • 企业版分享无需任何配置,直接粘贴 pan.baidu.com/apaas/share?surl=... 链接即可,与个人版分享同一套操作流程。
  • 冲突策略:若你此前发现「设置页选了跳过但没生效」,升级后离线下载转本地、转存后自动下载这两条路径会正确遵循设置页的默认策略——如果你原先是靠这个 bug 让内部下载始终覆盖的,请留意行为变化。
  • 文件夹子任务自动重试默认 3 次,耗尽才计入失败;升级后此前那些「卡在失败、只能删掉整个文件夹重来」的场景会自动重试恢复。

📁 下载

平台 文件名
Windows (x86_64) BaiduPCS-Rust-v2.2.0-windows-x86_64.zip
Linux (x86_64) BaiduPCS-Rust-v2.2.0-linux-x86_64.tar.gz
Linux (ARM64) BaiduPCS-Rust-v2.2.0-linux-aarch64.tar.gz
macOS (x86_64) BaiduPCS-Rust-v2.2.0-macos-x86_64.tar.gz
macOS (ARM64) BaiduPCS-Rust-v2.2.0-macos-aarch64.tar.gz
Docker 镜像 BaiduPCS-Rust-v2.2.0-docker.tar.gz

🙏 致谢

  • 感谢 @wlbksy 提交 PR #145,重写速度计算的采样口径,让下载速度与预计剩余时间不再乱跳
  • 感谢所有提交 Issue 和反馈问题的用户,帮助定位下载进度、分享同步调度等边界问题

完整更新日志:参见项目根目录的 CHANGELOG.md
问题反馈:欢迎通过 GitHub Issues 进行反馈

v2.1.6

Choose a tag to compare

@github-actions github-actions released this 28 Jul 03:02

BaiduPCS-Rust v2.1.6 发行说明

发布日期:2026-07-28


🎯 版本说明

v2.1.6 是在 v2.1.5 基础上的小版本更新,聚焦下载与文件操作的稳定性,修复两个「重要」问题:

  • 多域双 STOKEN 导致删除等操作报 errno=-6(重要)v2.1.5 已让 REST 接口一律携带 STOKEN,但扫码登录的多域账号可能在不同域下保存了两个不同值的 STOKEN,全部发出反而命中错误的那个,删除等操作仍报 errno=-6(issue #130 追加反馈)。
  • 限速/低带宽下载被「24h 绝对超时」误杀(重要):把「下载慢但仍在推进」的任务误判为失败并清理临时目录,本版本改为进度驱动的停滞判定,正常慢速下载不再被误杀。

平滑升级:本版本不涉及任何不兼容的数据迁移,从 v2.1.x 升级无感知。新增的下载停滞阈值有合理默认值(30 分钟),无需任何手动配置。仍建议升级前按惯例备份数据目录(见下方「升级说明」)。


🐛 问题修复

账号·多域双 STOKEN 导致删除报 errno=-6(重要)

问题v2.1.5 已让所有 REST 接口的 Cookie 头携带 STOKEN,但部分扫码登录的多域账号仍在删除文件等操作上报 errno=-6

根因:这类账号在 passport(.baidu.com)与 pan(pan.baidu.com)两个域下各自保存了一份 STOKEN,两者的值可能不同。此前收集 Cookie 时按「整条 k=v 去重」,会把两个域的 STOKEN 一并发出;百度 filemanager 命中了错误的那一个,于是仍返回 errno=-6(对照:BaiduPCS-Go 只发单个 stoken 故正常,见 issue #130)。

修复

  • 按名称去重:收集各域 Cookie 时改为按 cookie 名称去重(保留首次出现),避免多域同名 Cookie 同时进入 Cookie 头。
  • 强制 STOKEN 唯一:以登录时保存、已验证可用的 user_auth.stoken 为准,清除 jar 中混入的另一域 STOKEN,确保只发出一个正确的 STOKEN。
  • PANPSC 覆盖PANPSC 同样以最新预热值覆盖 jar 中可能存在的多域旧值。
  • 可观测:检测到 jar 里出现多个 STOKEN(正是本问题的触发条件)时打印 warn 日志,便于上线后从用户日志确认修复路径生效。

下载·限速/低带宽任务被绝对超时误杀(重要)

问题:下载慢(低带宽或被百度限速)但仍在持续推进的任务会被误判为失败,且清理临时目录还会连带导致同批其余「在下」文件报 31066

根因:旧逻辑是「从下载开始算满 24h 就一刀切判失败」的绝对超时,它只看时间、不看是否仍有字节进展,于是把「慢但正常」的下载也一并杀掉。

修复:改为进度驱动的停滞判定——

  • 只认「零进展」:维护「上次观察到的已下载字节总量」与「上次有进展的时刻」;只要字节总和仍在变化就把计时器归零,只有连续 stall_timeout_secs 完全无进展才判「停滞」。正常下载即使很慢也会持续有字节增长,永远不会触发;只有真正 0 KB/s 卡死才会被清掉,防卡死能力不丢。
  • 用户暂停不计时:只有「有活跃下载」时停滞时钟才累积;用户主动暂停的任务不算活跃,不会被误判为停滞。
  • 先取消 worker 再清理:判定停滞后先取消底层下载 worker,再清理临时目录,避免 worker 继续对着即将被清理的临时目录刷 Locate、刷出满屏 31066
  • 中性文案:失败提示改为「下载长时间无进展,已判定为停滞并停止;可稍后重试」,只陈述现象与下一步,不臆测会员/带宽等原因。
  • 可调阈值:默认停滞阈值 30 分钟,可用环境变量 BAIDUPCS_DOWNLOAD_STALL_TIMEOUT_MINS(取值 > 0)覆盖。

🔧 升级说明

Docker 用户

# 升级前建议先备份挂载的 data 卷

# 拉取指定版本镜像
docker pull komorebicarry/baidupcs-rust:v2.1.6

# 或使用 latest 标签
docker pull komorebicarry/baidupcs-rust:latest

# 重启容器
docker-compose down && docker-compose up -d

二进制用户

Releases 页面下载对应平台的二进制文件,替换原有可执行文件后重启服务。

配置与数据

  • 本版本无破坏性数据迁移,从 v2.1.x 升级无需任何手动操作。
  • 升级仍建议按惯例备份 backend/config/backend/wal/(Docker 用户备份挂载的 data 卷)。
  • 默认端口仍为 18888,不影响现有反向代理 / 防火墙 / 书签。
  • 若你此前遇到多域账号删除报 errno=-6:升级后直接重试即可;如仍异常,可为该账号重新扫码登录以刷新凭证。
  • 下载停滞阈值默认 30 分钟,如你的网络环境正常但有超长时间零进展的场景,可用 BAIDUPCS_DOWNLOAD_STALL_TIMEOUT_MINS 调大。

📁 下载

平台 文件名
Windows (x86_64) BaiduPCS-Rust-v2.1.6-windows-x86_64.zip
Linux (x86_64) BaiduPCS-Rust-v2.1.6-linux-x86_64.tar.gz
Linux (ARM64) BaiduPCS-Rust-v2.1.6-linux-aarch64.tar.gz
macOS (x86_64) BaiduPCS-Rust-v2.1.6-macos-x86_64.tar.gz
macOS (ARM64) BaiduPCS-Rust-v2.1.6-macos-aarch64.tar.gz
Docker 镜像 BaiduPCS-Rust-v2.1.6-docker.tar.gz

完整更新日志:参见项目根目录的 CHANGELOG.md
问题反馈:欢迎通过 GitHub Issues 进行反馈

v2.1.5

Choose a tag to compare

@github-actions github-actions released this 24 Jul 15:35

BaiduPCS-Rust v2.1.5 发行说明

发布日期:2026-07-24


🎯 版本说明

v2.1.5 是在 v2.1.4 基础上的小版本更新,主要解决两个「重要」问题,并完善分享同步排除规则的使用体验:

  • 部分账号文件操作报 errno=-6(重要):修复部分账号登录成功、却在列目录 / 转存 / 上传等一切文件操作上全部 errno=-6 的问题——根因是这些账号百度强制 BDUSS + STOKEN 双凭证,而 REST 接口此前只带了 BDUSS。
  • 分享同步·include 目录下多层级排除规则失效(重要):修复用 include 圈选目录、再对其深层内容配 exclude 时排除不生效的问题。
  • 排除规则更好用:新增常用词表点选、批量输入(每行一条 / 粘贴多行)与内嵌使用说明。

平滑升级:本版本不涉及任何不兼容的数据迁移,从 v2.1.x 升级无感知。新增的分享同步「常用词表」配置默认为空(老配置文件缺失该段自动视为空),无需手动操作。仍建议升级前按惯例备份数据目录(见下方「升级说明」)。


🐛 问题修复

账号·部分账号文件操作报 errno=-6(重要)

问题:部分账号登录(扫码 / Cookie 导入)成功,随后任何网盘文件操作——列目录、转存、上传、分享同步——都返回 errno=-6(身份校验失败),而 BDUSS 本身经 passport 校验是有效的。

根因:这些账号百度要求 BDUSS + STOKEN 双凭证,pan(REST/xpan)接口只带 BDUSS 时一律返回 errno=-6(见 issue #130);而此前所有 REST 请求的 Cookie 头都只写了 BDUSS=xxx

修复

  • Cookie 头统一带 STOKEN:REST 接口的 Cookie 头改由统一构造,只要账号有 STOKEN 就一律带上(BDUSS=xxx; STOKEN=yyy);老账号即便多带 STOKEN 也无副作用,因此无差别附加。
  • errno=-6 自愈:获取文件列表遇到 errno=-6 时,自动触发一次「预热刷新会话」后重试,尽量在用户无感知的情况下恢复。
  • 可操作提示:预热重试后仍未恢复的(多为纯 BDUSS 导入、缺少 STOKEN 且无法自动预热出 STOKEN 的账号),如实返回可操作提示——请通过「添加账号」重新扫码登录,或重新导入包含 STOKEN 的完整 Cookie 后重试。

分享同步·include 目录下多层级排除规则失效(重要)

问题:当订阅用 include 圈选某个目录、再对该目录下的深层子内容配置 exclude 排除规则时,排除不生效——被排除的深层内容仍被转存 / 下载。

根因:抓取阶段的 BFS 在判断「某目录是否需要继续深入」时,只认「该目录是某个 include_path 自身或其祖先」,漏掉了「该目录是某个 include 目录的后代」这一支。于是 BFS 在 include 目录下一层就截断,深层内容从未被扫描exclude 过滤与 subtree_pruned 标记都无从发生;后续整目录 fs_id 直传时,百度服务端又把被排除的深层内容原样递归复制回来。

修复:把「dir 是某个 include 目录的后代 → 用户圈选的是整棵子树,必须继续深入」这一判断补齐到抓取阶段的三处同款逻辑(dir_allowed / item_allowed / dir_needs_more_pages),使三者语义一致,多层级排除规则恢复生效(issue #128 追加反馈)。已补充单元测试覆盖。


✨ 新功能

分享同步·排除规则常用词表

创建 / 编辑订阅时,排除规则不必每次重复手输:

  • 点选快速添加:维护一份排除规则「常用词表」,编辑订阅时点一下即可加入当前规则。
  • 存为常用:把当前订阅正在用的规则一键存入词表,方便下次复用。
  • 在系统设置维护:词表的增删在系统设置 → 分享同步中进行。默认为空、不做任何预置,完全由用户自行配置(老配置文件缺失该段自动视为空词表)。

分享同步·排除规则批量输入

排除规则输入框支持一次添加多条:每行一条(输入一条按回车,或直接粘贴多行文本后添加)。逗号、空格等标点不作分隔——它们可能是文件名 / 路径的一部分。

分享同步·排除规则使用说明

内嵌可展开的「使用说明」帮助面板(订阅编辑器与系统设置页共用同一份文案,避免两处漂移),讲清规则要点:

  • 规则匹配的是完整路径(相对分享根目录),不只是文件名,且区分大小写
  • 通配符 * 匹配任意字符(可跨目录层级),? 匹配单个字符;
  • 文件夹路径命中规则时,该文件夹及其中全部内容一起排除;
  • 按关键词 *关键词*、按扩展名 *.格式(如 *.nfo);大小写不同的写法需各加一条(如 *.mkv*.MKV)。

🔧 升级说明

Docker 用户

# 升级前建议先备份挂载的 data 卷

# 拉取指定版本镜像
docker pull komorebicarry/baidupcs-rust:v2.1.5

# 或使用 latest 标签
docker pull komorebicarry/baidupcs-rust:latest

# 重启容器
docker-compose down && docker-compose up -d

二进制用户

Releases 页面下载对应平台的二进制文件,替换原有可执行文件后重启服务。

配置与数据

  • 本版本无破坏性数据迁移,从 v2.1.x 升级无需任何手动操作(分享同步「常用词表」配置默认为空,老配置文件自动兼容)。
  • 升级仍建议按惯例备份 backend/config/backend/wal/(Docker 用户备份挂载的 data 卷)。
  • 默认端口仍为 18888,不影响现有反向代理 / 防火墙 / 书签。
  • 若你此前遇到部分账号 errno=-6:升级后请为受影响账号重新扫码登录、或重新导入包含 STOKEN 的完整 Cookie,以便新逻辑携带双凭证。

📁 下载

平台 文件名
Windows (x86_64) BaiduPCS-Rust-v2.1.5-windows-x86_64.zip
Linux (x86_64) BaiduPCS-Rust-v2.1.5-linux-x86_64.tar.gz
Linux (ARM64) BaiduPCS-Rust-v2.1.5-linux-aarch64.tar.gz
macOS (x86_64) BaiduPCS-Rust-v2.1.5-macos-x86_64.tar.gz
macOS (ARM64) BaiduPCS-Rust-v2.1.5-macos-aarch64.tar.gz
Docker 镜像 BaiduPCS-Rust-v2.1.5-docker.tar.gz

完整更新日志:参见项目根目录的 CHANGELOG.md
问题反馈:欢迎通过 GitHub Issues 进行反馈

v2.1.4

Choose a tag to compare

@github-actions github-actions released this 22 Jul 08:40

BaiduPCS-Rust v2.1.4 发行说明

发布日期:2026-07-22


🎯 版本说明

v2.1.4 是在 v2.1.3 基础上的小版本更新,聚焦分享同步「抓取阶段」(递归列目录)的健壮性、可观测性与过滤正确性:

  • 抓取进度可观测:分享同步耗时最长的递归列目录阶段不再是「黑盒」,前端实时显示扫描进度与重试提示
  • 抓取更抗抖动:新增建连超时、单请求退避重试、跨整轮重试「续爬」,网络抖动 / 百度限流下更稳更快
  • 过滤失效修复(重要):修复带 include / exclude 过滤的目录被整目录直传时,被过滤子项仍被连带搬运的问题

平滑升级:本版本不涉及任何不兼容的数据迁移,从 v2.1.x 升级无感知。run 记录新增 phase 列由程序自动补齐(老库首次启动自动 ALTER TABLE),无需手动操作。仍建议升级前按惯例备份数据目录(见下方「升级说明」)。


✨ 新功能

分享同步·抓取进度可观测

抓取(递归列目录)是分享同步中耗时最长的一段,大分享动辄数百个目录、上百秒。此前这段时间前端只显示「运行中」,用户无法区分「正在爬目录」与「程序卡死」。

  • 实时扫描进度:新增 scan_progress WebSocket 事件(后端约 500ms 节流广播),前端显示「扫描目录中(已扫描 N 个目录 · 待扫描 N · 发现 N 个文件 · 当前目录 …)」。刻意采用计数式文案而非百分比——BFS 待扫描目录数会边爬边增长,百分比只会倒退。
  • 重试可见:整轮抓取因网络异常重试时,明确提示「网络异常,正在第 N 次重试」,并说明已扫描过的目录会直接复用、不会重爬,让用户明白是网络在抖而非程序卡死。

分享同步·运行阶段落库

scan_progress 是瞬时的 WS 事件,页面刷新或 WS 断线重连后即丢失。为此 run 记录新增 phase 字段(scanning / diffing / executing),落库持久化,REST 轮询即可兜底展示细化状态,用户始终能看到「扫描目录中 / 计算差异中 / 转存下载中」而非裸的「运行中」。run 结束后 phase 置空,终态记录不会被误显示为「扫描中」。


🐛 问题修复

分享同步·过滤失效(重要)

问题:当一个目录内部有子项被 include / exclude 过滤规则剔除时,若转存阶段仍把该目录当作单个 fs_id 整目录直传,百度服务端会按 fs_id 递归复制整个目录,连带把本应被过滤掉的子项也一并搬运过去——过滤形同虚设。

修复:抓取阶段标记「有后代被过滤剔除」的存活目录(subtree_pruned),转存阶段拒绝对其整目录直传,改为展开到子节点逐层提交,真正跳过被过滤的分支;而不含被过滤分支的干净兄弟子目录仍保持整目录高效转存。已补充回归测试覆盖。

分享同步·抓取健壮性

  • 建连超时:reqwest 此前未设 connect_timeout,建连阶段沿用系统级 TCP 超时(Windows 上约 21s,失败报 os error 10060)。网络抖动 / 限流时每个失败请求都要白等 21s,递归列目录被整体拖垮。现统一收紧到 8s(可经 BAIDUPCS_CONNECT_TIMEOUT_SECS 覆盖,取值 1~60),连不上即快速失败交给上层重试。
  • 单请求退避重试 + 续爬:单个列目录请求自带退避重试(可经 BAIDUPCS_SHARE_SYNC_LIST_RETRIES / ..._LIST_BACKOFF_MS 调参);跨「整轮重试」引入目录缓存,把重试从「整棵树重爬」退化为「续爬」剩余目录——大分享既加快重试,又避免请求量翻倍再次撞限流。
  • 错误分类修正:分享页 / 分享列表 / 提取码校验的 send/read 网络层失败(超时 / 连接抖动 / 限流)正确归类为可重试的临时错误不再误计入「链接确定性失效」自动暂停;真正的链接失效(分享被删 / 提取码错)仍按原逻辑触发暂停。
  • 排障友好:抓取错误保留完整错误链(含底层超时与百度 errno + errmsg),不再只剩最外层笼统文案。

🔧 升级说明

Docker 用户

# 升级前建议先备份挂载的 data 卷

# 拉取指定版本镜像
docker pull komorebicarry/baidupcs-rust:v2.1.4

# 或使用 latest 标签
docker pull komorebicarry/baidupcs-rust:latest

# 重启容器
docker-compose down && docker-compose up -d

二进制用户

Releases 页面下载对应平台的二进制文件,替换原有可执行文件后重启服务。

配置与数据

  • 本版本无破坏性数据迁移,从 v2.1.x 升级无需任何手动操作(run 记录 phase 列由程序启动时自动补齐)。
  • 升级仍建议按惯例备份 backend/config/backend/wal/(Docker 用户备份挂载的 data 卷)。
  • 默认端口仍为 18888,不影响现有反向代理 / 防火墙 / 书签。

可选环境变量(本版本新增 / 相关)

变量 默认 说明
BAIDUPCS_CONNECT_TIMEOUT_SECS 8 HTTP 建连超时(秒,取值 1~60,越界回退默认值)
BAIDUPCS_SHARE_SYNC_LIST_RETRIES 3 单个列目录请求的重试次数(设 0 关闭)
BAIDUPCS_SHARE_SYNC_LIST_BACKOFF_MS 800 单请求重试的基础退避(毫秒,第 n 次等待 = base × 2ⁿ)

📁 下载

平台 文件名
Windows (x86_64) BaiduPCS-Rust-v2.1.4-windows-x86_64.zip
Linux (x86_64) BaiduPCS-Rust-v2.1.4-linux-x86_64.tar.gz
Linux (ARM64) BaiduPCS-Rust-v2.1.4-linux-aarch64.tar.gz
macOS (x86_64) BaiduPCS-Rust-v2.1.4-macos-x86_64.tar.gz
macOS (ARM64) BaiduPCS-Rust-v2.1.4-macos-aarch64.tar.gz
Docker 镜像 BaiduPCS-Rust-v2.1.4-docker.tar.gz

完整更新日志:参见项目根目录的 CHANGELOG.md
问题反馈:欢迎通过 GitHub Issues 进行反馈

v2.1.3

Choose a tag to compare

@github-actions github-actions released this 10 Jul 07:12

BaiduPCS-Rust v2.1.3 发行说明

发布日期:2026-07-10


🎯 版本说明

v2.1.3 是在 v2.1.2 基础上的小版本更新:新增文件与下载列表排序能力,并修复了快速切换目录时文件夹偶发无法打开的问题。

  • 列表排序:网盘 / 本地文件列表点击表头排序(name / time / size,升 / 降序),下载页新增排序控件与状态筛选栏(含各状态计数)
  • 文件管理修复:快速切换目录时的并发竞态,过期响应不再覆盖当前目录、文件夹偶发无法打开

平滑升级:本版本不涉及任何不兼容的数据迁移,从 v2.1.x 升级无感知。仍建议升级前按惯例备份数据目录(见下方「升级说明」)。


✨ 新功能:文件与下载列表排序

  • 网盘 / 本地文件排序:文件管理页与本地文件页支持点击表头对 文件名 / 修改时间 / 大小 排序,排序字段(name / time / size)与升降序透传后端,配合分页在大目录下也能拿到全局有序结果,而非仅对当前页排序。
  • 下载列表排序 + 状态筛选:下载管理页新增排序控件状态筛选栏——可按状态(下载中 / 等待 / 已完成 / 失败 / 暂停等)过滤,筛选栏内联显示各状态任务计数,在任务量大时快速定位目标任务。

🐛 问题修复

  • 文件管理·目录切换偶发打不开:快速切换目录时,目录切换分页加载两条异步链路并发,较晚返回的过期响应可能覆盖当前目录内容,表现为文件夹偶发无法打开。现在对返回结果按当前路径 / 请求序号校验,过期响应直接丢弃。

🔧 升级说明

Docker 用户

# 升级前建议先备份挂载的 data 卷

# 拉取指定版本镜像
docker pull komorebicarry/baidupcs-rust:v2.1.3

# 或使用 latest 标签
docker pull komorebicarry/baidupcs-rust:latest

# 重启容器
docker-compose down && docker-compose up -d

二进制用户

Releases 页面下载对应平台的二进制文件,替换原有可执行文件后重启服务。

配置与数据

  • 本版本无破坏性数据迁移,从 v2.1.x 升级无需任何手动操作。
  • 升级仍建议按惯例备份 backend/config/backend/wal/(Docker 用户备份挂载的 data 卷)。
  • 默认端口仍为 18888,不影响现有反向代理 / 防火墙 / 书签。

📁 下载

平台 文件名
Windows (x86_64) BaiduPCS-Rust-v2.1.3-windows-x86_64.zip
Linux (x86_64) BaiduPCS-Rust-v2.1.3-linux-x86_64.tar.gz
Linux (ARM64) BaiduPCS-Rust-v2.1.3-linux-aarch64.tar.gz
macOS (x86_64) BaiduPCS-Rust-v2.1.3-macos-x86_64.tar.gz
macOS (ARM64) BaiduPCS-Rust-v2.1.3-macos-aarch64.tar.gz
Docker 镜像 BaiduPCS-Rust-v2.1.3-docker.tar.gz

完整更新日志:参见项目根目录的 CHANGELOG.md
问题反馈:欢迎通过 GitHub Issues 进行反馈

v2.1.2

Choose a tag to compare

@github-actions github-actions released this 30 Jun 03:39

BaiduPCS-Rust v2.1.2 发行说明

发布日期:2026-06-30


🎯 版本说明

v2.1.2 是在 v2.1.1 基础上的维护版本,内容以分享同步批量下载可靠性下载引擎收尾/续传修复为主:大目录分享同步支持整批 submit 合并任务、本地目标自动补同步,并修复断点续传在文件被截断时写出稀疏空洞、以及任务 100% 后双 finalize 竞争导致误报与文件损坏等问题。

  • 分享同步·批量下载:≥2 文件走整批 submit(N→1 任务),batch 失败退化为逐文件;同步前校验本地缺失/大小不一致文件并自动补下载
  • 下载·续传安全:恢复时目标文件缺失或截断则重置分片进度,避免损坏文件被误标完成
  • 下载·收尾竞争:修复 100% 后双 finalize 抢同一临时文件;收尾窗口暂停也作废旧 epoch;明文文件不再误报「解密失败」
  • 错误提示:分享链接 errno=-9 明确为「分享链接失效或提取码错误」

平滑升级:本版本不涉及任何不兼容的数据迁移,从 v2.1.1 升级无感知。仍建议升级前按惯例备份数据目录(见下方「升级说明」)。


✨ 分享同步·批量下载可靠性

感谢 @hamr-hub 贡献的分享同步批量下载可靠性修复(PR #121)。

  • 整批 submit 合并任务:组内文件数 ≥2 时走 submit_transfer_batch / submit_download_batch,将 N 次转存/下载任务合并为 1 次(transfer 内部按父目录分 batch),大目录场景显著减少任务数与鉴权开销;batch 提交失败时自动退化为逐文件 submit,quota / 本地磁盘满等边界场景不误伤整组。
  • 本地目标自动补同步:同步前扫描本地目标目录,将「快照未变但本地文件缺失或大小不一致」的条目纳入 modified diff 重新下载,避免上次中断留下的半成品被误判为已同步。
  • 分片下载兜底:大批量文件夹下载中,失败清理/重试竞态可能删掉半成品文件或其父目录;分片线程在写入前自动 create_dir_all 父目录,避免单个缺失目录拖垮整批分享同步。
  • 错误分类增强:临时性服务端超时等关键字纳入 Transient 分类,分享同步可正确自动重试;errno=-9 提示改为「分享链接失效或提取码错误」,便于用户区分链接问题与网络抖动。

🐛 下载引擎修复

  • 断点续传安全校验:恢复下载时,若分片已记录进度但目标文件缺失或长度不足(常见于大批量下载中失败清理/重试竞态),现重置该分片进度从头重下——避免 create(true)+seek 续传在文件前段写出全 0 稀疏空洞,却被仅按文件大小判定的完成校验误标为成功。
  • 双 finalize 竞争(任务 100% 后):
    • 引入 finalize_spawned 原子门闩,防止两个收尾协程并发 rename/解密同一临时文件导致误报失败或产出损坏文件。
    • 文件夹恢复时「无可用槽位」早退分支也复位 finalize_spawned,避免状态残留阻塞后续调度。
    • 收尾窗口(finalize_spawned=true 但尚未进入 Decrypting)内暂停也递增 decrypt_epoch 作废旧协程,与 cancel_tasks_by_group 的 epoch 失效逻辑对齐。
  • 明文误报文案:明文文件收尾阶段只有 rename、不走解密,统一拼成「解密失败」会误导用户;现仅加密文件报「解密失败」,明文一律报「文件收尾失败」。

🔧 工程

  • 新增分享同步诊断脚本(scripts/ 目录):
    • share_sync_probe.py — 探测分享链接可达性与快照抓取
    • share_sync_status.py — 查看订阅/运行状态
    • share_sync_restore_snapshot.py — 快照恢复工具

🔧 升级说明

Docker 用户

# 升级前建议先备份挂载的 data 卷

# 拉取指定版本镜像
docker pull komorebicarry/baidupcs-rust:v2.1.2

# 或使用 latest 标签
docker pull komorebicarry/baidupcs-rust:latest

# 重启容器
docker-compose down && docker-compose up -d

二进制用户

Releases 页面下载对应平台的二进制文件,替换原有可执行文件后重启服务。

配置与数据

  • 本版本无破坏性数据迁移,从 v2.1.1 升级无需任何手动操作。
  • 升级仍建议按惯例备份 backend/config/backend/wal/(Docker 用户备份挂载的 data 卷)。
  • 默认端口仍为 18888,不影响现有反向代理 / 防火墙 / 书签。

📁 下载

平台 文件名
Windows (x86_64) BaiduPCS-Rust-v2.1.2-windows-x86_64.zip
Linux (x86_64) BaiduPCS-Rust-v2.1.2-linux-x86_64.tar.gz
Linux (ARM64) BaiduPCS-Rust-v2.1.2-linux-aarch64.tar.gz
macOS (x86_64) BaiduPCS-Rust-v2.1.2-macos-x86_64.tar.gz
macOS (ARM64) BaiduPCS-Rust-v2.1.2-macos-aarch64.tar.gz
Docker 镜像 BaiduPCS-Rust-v2.1.2-docker.tar.gz

完整更新日志:参见项目根目录的 CHANGELOG.md
问题反馈:欢迎通过 GitHub Issues 进行反馈

v2.1.1

Choose a tag to compare

@github-actions github-actions released this 24 Jun 03:25

BaiduPCS-Rust v2.1.1 发行说明

发布日期:2026-06-24


🎯 版本说明

v2.1.1 是在 v2.1.0(分享同步)基础上的维护版本,内容以优化与 Bug 修复为主:修复扫码登录在确认环节失败时被降级成假「临时用户」、系统设置页导航把顶部保存栏顶出可视区,并完善了分享同步的稳定性(手动触发、调度器、下载等待、历史数据归属),同时新增分享同步的运行明细分页下载停滞自动重试两项增强。

  • 登录修复:扫码登录确认失败不再伪造 uid=0「临时用户」,避免假登录导致后续网盘 API 全部 errno=-6
  • 界面修复:系统设置左侧导航点击不再把顶部「保存设置」栏顶出可视区
  • 分享同步·稳定性:手动触发返回真实 run_id(不再假成功)、调度器不再静默吞错、下载等待改「空闲超时 + 硬上限」、owner_uid=0 历史数据启动期迁移
  • 分享同步·增强:运行明细分页接口(大 run 不再截断到 100 条)、下载停滞自动重试(pause→冷却→resume

平滑升级:本版本不涉及任何不兼容的数据迁移,从 v2.1.0 升级无感知。仍建议升级前按惯例备份数据目录(见下方「升级说明」)。


🐛 登录与界面修复

  • 扫码登录·不再伪造临时用户:扫码登录在「确认环节」失败或拿不到真实 uid 时,过去会被降级成 uid=0、用户名「临时用户」的假「成功」,导致前端显示已登录、但实际会话不完整,调用任意网盘 API 都返回 errno=-6。现改为如实返回失败并提示重新扫码;同时增加 uid=0 守卫,杜绝假登录账号落库。
  • 系统设置·导航不再顶出保存栏:点击左侧锚点导航(如「下载」)时改为只滚动内容容器,不再连带滚动外层把顶部「保存设置」栏顶出可视区。

✨ 分享同步·稳定性与增强

感谢 @hamr-hub 贡献的分享同步后端修复与增强(PR #111)。

稳定性修复(来自 @hamr-hub PR #111):

  • 手动触发:触发前做前置校验并返回真实 run_id,不再「假成功」;前端可凭 run_id 立即定位本次运行。
  • 调度器不吞错:定时 on_tick 改为返回 Result,失败落 warn 日志便于排查,不再静默丢弃错误。
  • 下载等待:等待逻辑改为「空闲超时 + 硬上限」双闸——空闲超时按「有无进展」判定(避免大文件下到一半被误杀),硬上限兜底;文件夹聚合速度改用「活跃下载状态」判断,修复进行中速度恒显示 0。
  • 历史数据归属:启动期对 owner_uid=0 的历史脏数据按当前活跃账号迁移归属。

功能增强(来自 @hamr-hub PR #111):

  • 运行明细分页:新增 GET /share-sync/runs/:id/items 分页接口(count + 分页查询),前端运行详情弹窗接入分页,避免大 run 明细被截断到 100 条。
  • 下载停滞自动重试:检测到下载长时间无进展时,自动 pause →冷却→ resume 重启该下载(限次数 + 冷却,可经环境变量调参),减少卡死需人工干预的情况。

下游补充修复:

  • 修复为「立即返回 run_id」预建 run 的设计所引入的孤儿 run——并发去重命中、链接失效、账号未就绪等早退路径在绑定 run_id 前返回、未收尾,导致 run 永久卡 running;现各早退路径均收尾为失败。
  • 修复 resume_link_invalid状态不一致——恢复链接失效后「立即触发一次」失败时不再影响恢复接口返回(降级为只记日志)。

🔧 工程 / CI

  • 统一 Rust 工具链版本为 1.87(本地 / Docker / CI 一致)。
  • 增加 Conventional Commits 校验(PR 标题 + 逐 commit)。

🔧 升级说明

Docker 用户

# 升级前建议先备份挂载的 data 卷

# 拉取指定版本镜像
docker pull komorebicarry/baidupcs-rust:v2.1.1

# 或使用 latest 标签
docker pull komorebicarry/baidupcs-rust:latest

# 重启容器
docker-compose down && docker-compose up -d

二进制用户

Releases 页面下载对应平台的二进制文件,替换原有可执行文件后重启服务。

配置与数据

  • 本版本无破坏性数据迁移,从 v2.1.0 升级无需任何手动操作。
  • 升级仍建议按惯例备份 backend/config/backend/wal/(Docker 用户备份挂载的 data 卷)。
  • 默认端口仍为 18888,不影响现有反向代理 / 防火墙 / 书签。

📁 下载

平台 文件名
Windows (x86_64) BaiduPCS-Rust-v2.1.1-windows-x86_64.zip
Linux (x86_64) BaiduPCS-Rust-v2.1.1-linux-x86_64.tar.gz
Linux (ARM64) BaiduPCS-Rust-v2.1.1-linux-aarch64.tar.gz
macOS (x86_64) BaiduPCS-Rust-v2.1.1-macos-x86_64.tar.gz
macOS (ARM64) BaiduPCS-Rust-v2.1.1-macos-aarch64.tar.gz
Docker 镜像 BaiduPCS-Rust-v2.1.1-docker.tar.gz

完整更新日志:参见项目根目录的 CHANGELOG.md
问题反馈:欢迎通过 GitHub Issues 进行反馈

v2.1.0

Choose a tag to compare

@github-actions github-actions released this 15 Jun 10:02

BaiduPCS-Rust v2.1.0 发行说明

发布日期:2026-06-15


🎯 版本说明

v2.1.0 是在 v2.0.0(多账号)基础上的功能版本,核心是引入全新的**分享同步(Share Sync)**能力,并带来一批围绕分享同步的稳定性、进度显示与风控修复,以及 Windows 控制台日志乱码修复。

  • 核心新功能:分享同步(Share Sync)——订阅分享链接,周期 / 定时拉取并与上次快照对比差异,自动转存到网盘和 / 或下载到本地
  • 稳定性:增量同步只同步变动文件、转存撞同名继续下载、重启自动续跑被中断的 run、删除订阅清理孤儿任务
  • 进度显示:修复文件夹下载已下载翻倍(200%)与上传超过 100%,全站进度条统一钳到 [0,100]
  • 风控:列目录 / 拆批接入全局限速器,errno=132 大目录分块、errno=4 超时退避,链接连续失效自动暂停轮询
  • 体验:Windows 控制台日志不再出现 [2m[32m 等乱码

平滑升级:本版本不涉及 v2.0.0 那样的不兼容数据迁移,从 v2.0.x 升级到 v2.1.0 无感知。分享同步会新建自己的数据表,与既有数据兼容。仍建议升级前按惯例备份数据目录(见下方「升级说明」)。


✨ 分享同步(Share Sync)

感谢 @hamr-hub 贡献分享同步功能(PR #98#99#102)。

订阅第三方分享链接,按固定间隔(≥10 分钟)或每日定时拉取文件列表,与上次快照对比差异,自动把变更应用到网盘目录(转存)和 / 或本地目录(下载)。只同步变动的文件,不会整目录重复处理。

功能要点:

  • 多账号隔离:订阅按 owner_uid 归属与解析,多账号互不干扰,事件携带 owner_uid
  • 双目标并行:单条订阅可同时配置「网盘 + 本地」两个目标;支持 include / exclude 路径过滤,精确控制同步范围。
  • 三种冲突策略
    • overwrite(覆盖):直接覆盖目标中的同名文件
    • versioned(新版本):保留旧文件为 name(YYYYMMDD-HHMMSS).ext,写入新文件
    • skip(跳过):目标已存在则不处理
  • 删除行为可控:默认保留目标中的旧文件;可开启「分享者删除 → 目标也删除」。
  • 实时进度与审计:子任务实时进度(速度 / 预计剩余时间),每次运行记录 added / modified / removed / failed 计数与文件级 run_item;通过 WebSocket 实时推送,断线 / 切页用 REST 轮询兜底。
  • Web UI/share-sync 页面,订阅列表 + 创建(复用转存对话框与 include/exclude 编辑器)+ 运行历史弹窗 + 内联子任务进度。

🐛 分享同步·稳定性与正确性修复

  • 增量只同步变动文件:已同步目录里改动 / 新增单个文件时,只同步该文件,不再整目录重转存 + 重下载。
  • 转存撞同名继续下载:目标已存在同名目录 / 文件时视为「已存在」并继续进入下载阶段,不再整批判失败。
  • 增量单文件修复:修复增量新增单个文件被误判失败、以及网盘目录名翻倍(落到 /目标/目标/...)的问题。
  • 进行中子任务列表:完成的文件夹不再被回包成「进行中」,切页 / 断线重连后状态一致。
  • 重启自动续跑:后端重启后自动续跑被中断的 run,不再粗暴标失败。
  • 删除订阅清理:删除订阅时清理名下内部转存 / 下载任务,避免孤儿脏数据。

🐛 风控与限速

  • 全局限速器:列目录抓快照 / 拆批接入账号级全局限速器(leaky bucket),降低并发探测触发风控的概率。
  • 大目录分块:删除大目录、整批转存自动分块以规避 errno=132;整批转存临时超时(errno=4)按退避自动重试。
  • 轮询节奏:轮询抖动后强制不低于最小间隔,与自动备份对齐降低风控。
  • 链接失效熔断:分享链接确定性失效连续 2 次自动暂停轮询,并在前端提供「恢复」按钮。

🐛 进度显示修复

  • 文件夹下载不再翻倍:修复文件夹下载完成时「已下载」翻倍(200%)的聚合竞态——已完成子任务不再被重复计入活跃和。
  • 上传不再超过 100%:上传「已上传」改用已完成分片之和(幂等),同一分片重传 / upload_id 过期重传不会重复累加,根治进度 >100%(如 142%)。
  • 全站钳制:前端各进度条与后端 progress() 统一钳到 [0,100],作为防御兜底。

🐛 其他修复

  • 转存任务归属:重启恢复转存任务时还原 is_internal,分享同步内部转存任务不再漏进转存管理列表。
  • Windows 控制台日志乱码:Windows 下默认关闭控制台 ANSI 彩色输出,避免出现 [2m[32m 等转义字符;非 Windows 平台保留终端彩色,文件日志始终为纯文本。(感谢 @YYQHH PR #103
  • 前端:文件列表滚动加载在请求失败后不再无限翻页;修复路由切换后 el-table 列宽错位;修复 npm run lint(ESLint v9 flat config)并清理零风险静态告警。

🔧 升级说明

Docker 用户

# 升级前建议先备份挂载的 data 卷

# 拉取指定版本镜像
docker pull komorebicarry/baidupcs-rust:v2.1.0

# 或使用 latest 标签
docker pull komorebicarry/baidupcs-rust:latest

# 重启容器
docker-compose down && docker-compose up -d

二进制用户

Releases 页面下载对应平台的二进制文件,替换原有可执行文件后重启服务。

配置与数据

  • 本版本无破坏性数据迁移,从 v2.0.x 升级无需任何手动操作;分享同步会自动创建所需数据表。
  • 升级仍建议按惯例备份 backend/config/backend/wal/(Docker 用户备份挂载的 data 卷)。
  • 默认端口仍为 18888,不影响现有反向代理 / 防火墙 / 书签。

📁 下载

平台 文件名
Windows (x86_64) BaiduPCS-Rust-v2.1.0-windows-x86_64.zip
Linux (x86_64) BaiduPCS-Rust-v2.1.0-linux-x86_64.tar.gz
Linux (ARM64) BaiduPCS-Rust-v2.1.0-linux-aarch64.tar.gz
macOS (x86_64) BaiduPCS-Rust-v2.1.0-macos-x86_64.tar.gz
macOS (ARM64) BaiduPCS-Rust-v2.1.0-macos-aarch64.tar.gz
Docker 镜像 BaiduPCS-Rust-v2.1.0-docker.tar.gz

完整更新日志:参见项目根目录的 CHANGELOG.md
问题反馈:欢迎通过 GitHub Issues 进行反馈

v2.0.1

Choose a tag to compare

@github-actions github-actions released this 10 Jun 11:25

BaiduPCS-Rust v2.0.1 发行说明

发布日期: 2026-06-10


🎯 版本说明

v2.0.1 是在 v2.0.0 多账号版本基础上的补丁版本,主要修复多账号添加流程与设置页 UI 显示问题。本版本不涉及数据结构变更,从 v2.0.0 升级无需额外备份或迁移操作,直接替换二进制 / 拉取镜像后重启即可。

本版本修复:

  • 添加账号时尚未扫码就误报「账号添加成功」
  • 设置页滑到底部时「关于」卡片下边框被横向滚动条遮挡

🐛 问题修复

🐛 修复添加账号尚未扫码就误报「账号添加成功」

现象: 在已登录状态下通过「添加账号」扫码登录时,用户尚未完成扫码,界面就提示「账号添加成功」。

原因: 扫码状态轮询接口在检测到「已有活跃账号」时会短路返回成功;添加账号模式下用户本就已有活跃账号,导致轮询一开始就用旧账号判定为登录成功。

修复:

  • 前端:添加账号模式的扫码轮询附带 add=true 参数
  • 后端:/auth/qrcode/statusadd=true 时跳过「已有活跃账号即视为登录成功」的短路逻辑,必须真正扫码新账号后才返回成功

🐛 修复设置页「关于」卡片下边框被横向滚动条遮挡

现象: 设置页滚动到底部时,「关于」卡片下边框被横向滚动条盖住,视觉不完整。

原因: 设置内容区同时开启纵向滚动时,浏览器会将 overflow-x 计算为 auto;子项略超宽时出现横向滚动条,遮挡底部卡片边框。

修复: 设置内容区显式设置 overflow-x: hidden,仅保留纵向滚动,子项正常换行显示。


🔧 升级说明

本版本为补丁升级,无数据结构变更,从 v2.0.0 升级可直接覆盖,无需备份或迁移。

Docker 用户

# 拉取指定版本镜像
docker pull komorebicarry/baidupcs-rust:v2.0.1

# 或使用 latest 标签
docker pull komorebicarry/baidupcs-rust:latest

# 重启容器
docker-compose down && docker-compose up -d

二进制用户

发行版 页面下载对应平台文件,替换可执行文件后重启服务即可。

配置与数据

  • 无需修改配置文件
  • 无需数据迁移
  • 默认端口仍为 18888

📁 下载

平台 文件名
Windows (x86_64) BaiduPCS-Rust-v2.0.1-windows-x86_64.zip
Linux (x86_64) BaiduPCS-Rust-v2.0.1-linux-x86_64.tar.gz
Linux (ARM64) BaiduPCS-Rust-v2.0.1-linux-aarch64.tar.gz
macOS (x86_64) BaiduPCS-Rust-v2.0.1-macos-x86_64.tar.gz
macOS (ARM64) BaiduPCS-Rust-v2.0.1-macos-aarch64.tar.gz
Docker 镜像 BaiduPCS-Rust-v2.0.1-docker.tar.gz

完整更新日志: 参见项目根目录的 CHANGELOG.md

问题反馈: 欢迎通过 GitHub Issues 反馈

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 08 Jun 03:34

BaiduPCS-Rust v2.0.0 发行说明

发布日期:2026-06-08


🎯 版本说明

v2.0.0 是引入多账号支持的重大版本,版本号从 v1.14.1 跃升至 v2.0.0。多账号涉及任务归属、数据隔离与资源调度的架构级改动,按语义化版本属于不兼容的大版本升级,升级风险高于以往小版本,请务必先阅读「升级前必读」。

  • 核心新功能:多账号独立管理(添加 / 切换 / 删除)、按 owner_uid 的任务归属与数据隔离、实时资源配额调度(BudgetScheduler)
  • 稳定性:启动期自动修复 + 迁移前完整备份(任何破坏性操作之前)、全局只读保护兜底、断线自适应退避重连
  • 通用修复:下载取链 errno=8002 临时风控阶梯重试、filemetas 按路径解析 fs_id、创建即持久化下载任务

⚠️ 本版本会改动后端数据(SQLite 新增 owner_uid 列、.meta / 历史回填、session.json 改名迁移)。升级前请务必备份,详见下方说明。


⚠️ 升级前必读

升级前请先备份后端数据目录

升级到 v2.0.0 前,请先手动备份后端数据目录:

  • backend/config/(含 baidu-pcs.dbaccounts.jsonsession.jsonautobackup_configs.json
  • backend/wal/(任务状态 .meta

Docker 用户备份挂载的 data 卷即可。万一升级异常,恢复这两个目录即可回到升级前状态。

除手动备份外,后端在首次启动 2.0.0 且检测到既有数据时,会在任何破坏性迁移之前自动做一份完整备份到 config/backups/pre_migration_<时间戳>/(详见「启动期自动修复 + 迁移前完整备份」一节),作为额外保险。

降级提示

如需回退到旧版本,请先恢复升级前备份的 config/wal/ 目录,再启动旧版本;不建议直接用 2.0.0 升级后的数据目录启动旧版本。

原因:2.0.0 会改动数据(SQLite 新增 owner_uid 列、.meta / 历史回填、session.json 改名迁移),旧版本对这些改动的兼容性无法保证;且旧版本为单账号,会把多账号历史混在一起显示。若已无升级前备份,回退后至少需要重新登录

📌 自定义 DB 路径用户注意:若你在 config/app.toml[persistence].db_path 把数据库放到了 config/ 之外,则备份 / 还原 config/wal/ 并不包含该数据库文件——请额外备份 / 还原该真实 DB 文件(含其 -wal / -shm 边车文件)。系统的自动迁移前备份会按 db_path 复制真实 DB 到备份目录,但手动恢复时需把它放回原自定义位置。


✨ 多账号独立任务管理

支持添加 / 切换 / 删除多个百度账号,每个账号拥有独立的客户端实例(BDUSS / Cookie / 会话)与任务队列。下载 / 上传 / 转存 / 自动备份 / 离线下载任务均按 owner_uid 归属与隔离。

实现要点:

  • 数据隔离与归属:所有任务按 owner_uid 归属;删除账号时按 owner_uid 精确清理该账号的本地任务与历史,不误伤其他账号。
  • 跨账号聚合:聚合列表按 id 去重;历史回退路由按 owner_uid + task_type 精确匹配,避免跨账号 / 跨类型误删。
  • 并发安全收口:修复账号切换 / 操作备份任务后的死锁,以及父任务永久卡在 Transferring 的问题;统一收口 uploader 跨 await 持有 DashMap 锁的写法,消除多账号并发下的死锁。
  • 持久化迁移:单账号(session.json)→ 多账号(accounts.json)自动迁移,配套 SQLite schema 升级与 .meta / 历史回填(见下方迁移与备份说明)。

✨ 账号切换器与账号管理面板

  • 顶部新增账号切换器,一键在已登录账号间切换。
  • 设置页新增账号管理面板,集中管理(添加 / 切换 / 删除)账号。

✨ 实时资源配额(BudgetScheduler)

多账号同时下载时,机器总线程数有限,需要在账号之间公平分配。新增 BudgetScheduler 负责实时配额调度:

  • 按会员权重分配:机器总线程 M 按会员权重(普通 : VIP : SVIP = 1 : 3 : 5)在账号间分配,每个账号实时展示「保底 base / 上限 vip_cap」两条水位。
  • 自动按等级推荐:按 VIP 等级取线程上限(普通会员 10 / 超级会员 15),并同时受机器总线程与会员权重共同约束——推荐值是天花板,实际可用线程由总线程 + 权重共同决定。
  • 配额面板真实值:资源配额面板显示后端真实生效值与实际可用线程(不再写死推荐值),界面与实际调度一致。
  • 公平调度:优先级信号量(priority semaphore)公平调度各账号的分片并发。

✨ 启动期自动修复 + 迁移前完整备份

为了让单账号 → 多账号的迁移对普通用户无感,后端启动时按以下流程自动处理,只有在确实无法自动恢复时才进入只读保护:

启动
  ↓
迁移前完整备份(首次 2.0.0 启动且有既有数据时,做且仅做一次)
  ↓
运行迁移矩阵(session.json→accounts.json / SQLite ALTER / .meta 回填)
  ↓
失败?
  ├─ 临时锁 / 占用(database is locked/busy)→ 短退避自动重试(200ms→1s,最多 3 次)
  └─ 不可判定 / 高风险(DB 损坏 / 无权限 / 磁盘满)→ 进入全局只读保护
  ↓
成功则正常启动(用户无感知)

迁移前完整备份

  • 时机:备份发生在任何破坏性操作之前——早于 session.json → session.json.migrated 改名、accounts.json 写入、SQLite ALTER TABLE.meta 回写、历史 owner_uid 回填。备份调用置于服务初始化的最前面,先于任何会写库的组件初始化,确保备份到的是升级前的原始数据。
  • 目标目录config/backups/pre_migration_<时间戳>/
  • 备份内容(存在才复制):
    • app.tomlsession.jsonsession.json.migratedaccounts.jsonaccounts.json.bakautobackup_configs.json
    • 真实数据库文件:按 AppConfig.persistence.db_path 取真实路径(不写死 config/baidu-pcs.db),并一并复制 -wal / -shm 边车文件
    • 整个 wal/ 目录(任务状态 .meta
  • 触发判据:仅当 config/backups/尚无任何有效 pre_migration_* 备份(即本数据目录首次在 2.0.0 启动)且存在既有数据db / session.json / accounts.json 任一存在)时备份一次;之后每次启动因已存在有效备份而跳过,不会堆积。全新安装无既有数据则不备份。
  • 完成标记(manifest):备份成功复制内容后,会在备份目录写入 backup_manifest.json(记录完成时间、真实 DB / WAL 路径、实际复制清单 copied,以及关键文件清单 required)。只有带该 manifest 的目录才被认作有效备份——若仅创建了目录但复制失败 / 不完整(未写 manifest),下次启动不会误以为已备份,而会重新备份,避免「空壳备份」。
  • 关键文件校验(required:manifest 的 required 记录本次按既有数据应当包含的关键项(源端存在才计入):真实 DB 及其 -wal / -shm 边车(-wal 可能含尚未 checkpoint 的数据)、session.jsonaccounts.json、以及 wal/ 任务目录。启动判定有效备份时不仅看 manifest 存在,还会逐项确认这些项真实存在于备份目录;任一缺失即视为无效备份并重做。损坏 / 半写入的 manifest(读取或 JSON 解析失败)一律判为无效;旧版备份(manifest 无 required 字段)按「存在即有效」向后兼容、不会失效。
  • wal/ 内容完整性wal/ 目录必须完整复制——复制时若有任一文件复制 / 读取 / 遍历失败,整次迁移前备份即视为失败(不写 manifest、下次启动重做),不会留下「目录在但内容残缺」的假备份。manifest 另记 wal_fileswal/ 下各文件的相对路径清单),启动校验时逐项核对备份目录内对应文件是否存在,既能识别「数量被删少」也能识别「具体文件被删 / 替换但数量不变」。
  • 失败处理:单个文件复制失败仅告警、跳过;若一项都没复制成功或 manifest 写入失败则视为备份失败(不写标记)。备份失败不阻塞启动;若随后真实破坏性写入失败,会进入只读保护,用户仍可用升级前的手动备份还原。

临时错误自动重试

迁移命中临时性的 database is locked / database is busy(含 SQLITE_BUSY / SQLITE_LOCKED)时,按 200ms → 1s 退避自动重试,最多 3 次;缺列 / 重复列 / 表不存在 / 单账号 owner_uid 回填等情况已由迁移矩阵的幂等守卫吸收,不会误触发只读。


✨ 数据安全兜底·全局只读保护模式

只读模式是最后兜底,正常运行(迁移成功)时用户完全感知不到它,不会影响任何账号的下载 / 上传 / 转存。

  • 触发条件:仅当启动期「单账号 → 多账号」迁移在自动修复 + 重试都失败后,或关键持久化出现不可判定 / 高风险错误(DB 损坏 / 无权限 / 磁盘满)时,才自动置位。

  • 行为:全局拦截所有写操作(POST/PUT/DELETE/PATCH),读取 / 历史照常可用,避免数据已可能损坏时继续写入扩大不一致。

  • 诊断:进入只读前记录明确原因(failed_step / last_error / suggestion),以 info 级日志打印,供后端运维排查(不向用户暴露 migration / owner_uid / SQLite 等术语)。

  • 用户提示(自助恢复,无需联系开发者)

    服务端检测到数据异常,已进入只读保护模式以避免数据损坏。请先重启后端再次尝试自动修复;若重启后仍未恢复,请还原升级前备份的 config/wal/ 目录后重启;系统也会在升级迁移前自动备份到 config/backups/pre_migration_<时间戳>/

文案只承诺「再次尝试自动修复」,不承诺一定修复成功——遇到 DB 真损坏等持久问题时,用户可按提示还原升级前备份并回退版本。


✨ 断线自适应退避重连

后端临时不可达时,下载 / 上传页按阶梯退避重试轮询,0 B/s 显示「计算中」,避免一次轮询失败就清空任务列表、进而把自适应轮询直接停掉。下载页与上传页行为对齐:失败时保留现有列表,维持 active 状态以便退避重试继续。


🐛 问题修复(与多账号无关的通用项)

  • 🐛 下载取链 errno=8002 临时风控:命中风控时按阶梯式重试,提升弱网 / 风控下的成功率。
  • 🐛 filemetas 按路径查询:改用 xpan/file list 解析 fs_id,规避按路径查 filemetas 的不稳定。
  • 🐛 创建即持久化下载任务:任务创建时即落盘,重启后保留终态失败任务(不再丢失失败记录)。

🔧 升级说明

Docker 用户

# 升级前先备份挂载的 data 卷(强烈建议)

# 拉取指定版本镜像
docker pull komorebicarry/baidupcs-rust:v2.0.0

# 或使用 latest 标签
docker pull komorebicarry/baidupcs-rust:latest

# 重启容器
docker-compose down && docker-compose up -d

二进制用户

升级前先备份 backend/config/backend/wal/,再从 Releases 页面下载对应平台的二进制文件,替换原有可执行文件后重启服务。

配置与数据

  • 升级时后端会自动完成单账号 → 多账号的数据迁移(session.jsonaccounts.json、SQLite 新增 owner_uid 列、.meta / 历史回填),并在迁移前自动备份到 config/backups/pre_migration_<时间戳>/,正常情况下用户无感知。
  • 迁移成功后无需任何手动操作。若启动后界面提示「只读保护模式」,请按提示先重启后端再次尝试自动修复;仍未恢复时还原升级前备份的 config/wal/ 目录后重启。
  • 默认端口仍为 18888,不影响现有反向代理 / 防火墙 / 书签。

📁 下载

平台 文件名
Windows (x86_64) BaiduPCS-Rust-v2.0.0-windows-x86_64.zip
Linux (x86_64) BaiduPCS-Rust-v2.0.0-linux-x86_64.tar.gz
Linux (ARM64) BaiduPCS-Rust-v2.0.0-linux-aarch64.tar.gz
macOS (x86_64) BaiduPCS-Rust-v2.0.0-macos-x86_64.tar.gz
macOS (ARM64) BaiduPCS-Rust-v2.0.0-macos-aarch64.tar.gz
Docker 镜像 BaiduPCS-Rust-v2.0.0-docker.tar.gz

完整更新日志:参见项目根目录的 CHANGELOG.md
问题反馈:欢迎通过 GitHub Issues 进行反馈