Skip to content

Releases: aliveranme/BBDown

BBDown v1.6.17

Choose a tag to compare

@github-actions github-actions released this 30 Aug 10:14
32d7fb5

修复

  • mp4box 混流临时产物扩展名兼容性:混流事务化的临时输出名 .muxing-{guid} 为未知扩展名,mp4box(GPAC)按扩展名推断输出封装格式,新版 filter-based MP4Box 上行为随版本而异(可能告警回退甚至失败)。现临时名以 .mp4 结尾,新旧版本全部确定性走 ISOM 封装(ffmpeg 分支本就用 -f mp4 强制格式,不受影响)。
  • 多线程下载遇不支持 Range 的服务器时整批中止:多线程分片路径在服务器以 200 响应 Range 请求时抛出的 NotSupportedException(及其它白名单外异常)会穿透页面级与批级两级 catch 过滤器,导致多 P 批量中一 P 命中即放弃剩余分 P、丢失完成通知与失败汇总。现抛出点规范化为 InvalidOperationException 并将过滤器补齐 AggregateException
  • SubOnly 模式 ASS 字幕产物扩展名错误:ASS 内容字幕被无条件改名为 .srt,播放器无法渲染。现按源字幕内容形态决定目标扩展名。
  • <publishDate:...>/<videoDate:...> 占位符在特定区域设置下产出非法文件名:自定义日期格式的 : 是时间分隔符占位符,fi-FI 等区域下输出形如 22.13,en-US 下输出含 :(Windows 上可写入 NTFS 备用数据流,资源管理器不可见)。现固定 InvariantCulture 格式化并对替换值做文件名净化(与 ffmpeg creation_time 的收口同构)。
  • 重跑已下载视频时封面/装饰文件残留:混流锁内权威跳过分支漏删封面文件(每次残留一张且 aid 目录永远非空);DASH 分支跳过路径的多处裸 File.Delete/Directory.Delete 在文件恰被杀软/索引器持有时抛 IOException,把"已下载成功"翻成整页失败重试。现已与 FLV 分支对齐统一包裹清理。
  • serve 交互式选项导致任务不可取消地占死并发槽:客户端经 API 提交 {"interactive":true} 会让任务阻塞在 Console.ReadLine——不可被取消中断,少量任务即可占满 --max-concurrent 直至进程重启。现 serve 下强制关闭交互式模式。
  • 特定区域设置下视频发布时间元数据丢失:ffmpeg creation_time 时间戳的自定义格式未固定文化,: 在 fi-FI 等区域设置下被解析为时间分隔符占位符(产出形如 19.30.00 的非 ISO-8601 串),av_parse_time 解析失败后元数据静默丢失。现追加 CultureInfo.InvariantCulture
  • 杜比视界自动切 mp4box 时封面静默丢失-itagscover 值(本地封面路径)未按 mp4box itags 值转义规则处理,Windows 路径中的 \ 被当转义序列消费。现与同函数其它 itags 值一致走 EscapeString
  • 配置文件 URL 被 URL 形值的命令行选项误压制BBDown.config 中写了下载 URL、命令行又恰好携带值形似 URL 的选项(如 --aria2c-proxy http://127.0.0.1:7890--work-dir av123)时,配置里的 URL 被误判"命令行已给出"而丢弃,Spectre 报缺少必填参数。现仅对位置参数应用 URL 启发式(选项值不再参与判定)。
  • FLV 跳过下载路径残留临时元数据文件:FLV 跳过路径未清理封面、字幕与章节文件,且章节清理此前仅匹配固定名 chapters 而未覆盖 muxer 产出的唯一名 chapters-{basename}。现与 DASH 分支行为对齐并在跳过/失败路径按 chapters* 前缀兜底清理。
  • serve 已完成任务溢出裁剪按完成顺序误删finishedTasks 按完成时间追加,旧逻辑直接移除列表头部会误删"后创建但先完成"的任务。现改为按 TaskCreateTime 排序裁剪最旧创建的任务。
  • Parser 大会员回退硬编码域名与子串匹配脆弱:番剧大会员回退网页源硬编码 www.bilibili.com(忽略 EpHost 镜像配置);大会员错误判定依赖裸子串 \"大会员专享限制\" 易受文案漂移影响。现 host 跟随配置,判定优先解析 JSON 根 message 字段。
  • BaseUrlRegex 贪婪匹配误判 query 为端口:原正则 http.*:\d+ 会将 http://host/path?x=1:2 中 query 的 :数字 误判为端口。现收紧为 ^https?://[^/:]+:\d+

改进

  • serve API 响应与持久化健壮性/get-tasks 族响应补 Cache-Control: no-storeX-Content-Type-Options: nosniff(任务数据含服务器绝对路径,禁止缓存落盘),认证限速与查询限速的 429 响应补 Retry-After: 60;任务持久化临时文件名带 GUID(对齐订阅历史,同目录多实例不再互相踩踏写盘);同一产物不再在任务快照中重复记录(AddSavePath 去重)。
  • wiki 同步脚本健壮化scripts/sync-wiki.ps1 检查 git 命令退出码(此前 commit 失败仍报成功)、自动清理 wiki 上源目录已删除的页面、异常时恢复调用目录。
  • 进程与解析层健壮性:直播杜比视界的 ffmpeg 版本探测改真异步(不再在下载链路同步阻塞最多 5 秒,超时后补观察管道任务);用户取消(Ctrl+C/关停)不再被解析层"免二压重发"降级路径吞掉;免二压降级路径下杜比/Hi-Res 音轨不再重复追加;番剧 gRPC 移除与目标主机不符的硬编码 Host 头;收藏夹翻页遇空页提前结束(防畸形 media_count 触发请求洪泛);国际版番剧接口删除多余的双重转义替换;登录轮询的重定向跳数上限改为确定性失败(不再误触发整流程重试)。
  • 文档修正:wiki 退出码表删除虚构的 2/3 退出码并修正 Ctrl+C 归属(主命令实际返回 130、子命令 0、工具缺失归 1);参数总表补 --host/--ep-host/--tv-host/--area;README serve 配置注入说明补全选项列举。
  • CLI 命令层全量迁移 AsyncCommandlogin/logintv/article/live/sub check/watchlater/serve 7 个命令不再以 Task.Run + GetAwaiter().GetResult() 阻塞线程池线程等待异步操作(serve 长驻进程此前整个生命周期额外占用 1 个阻塞线程);serve 链路改为真异步(RunAsync/StartServerAsync),监听地址前置校验独立为 ValidateListenUrl。各命令退出码与错误语义不变。

安全性

  • serve 无 token 模式 DNS rebinding 防线:浏览器同源 GET 不携带 Origin,写端点的 Origin 校验保护不到读端点——攻击者网页经 rebinding(攻击者域名解析到 127.0.0.1)可读取 /get-tasks* 响应中的任务数据(含服务器绝对路径)。现无 token 时强制 Host 头为字面回环(localhost/127.0.0.0/8/::1,不做 DNS 解析),携带 token 的反代/自定义域名部署不受影响。
  • aria2c 输入换行注入面收口:aria2c input-file 语法中换行即指令行分隔符,来自 API 响应的 URL 与用户配置的 Cookie 未剥离 CR/LF 时可注入任意 aria2c 指令行(新 URI/all-proxy/dir 等)。现写入 stdin 前剥离换行。
  • 服务器可控文本不再直拼文件路径:字幕语言代码(lan)、音频 ID(audio_id)来自接口响应(镜像站/--insecure 属项目威胁模型内的对抗源),含 ..\ 时可写出工作目录。现统一经 GetValidFileName 净化后再拼路径。
  • HTTP 响应体大小上限:gzip 解压侧已有 48MB 上限,但压缩响应体本体与普通响应体无上限,被攻破端点或 --insecure 中间人可用巨包/分块慢发响应耗尽进程内存。现统一 64MB 上限(Content-Length 预检 + 逐块累计双拦截)。
  • serve 日志注入残留收口:解析失败日志两处原始 option.Url 未单行化,客户端可借请求体 URL 中的 CR/LF 伪造日志行。现统一过 SanitizeLogString
  • Widevine 许可证请求禁跟随重定向:许可证 POST 的请求体是设备私钥签名的 challenge,原 VerifiedAppHttpClient(允许自动重定向)会在 307/308 上连同 body 重放到跨主机目标。新增 VerifiedNoRedirectClient(始终校验证书 + 禁自动重定向,独立连接池不受 --insecure 降级),3xx 显式报错不跟随(与 gRPC POST 的凭据收口同构)。
  • serve 认证失败限速字典有界裁剪:防止攻击者使用大量独立 IP 或伪造 XFF 标头导致限速记录字典无界增长,在超过上限 MaxTrackedAuthFailureIps 时按最后失败时间自动裁剪,保留最近活跃记录。
  • 登录轮询跟随重定向逐跳可信主机校验GetWebSourceWithSetCookiesAsync 切换为禁自动跳转客户端手动逐跳,每跳发起前校验 IsTrustedCookieHost,防止重定向将用户凭证及下发的 Set-Cookie 泄露至不可信主机。

测试增强

  • 全库测试 666 例(新增 7 例):serve Host 白名单端点行为(evil Host 403/回环放行/带 token 跳过校验)与纯函数判定、aria2c stdin 单行化、日期占位符文化无关与路径净化(fi-FI 区域下断言)、HTTP 响应体上限判定、serve Interactive 清零等。
  • 此前批次(659 例,新增 25 例):VerifiedNoRedirectClient 身份稳定性、GET/POST 307 不跟随、配置合并 URL 形值选项回归、章节前缀清理、认证字典限速有界裁剪、已完成任务溢出按创建时间排序、大会员 JSON message 字段解析、BaseUrlRegex 严格匹配、登录轮询逐跳重定向安全拦截与合法跟随等。

Commits

  • release: 发布 v1.6.17——第 12 轮审查消纳(管线过滤器/rebinding 防线/路径净化/混流兼容性/文档修正)
  • fix: RF-23 混流临时名补 .mp4 后缀 + 消纳 Info 级观察 8 项
  • fix: 消纳第 12 轮审查发现 RF-14~RF-29
  • docs: REVIEW_PLAN 第 12 轮记录、REVIEW_FINDINGS RF-14~RF-29 登记、新增 fork 与上游差异文档
  • docs: REVIEW_PLAN 第 11 轮记录、REVIEW_FINDINGS RF-8~RF-13 结转、CHANGELOG 未发布条目
  • fix(core): RF-11 大会员回退适配镜像站与 JSON 解析、RF-12 正则收紧、RF-13 登录轮询逐跳校验
  • fix(serve): RF-9 认证失败字典有界裁剪、RF-10 已完成任务溢出按创建时间排序
  • fix(download): RF-8 FLV 跳过路径补充清理未消费元数据文件、章节按前缀兜底清理
  • docs: REVIEW_PLAN 第 10 轮记录、REVIEW_FINDINGS RF-2 结转、CHANGELOG 未发布改进条目
  • refactor(cli): RF-2 命令层一次性批量迁移 AsyncCommand
  • docs: REVIEW_PLAN 第 9 轮记录、REVIEW_FINDINGS RF-4~RF-7 状态结转、CHANGELOG 未发布条目
  • fix(config): RF-7 cliHasUrl 只对位置参数应用 URL 启发式
  • fix(drm): RF-4 许可证请求切换 VerifiedNoRedirectClient 并显式拦截 3xx
  • fix(muxer): RF-5 creation_time 固定 InvariantCulture、RF-6 mp4box cover 值补 EscapeString
  • docs: REVIEW_PLAN 第 8 轮续审记录与 REVIEW_FINDINGS 新增 RF-5~RF-7
  • test(parser): 新增 ExtractTracksAsync 夹具回放护栏(FakeBilibiliApiServer + 14 场景)
  • refactor(core): UGC web playurl 主机引用 Config.Host 并使 API 前缀感知 scheme
  • docs: 补 --trusted-proxy 与 BBDOWN_SERVE_TOKEN 用户文档并修正环境变量表述
  • docs: 新增维护计划——Parser 护栏测试与 serve 安全选项文档同步
  • docs: 新增 AGENTS.md 代理协作指引
  • fix(core): 凭据门收口、文化不变解析与截断误报修正
  • fix(live): 丢弃不足完整 FLV 头的垃圾段;live/article 相对输出落 work-dir
  • fix(download): 只读模式删目录加空守卫并清理 .merging 残留
  • fix(muxer): mp4box 分支编入配音/背景音轨并统一工具缺失异常类型

Downloads

Platform Architecture
Windows x64, arm64
Linux x64, arm64
macOS x64, arm64

Full Changelog: v1.6.16...v1.6.17

BBDown v1.6.16

Choose a tag to compare

@github-actions github-actions released this 18 Aug 23:08

修复

  • 带字幕/副音轨视频混流必失败-metadata:s:s:N/-metadata:s:a:N/-disposition 等 ffmpeg 输出选项原紧跟在各自 -i <输入> 之后被当作输入选项——旧版 ffmpeg 直接报 Option ... cannot be applied to input url ...srt 导致带 CC 字幕/多音轨视频合并必失败,新版则静默丢失 stream 元数据(字幕标题等写不进输出流)。现统一收集到 outputArgs 在全部 -i/-map 完成后追加,并新增单元(输出选项必须位于最后 -i 之后)与真实 ffmpeg/ffprobe 集成(字幕 language 写入验证)回归测试。
  • --comments 评论永远保存失败:评论在混流(MuxAV 才创建输出目录)之前保存,目标父目录不存在时 DirectoryNotFoundException 被降级吞掉。SaveToJsonAsync 保存前自动创建父目录(保存函数自包含),并补父目录缺失场景回归测试。

改进

  • article/live 子命令支持 --work-dir:默认输出路径(专栏 Markdown / 直播录制与 .segs 分段)落到指定工作目录;用纯函数 ResolveWorkDir 解析(仅展开环境变量+建目录),不切进程 CWD、无全局副作用。
  • 单选分 P 命名修正:保存路径模板改按【实际下载分 P 数】决策——-p 单选 1 集时即使视频总 P>1 也走单 P 模板(-F 生效、产物不再带 [P##] 前缀);番剧未完结仍固定按多 P 处理。
  • 弹幕/评论文档与帮助文本--download-danmaku-formats 注明仅支持 xml,ass--danmaku-filter 注明仅作用于 ASS 弹幕(XML 保留原始全量);--comments 注明仅在第 1 个分 P 下载一次(视频级防重复);README 同步补充。
  • 审查收尾:抽出 Program.ResolveWorkDir 纯函数消除 article/live 的进程 CWD 副作用,并澄清 Workflow 中仅保留 API 形状的冗余赋值。

测试增强

  • 全库测试 629 例(新增 7 例):路径模板决策(单/多 P、番剧、-F/-M 组合)、混流出选项位置全场景(主+2 副音轨+封面+2 字幕)、真实 ffmpeg 带字幕混流后字幕 language 经 ffprobe 验证写入、评论父目录缺失自动创建等。

Commits

  • release: 发布 v1.6.16——混流出选项/评论保存修复、article/live work-dir、单P命名按实际下载数
  • refactor: 审查收尾——ResolveWorkDir 纯函数消除 CWD 副作用、澄清冗余赋值
  • feat: 处理 C 项观察点——article/live 支持 work-dir、单P命名按实际下载数
  • fix: 修复带字幕/副音轨混流必失败与评论保存失败
  • fix: 同步 BBDown.csproj 版本号至 1.6.15 并补全 CHANGELOG compare 链接(1.6.9~1.6.15)
  • docs: add comprehensive wiki documentation and sync script

Downloads

Platform Architecture
Windows x64, arm64
Linux x64, arm64
macOS x64, arm64

Full Changelog: v1.6.15...v1.6.16

BBDown v1.6.15

Choose a tag to compare

@github-actions github-actions released this 18 Aug 21:20

修复与安全性加固

  • serve 模式令牌优先级修复:修复 --serve-tokenBBDOWN_SERVE_TOKEN 优先级反转缺陷,确保环境变量优先于 CLI 参数,并在两者同时设置且值冲突时记录警告日志。
  • B 站官方域名白名单统一:抽取 HTTPUtil.OfficialHostSuffixesIsOfficialBilibiliHost 为唯一定义源,消除 HTTPUtil.CookieTrustedHostsUrlResolver.TrustedBilibiliHostsBBDownApiServer.OfficialHostSuffixes 之间潜在的白名单漂移风险。
  • serve 并发限流与测试隔离/get-tasks 族查询端点引入并发信号量限流(上限 8),防止高并发深拷贝任务快照耗尽 CPU/GC;将 BBDownApiServer._persistFailures 改为实例字段,杜绝并发测试实例间的状态串扰;新增 --trusted-proxy 选项以支持反代 XFF 客户端 IP 计键限速。
  • 凭据外发与传输层纵深防御:带 Cookie 的请求在发送前强制校验目标是否为官方或显式配置的信任域名,拦截非可信凭据外发;--insecure 不安全连接的 Date 响应头不再参与全局时钟校准(防跨流 WBI 扰动);gRPC POST 拦截 3xx 重定向防凭据随跳转外发;媒体下载切换至禁用自动跳转的 MediaDownloadClient;gzip 解压设定 48MB 安全上限防解压炸弹;gRPC 帧首字节合法性校验;异常消息回显前剥离控制字符。
  • 解析与格式化修复:强制数字解析使用 CultureInfo.InvariantCulture 避免特定区域设置下解析异常;完善 gRPC 必填参数校验;拦截负数分 P 参数;修复国际站(biliintl/bilibili.tv)域名匹配与解析容错;修复弹幕 ASS 格式化及分 P 别名缺陷。
  • 分片清理一致性:统一轨道分片类型判定全部走 IsVideoClipPath(不区分大小写),修复 DownloadClipsAsync 返回分片路径处仍使用大小写敏感 EndsWith(".mp4") 判断的漏网,消除极端文件名下视频/音频分片 .vclip/.aclip 分类与清理规则错位的可能。

测试增强

  • 全库测试扩充至 600+ 例:新增 serve token 环境变量优先级测试、B 站官方域名白名单覆盖测试、进程树哨兵验证、3-clips 分片哈希比对、查询并发信号量端点测试等。

Commits

  • ci: create-release 只下载 BBDown_* 发布产物——排除 docker buildx 缓存 artifact,防偶发下载失败拖挂发布
  • docs: 发布 v1.6.15——落定 CHANGELOG 版本号并补记分片清理一致性修复
  • docs: 新增 REVIEW_FINDINGS.md——审查发现与建议跟踪(RF-1~RF-4,含已采纳/技术债/维持现状/待议)
  • fix: 统一分片扩展名判定走 IsVideoClipPath——修复第 6 处大小写不一致漏网(844 行仍用区分大小写 EndsWith)
  • fix: 修复 serve token 环境变量优先级、统一 B 站官方域名白名单源并补齐 CHANGELOG
  • fix: 修复数字解析文化不变性、gRPC参数必填校验、分P负数拦截与投稿列表分页诊断
  • fix: 修复国际站白名单、gRPC与JSON解析容错、弹幕ASS格式化及分P别名缺陷
  • refactor: 补 H 组/I 组低风险项收尾——Pages.cs 悬空 XML 注释删除 + REVIEW_PLAN 状态更新
  • refactor: 低风险可读性清理(H7/H12/H13 + I17-I20)——死代码、拼写、record 化、魔法数具名、注释归位
  • fix: B3 补充安全加固 8 项——Cookie 白名单纵深防御、时钟偏移不可信源隔离、凭据请求禁跟随重定向、gzip 解压上限与帧校验、异常消息净控
  • fix: D8 HTTP 查询并发上限——/get-tasks 族加查询信号量防无限深拷贝放大 CPU/GC
  • fix: B3 独立安全审查——签名媒体 URL 日志脱敏穿透下载链路、畸形帧空判、WBI key 掩码
  • test: 功能/韧性测试补齐(第 2 轮,5 项)——进程树哨兵验证、确定性断言、3-clips 字节级、直播与幂等分支
  • test: 测试套件结构加固(第 1 轮,8 项)——failSkips 防静默跳过、墙钟改区间重叠、动态端口、捕获前值恢复、契约断言补全
  • docs: 新增 REVIEW_PLAN.md——剩余 47 项审查修复全量排期(7 轮)
  • test: 契约测试补齐——CSRF/认证限速/cancel 端点测试、413 契约对齐、看门狗 per-call 注入、程序集级串行
  • fix: 应用层——LATEST 别名全词匹配修复(C1)、字幕降级补 TimeoutException(E1)、Download.cs 缩进对齐
  • fix: 下载/直播/订阅韧性——VOD 读停滞看门狗、分片扩展名大小写统一、直播短段退避、进程管道成功路径超时、订阅历史有界、itags CRLF 转义
  • fix: serve 安全加固——ForceHttp 清零、trusted-proxy XFF 限速计键、数值 Clamp 防慢速 DoS、RetryCount 统一 [1,3]、日志单行化、IPv6 字面量 DnsSafeHost、token 环境变量支持
  • fix: Core 韧性加固——字幕降级补 TimeoutException、Widevine 许可证有界重试与超时分类、重定向 GET 兜底重试、fetcher 业务 code 诊断、Logger.LogStack 完整堆栈落盘
  • fix: codeql 抑制注释改为纯标记独占一行(GitHub 要求不能含其他文本)
  • fix: codeql 抑制注释移至告警行上方(CipherMode.ECB),确保 suppression 生效
  • docs: CodeQL ECB 告警抑制——CMAC/零 IV 单块操作属协议要求,非多块模式泄露
  • fix: CodeQL 补 security-events: write 权限——SARIF 上传到 Code scanning 页失败
  • fix: 回滚 setup-dotnet cache: true——项目未启用 packages.lock.json,CI 报错
  • chore: 仓库优化四连——Dependabot/CodeQL/GHCR镜像/SHA256/徽章/缓存/分支保护
  • ci: 构建产物保留期收紧为 7 天(build_latest/release/pr 共 13 处 upload-artifact)
  • fix: release workflow 幂等化——release 已存在时跳过创建、直接上传构建产物

Downloads

Platform Architecture
Windows x64, arm64
Linux x64, arm64
macOS x64, arm64

Full Changelog: v1.6.14...v1.6.15

BBDown v1.6.14

Choose a tag to compare

@aliveranme aliveranme released this 18 Aug 13:29

修复与安全性加固

  • serve 三层安全防护:认证失败按来源 IP 滑动窗口限速(1 分钟 5 次后返回 429)并记录 401 失败日志,令 X-Serve-Token 暴力枚举失效;写端点(/add-task//cancel//remove-finished)新增 CSRF/跨源防护——校验 Origin 必须为回环来源或缺失(非浏览器客户端),/add-task 强制 JSON Content-Type(text/plain 是 CORS 简单请求载体,可直接跨源发出不触发预检);任务错误消息经 /get-tasks 返回前脱敏绝对路径,防止泄露服务器文件系统布局。
  • 日志与敏感信息脱敏PlayViewReply 调试日志不再全文落盘——1KB 截断并脱敏媒体 URL 中的 sign/x_sign/w_rid 签名参数(临时签名 CDN 地址落入日志等于外泄下载权);敏感键新增 DedeUserID
  • 外部工具查找防劫持FindExecutable 不再搜索当前工作目录(BBDown 常在下载目录运行,目录中先前植入的 ffmpeg.exe/aria2c.exe/mp4box.exe 伪造二进制会被静默执行),改为程序目录优先 + PATH;Unix 上校验执行位。
  • 时钟校准收窄:仅对 WBI 签名权威主机 api.bilibili.com(含子域)校准服务器时钟,其它边缘服务器(番剧/国际版)的 Date 不再写入全局偏移(避免抖动签名基准);偏移阈值从 ±24h 收紧到 ±1h。
  • HTTP 重试与超时语义:登录轮询(GET)加入与常规请求一致的有界重试 + 指数退避(此前零重试,任一次瞬时 5xx/超时直接中断扫码流程);POST 超时转可读 TimeoutException(调用方均为幂等查询,保留 5xx/超时有界重试);风控 HTML 识别双剥 BOM,堵住裸 JsonException 回潮。
  • 取消信号正确传播:Widevine 许可证请求、混流、通知回调中的 OperationCanceledException 不再被 catch (Exception) 吞掉——取消后不再误报"解密失败"、不再打印"任务完成"。
  • 混流轨道清理兜底:已下载的音视频/字幕/封面轨道清理并入 finallyCleanupDownloadedTracks),混流失败/异常/取消路径不再残留 GB 级临时文件;Decrypt 终止进程后等待 stderr 任务,消除 UnobservedTaskException
  • 解析防御性加固:bilidrm kid 仅接受 32 位 hex(畸形 URI 不再一路带到 mp4decrypt);flv 最高清晰度重发失败(网络/超时/解析异常)沿用首次已校验响应降级;互动视频 player.so 解析降级为可读错误;WBI 密钥材料长度校验(短于 58 字符时降级保持原密钥而非越界崩溃)。
  • 文件名与语言码修复:文件名尾随点/空格裁剪(Windows 拒绝以点/空格结尾的名称,纯点串兜底产出合法基名);字幕语言码 BCP-47 大小写规范化(zh-twzh-TW/yue-hkyue-HK,修复小写语言码被错误标记为 und)。
  • 混流与进程健壮性:无主音轨时素材元数据下标起点修复(标题不再错位);aria2c 进程级 6 小时兜底超时(防僵死永久占并发槽);未闭合引号不再吞掉整段 --aria2c-args 配置;直播分段合成捕获 Win32Exception

新增测试

  • 全库 515 个测试全部通过:新增文件名尾随点/空格与纯点串净化 8 例、serve 错误消息脱敏 URL/相对路径 2 例;时钟校准(±1h 阈值、非权威主机不覆盖偏移)与 POST 超时重试语义测试更新。

Commits

  • release: v1.6.14
  • fix: 审查修复——纯点/空格文件名兜底、恢复POST幂等查询重试、工具搜索优先级、限速字典清理、路径脱敏正则、BCP-47条件简化
  • fix: 安全与健壮性加固——serve认证限速/CSRF防护/路径脱敏、签名URL日志脱敏、工具搜索防劫持、取消传播与资源清理、解析与重试防御性加固

Downloads

Platform Architecture
Windows x64, arm64
Linux x64, arm64
macOS x64, arm64

Full Changelog: v1.6.13...v1.6.14

BBDown v1.6.13

Choose a tag to compare

@github-actions github-actions released this 18 Aug 09:45

修复与安全性加固

  • 直播录制加载登录凭据,自动录制账号可看最高画质live 命令此前不加载凭据,getRoomPlayInfo 对未登录请求只返回游客画质(最高 720P);现在录制前统一走 InitializeRequestSessionAsync--cookie 显式传入优先,否则读取本地 BBDown.data),并新增 --cookie / --access-token 选项;画质请求从 qn=10000 提升为 qn=30000(按账号权限回落,接口只列 ts/fmp4 时自动回退 qn=10000 再取一次),启动时打印实际解析到的画质;登录检测超时自动安全降级,防止离线启动时异常崩溃。
  • Ctrl+C 停止保留已录制内容:取消发生在分段读取中时,已写字节此前会随"无数据"分支整段丢弃(录制几分钟后 Ctrl+C 会丢掉全部内容);现在读/写阶段被取消都照常返回已写字节,当前分段计入已录内容并参与合成保存。
  • 录制结束与终结态清理临时目录:成功后或未录到任何分段便遇终结态异常退出时,不再残留空的 path.flv.segs 根目录(会话目录清空后自动删除空的 .segs;根下仍有其它会话的保留分段时不删);合成失败仍保留分段供手动恢复。
  • 断流/网络中断自动重连续录
    • 读停滞看门狗:连接既不复位也不 EOF、只是不再有数据(网络黑洞)时,无超时客户端上的 ReadAsync 会永久挂起、录制卡死——现在每收到数据重置 60 秒计时,超时按读中断自动重连;
    • 无限重连:旧实现重连 3 次即放弃,断网几分钟必然提前终止、网络恢复后不会自动继续——现在只要直播间仍在直播且用户未取消,就持续指数退避重试(3s→30s 封顶),网络恢复后自动续录;
    • 分段尾裁剪:网络中断/取消使段尾只剩半个 FLV 标签时,ffmpeg concat demuxer 会在截断处报错中止整个合成——合成/改名前先把每个分段裁到最后一个完整标签,且支持 Filter 标志掩码识别;
    • 终结态区分:直播间不提供 flv(仅 HLS/ts)与本地写盘失败(LiveStreamWriteException 异常过滤对齐)不再无限重试,直接报错并保留已录分段。

新增测试

  • 直播录制集成测试新增至 499 个并全部通过:取消保留内容、断流重连合成、读停滞看门狗重连、下播 NoData、qn=30000 最高画质请求与回落、无 flv 终结态、FLV 截断尾裁剪(含 Filter 位)、终结态空目录清理与登录检测取消传播/超时降级等用例(本地假 B 站服务器覆盖完整录制循环)。

Commits

  • release: v1.6.13
  • test: 修正 CheckLoginWithDetails 取消令牌传播测试语义与断言
  • fix: 直播录制健壮性修复——登录凭据加载/取消保存/断网自动重连/临时目录清理 (#28)

Downloads

Platform Architecture
Windows x64, arm64
Linux x64, arm64
macOS x64, arm64

Full Changelog: v1.6.12...v1.6.13

BBDown v1.6.12

Choose a tag to compare

@github-actions github-actions released this 16 Aug 20:06

修复与安全性加固

  • 直播录制完整性校验LiveStreamUtil 合并直播分段改用临时 staging 文件并在合并后校验产物大小(outLen >= totalInputBytes * 0.8),杜绝因 ffmpeg 遇坏段截断退出而静默删除原始分段丢失数据;引入 LiveRecordResult 明确区分完全成功、合并失败保留分段及无数据状态。
  • HTTP 超时与取消语义规范化HTTPUtil 内部超时 CTS 耗尽后转为 TimeoutException 抛出,避免被 CLI 顶层误判为主观取消(退出码 130);为 GetWebSourceWithSetCookiesAsync / GetWebSourceAnonymousCheckedAsync 补齐 ApiTimeoutMs 整体超时;修复 using 声明在 EnsureSuccessStatusCode() 之前导致的 4xx/5xx 连接未 Dispose 泄露。
  • 下载编排与并发控制Download 路径独占锁命中跳过时清理败者任务已下载的临时音视频/字幕文件;为 FLV 分支补齐弹幕下载、--danmaku-only--cover-only 支持;多线程分片下载遇确定性不支持 Range 时立即抛错,不再做无意义退避重试。
  • Core 模块与各 Fetcher 健壮性BangumiInfoFetcher / IntlBangumiInfoFetcher 修正指定 epid 试看分P被意外过滤的问题,未匹配 ep 时抛出明确的 KeyNotFoundExceptionFavListFetcher 收藏夹翻页遇到风控或非零 code 时显式中断并报错;免二压第二轮请求增加异常捕获平滑降级与播放受限校验;所有 backup_url 改用 EnumerateArraySafe 杜绝畸形非数组崩溃。
  • 混流与分段合并BBDownMuxer.MergeFLV 单分片路径免除 ffmpeg 依赖直接移动;多段 FLV 合并中间 .ts 文件使用 try-finally 保证在异常或取消时必被清理;CheckFFmpegDOVI 增加 5 秒异步超时保护。
  • DRM、字幕与弹幕安全WidevineCdm 全链路传递 CancellationToken 并在密钥解析完毕后通过 CryptographicOperations.ZeroMemory 清理内存中的密钥材料;WvdDevice.ParseWvd 补充 Span 边界检查防越界;SRT 字幕正文 --> 转义防时间轴错位;ASS 弹幕正文反斜杠 \ 转义防恶意排版标签注入;弹幕时间解析失败时跳过生成该条 Dialogue。
  • Serve API 与 CLI 命令安全BBDownApiServer 净化客户端传入的 RetryCount / RetryDelay、清除 Debug 堆栈暴露标志并规范化 Host 剔除协议前缀;SubCommand / WatchLaterCommand 订阅与稍后再看单视频捕获 TimeoutException / TaskCanceledException,防止单项网络抖动中断整批任务;扫码登录严格校验接口返回码 code == 0 以及 access_token 有效性。
  • UI 与并发线程安全ProgressBar 控制台刷新加入 Logger.ConsoleLock,消除多任务并发下进度条与日志字符交织乱码。

新增测试

  • 全量单元测试扩充至 487 个并通过,覆盖直播截断拦截、HTTP 超时转换、Host 规范化、截断 WVD 格式校验、弹幕字符转义等用例。

Commits

  • release: v1.6.12
  • fix: 完整代码审查修复——直播分段合并完整性校验、HTTP超时异常转换、FLV弹幕/封面支持与全库防御性加固
  • fix: 凭据加载安全加固——自动去除 Cookie/Token 前后空白与换行符
  • fix: 遍历审查加固——Page 拷贝构造补全、Parser DRM 字段安全读取、控制台色恢复守卫、订阅目录安全创建
  • fix: 防御性解析加固——课程/直播 code 检查、BV 无效字符、字幕健壮性、UP主空投稿早退
  • fix: 防御性解析加固——fetcher 节点判空/订阅下载容错/稍后再看判空/二维码写入降级
  • fix: 审查修复——WBI 时钟补偿/长路径截断/取消碎片清理/Widevine 诊断/工具探测守卫/Cookie 过期警告/直播格式提示/UP主进度
  • fix: 审查修复——装饰字幕降级/风控页可恢复重试/API 超时重试/跳过假成功复核/尺寸错位修复/前导空白风控识别
  • fix: serve WorkDir 按流隔离 + API 层有界重试/风控页识别 + Logger 失败闭锁;perf: 下载探测合并(HEAD 优先)
  • perf: 日志持久 writer + 分片合并异步化;fix: UA 按流隔离 + 回调 DNS 异步化
  • fix: 安全加固与取消语义修正(SSL 连接池隔离/密钥脱敏/常量时间比较/超时不冒充取消/翻页去重)
  • fix: 修复审查发现的 7 个缺陷(直播断流/重试配置/aria2c 退出码/wvd v2/FLV 校验/元数据转义/路径扩展名)
  • fix: Ctrl+C 取消不再误报为错误——ExceptionHandler 显式识别取消返回 130

Downloads

Platform Architecture
Windows x64, arm64
Linux x64, arm64
macOS x64, arm64

Full Changelog: v1.6.11...v1.6.12

BBDown v1.6.11

Choose a tag to compare

@github-actions github-actions released this 13 Aug 12:16

修复

  • 适配 B 站新版扫码登录协议:B 站已将扫码登录凭证(SESSDATA/bili_jct/DedeUserID 等)从 poll 响应的 data.url 参数迁移到 Set-Cookie 响应头(HttpOnly)下发,data.url 仅剩 crossDomain 跳转参数。旧实现只读响应 body,导致登录“成功”却写入不含 SESSDATA 的无效 cookie,表现为始终提示“Cookie 已过期/账号未登录”。
    • HTTPUtil 新增 GetWebSourceWithSetCookiesAsync,透出 Set-Cookie 响应头;
    • 登录成功时合并 url query(旧协议)与 Set-Cookie(新协议)凭证,自动去重、过滤 cookie 属性(Path/Domain/Expires 等)、转义逗号;
    • 写入前防御性校验 SESSDATA 存在,缺失(中间层剥离/风控拦截)时拒绝落盘并报错;
    • 新增 13 个凭证合并/提取专项单元测试,全量 394 个测试通过。

Commits

  • chore(release): bump version to 1.6.11
  • fix: 适配 B 站新版扫码登录——SESSDATA 改经 poll 响应 Set-Cookie 下发
  • fix: 多线程分片身份检查命中/混流 try-finally/完整 .tmp 校验器/manifest 原子写
  • fix: 混流事务化/多线程分片身份/跨进程续传/订阅历史结构校验
  • fix: 订阅损坏链路闭环/断点续传资源身份校验
  • fix: 会话凭据回传/音视频临时文件隔离/订阅历史损坏隔离
  • fix: 断点 Content-Range 校验/订阅 WBI 初始化/直播分段保留
  • fix: P1 发布前修复——WBI 顶层传播/断点内容可信/直播收尾闭环/CI 集成
  • fix: M0/M1 可靠性——AsyncLocal 配置回传/超长分片/零产物成功/取消断链/直播分段/请求体上限
  • fix(serve): 三轮审查修复——Cookie 外发/假成功/重定向回归/分片完整性/关停收尾
  • fix(serve): JobId 契约 + 默认安全边界 + 取消贯通 + P2 修复,统一 LF 换行符
  • fix(serve): 任务全生命周期可取消 + 混流取消传播 + Docker 监听修正

Downloads

Platform Architecture
Windows x64, arm64
Linux x64, arm64
macOS x64, arm64

Full Changelog: v1.6.10...v1.6.11

BBDown v1.6.10

Choose a tag to compare

@github-actions github-actions released this 03 Aug 18:38

安全

  • webhook 回调 SSRF 重定向封堵:任务完成回调改用专用 AllowAutoRedirect=false 的 HttpClient,不再经共享客户端跟随攻击者可控的 Location 重定向到内网/云元数据地址。
  • 回调全零地址拦截IsSafeCallbackUrl 字面 IP 分支补拦 0.0.0.0[::](连接时绑定回环)。
  • 局域网回调边界说明:字面 IP 的 RFC1918 内网地址仍放行(局域网回调用法);攻击者构造的域名回调走 DNS 解析分支、内网段一律拒绝。需进一步收紧的局域网用户应配置 --serve-token 或前置反向代理。

维护

  • 修复 2 个编译警告:ServeApiSecurityTests 空 host 用例的 null 赋值、IsSafeCallbackUrlliteralIp 可能为 null 解引用。

Commits

  • chore(release): bump version to 1.6.10
  • fix(security): webhook SSRF redirect/loopback hardening + warnings

Downloads

Platform Architecture
Windows x64, arm64
Linux x64, arm64
macOS x64, arm64

Full Changelog: v1.6.9...v1.6.10

BBDown v1.6.9

Choose a tag to compare

@github-actions github-actions released this 03 Aug 18:28

修复(发布前回归审查)

  • mp4box 字幕参数分裂:字幕 :name= 内嵌含空格语言名(如 "Aymar aru")时,在 Unix 上被 .NET 拆成两个 argv 导致混流失败。改为把名称/语言代码放在外层引号内(EscapeString 后保持单 token)。
  • mp4box 音频 lang 引号结构:音频轨 :lang= 的不平衡内层引号在 Windows CRT 下会破坏含引号的 lang 值,改为去掉内层引号、值留在外层引号内。
  • 直播录制失败退出码:重连耗尽抛出的 HTTP 超时 OCE 不再被 LiveCommand 误判为"用户取消"返回 0,改为落到失败分支返回 1(catchwhen (cancellationToken.IsCancellationRequested))。
  • serve host 白名单斜杠绕过IsOfficialHost 不再对含路径/斜杠/用户信息/非默认端口的串做纯后缀匹配(此前 evil.com/.bilibili.com 可被放行,使携带 SESSDATA 的请求发往攻击者主机),改为只接受规范化的纯主机名。
  • serve host 空值回落host/epHost/tvHost 为空或显式 null 时不再原样保留(否则番剧/TV/intl URL 拼成 https:///...UriFormatException),统一回落官方默认。
  • serve 回调 RFC1918 内网封堵:域名解析出的 RFC1918/ULA/CGNAT 地址一律拒绝(DNS 重绑定打内网);字面 IP 的内网地址仍放行(局域网回调用法)。
  • serve 密钥注入封堵/add-task 请求体的 drmKeyHex/drmKidHex 字段被忽略(此前可控制 mp4decrypt 的 key-file 内容)。
  • 免二压取最高画质回归Parser 重请求接管守卫不再要求新响应同时含 video+audio 数组(杜比/FLAC-only 片源会被整体降级到低画质),只要求 video 存在即接管,音轨缺失时从新 dash 的 dolby/flac 节点补出。
  • TV 登录凭据文件权限BBDownTV.dataBBDown.data 一致,创建时即以 600 权限打开,消除 umask 两步窗口。

安全

  • serve 混流命令注入BBDownMuxer 混流时对 lang/author/音轨/字幕语言等外部来源值统一转义并加引号,消除通过 /add-task 请求体 language 字段远程注入 ffmpeg/mp4box 命令行、实现宿主任意文件读写的漏洞。
  • serve 强制 TLS 校验/add-task 请求体中的 insecure 字段不再被接受,serve 下无法再关闭证书校验(此前可借此让携带操作者 SESSDATA 的请求被中间人截获)。
  • serve 路径穿越封堵filePattern/multiFilePattern 请求字段被忽略(可作为保存路径模板做任意目录创建/文件写入),任务一律使用默认保存模板。
  • 回调 DNS 重绑定加固:任务完成回调在建立连接前会再次校验回调地址(IsSafeCallbackUrl),把 add 时校验与连接时刻之间的 DNS 重绑定窗口压缩到最小。

修复

  • 直播录制超时误判HttpClient 2 分钟超时抛出的 TaskCanceledException 不再被当成"用户取消"静默结束录制,而是按瞬态故障进入重连;重连等待期间取消也不再留下孤儿 .part 文件。
  • 直播录制重连语义:主播下播(当前未在直播)作为终结态正常结束并改名为最终文件,不再被当可恢复故障重试 3 次后抛错;WAF/风控返回非 JSON 的 JsonException 也纳入重连。
  • ProgressBar 计时器竞态DisposespeedTimer 回调改用同一把锁同步,消除对已释放 Timer 调用 Change() 导致的进程崩溃(serve 长驻场景)。
  • 订阅文件丢失更新SubscriptionStore 的读-改-写完整序列纳入 _ioLock,并发写者不再互相覆盖。
  • 批量下载超时中止:单个分P 的 HTTP 超时(TaskCanceledException)不再让整批下载中止,进入"记录失败后继续"分支;封面下载不再吞掉用户取消信号。
  • 空收藏夹误导报错:无 -p 时选中分P为空(空收藏夹等)改为抛可读的 InvalidOperationException,而非 ArgumentNullException
  • Parser 免二压丢音轨:重请求响应带 dash 但缺 audio/video 数组时沿用第一轮完整轨道,不再静默丢弃。
  • 直播录制退出码:重连耗尽保留 .part 并抛错,live 命令退出码为 1(此前对超时误判为取消会返回 0)。

测试

  • 新增 DownloadTaskSnapshotTests.AddSavePath_IsVisibleToSnapshotServeApiSecurityTests 断言 SanitizeUntrustedOptions 清空 insecure/filePattern/multiFilePatternWidevineCdmTests 非法 PSSH 用例先验证 wvd 可加载,防止静默退化为 Load 失败路径。
  • CI 两个 workflow 的 dotnet test 增加 --filter "Category!=Integration",与 UrlResolverTests[Trait] 对齐,避免每次 push/tag 触发真实网络请求阻塞发布。

维护

  • BBDownConfigParser 的 URL 形态正则补充 cheese/ 斜杠形式,配置合并不再把裸 cheese/ep123 误判。
  • SensitiveDataMasker 补充 x-bili-exps-bin 设备标识头脱敏。
  • 登录凭据文件(BBDown.data)创建时即按 600 权限打开,消除 umask 权限窗口。
  • API.md/README.md 更新 serve 安全边界说明与直播 .part 行为。

Commits

  • chore(release): bump version to 1.6.9
  • fix(review4): resolve 9 regression defects from pre-release review
  • fix(review3): resolve 20 confirmed defects from 27-agent parallel review
  • fix(review2): resolve 9 defects from second review pass
  • fix(review): resolve 11 defects found by /code-review on new features
  • feat: add live recording, subscriptions, comments, articles, watchlater and notify
  • fix(audit): resolve 29 confirmed defects from parallel code review

Downloads

Platform Architecture
Windows x64, arm64
Linux x64, arm64
macOS x64, arm64

Full Changelog: v1.6.8...v1.6.9

BBDown v1.6.8

Choose a tag to compare

@github-actions github-actions released this 01 Aug 11:43

安全

  • DRM 密钥进程列表暴露mp4decrypt 解密密钥改为通过临时文件传递(--key-file),避免命令行对同主机 ps aux 可见。临时文件使用后覆写并删除。
  • Debug 日志密钥脱敏:Widevine 解密密钥在 debug 日志中仅显示前 8 字符。
  • SSL 跳过诊断增强--insecure 模式下记录被跳过的证书错误类型到 debug 日志,便于排查。

修复

  • WidevineCdm 异常吞噬:protobuf 解析失败和 RSA 解密失败不再静默吞错,改为记录诊断日志并降级返回 null。
  • 异步死锁防护LoginCommandLoginTVCommandBBDownApiServer.GetAwaiter().GetResult() 调用改为 Task.Run(...).GetAwaiter().GetResult(),防止被 GUI 宿主复用时死锁。
  • 调试日志文件清理:仓库根目录遗留的 20 个 debug_*.json 已删除,并加入 .gitignore

测试

  • 新增 WidevineCdmTests:PSSH 解析边界、非法输入降级。
  • 新增 ParserTestsThrowIfPlayLimited 全覆盖、WbiSign、Codec 映射。
  • UrlResolverTests 添加 [Trait("Category", "Integration")] 标记,CI 可通过 --filter 排除。

维护

  • .remember/.pi-subagents/debug_*.jsonartifact/ 加入 .gitignore
  • Parser.cs Dispose 所有权说明注释。
  • WidevineCdm.cs RSA OAEP fallback 从裸 catch 改为 catch (CryptographicException)

Commits

  • chore(release): bump version to 1.6.8
  • [pi] Now I have all the evidence. Here's my review:

Downloads

Platform Architecture
Windows x64, arm64
Linux x64, arm64
macOS x64, arm64

Full Changelog: v1.6.7...v1.6.8