Releases: aliveranme/BBDown
Releases · aliveranme/BBDown
Release list
BBDown v1.6.17
修复
- 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 格式化并对替换值做文件名净化(与 ffmpegcreation_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 时封面静默丢失:
-itags的cover值(本地封面路径)未按 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-store与X-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 命令层全量迁移
AsyncCommand:login/logintv/article/live/sub check/watchlater/serve7 个命令不再以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
修复
- 带字幕/副音轨视频混流必失败:
-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
修复与安全性加固
- serve 模式令牌优先级修复:修复
--serve-token与BBDOWN_SERVE_TOKEN优先级反转缺陷,确保环境变量优先于 CLI 参数,并在两者同时设置且值冲突时记录警告日志。 - B 站官方域名白名单统一:抽取
HTTPUtil.OfficialHostSuffixes与IsOfficialBilibiliHost为唯一定义源,消除HTTPUtil.CookieTrustedHosts、UrlResolver.TrustedBilibiliHosts与BBDownApiServer.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
修复与安全性加固
- 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)吞掉——取消后不再误报"解密失败"、不再打印"任务完成"。 - 混流轨道清理兜底:已下载的音视频/字幕/封面轨道清理并入
finally(CleanupDownloadedTracks),混流失败/异常/取消路径不再残留 GB 级临时文件;Decrypt终止进程后等待 stderr 任务,消除UnobservedTaskException。 - 解析防御性加固:bilidrm kid 仅接受 32 位 hex(畸形 URI 不再一路带到 mp4decrypt);flv 最高清晰度重发失败(网络/超时/解析异常)沿用首次已校验响应降级;互动视频
player.so解析降级为可读错误;WBI 密钥材料长度校验(短于 58 字符时降级保持原密钥而非越界崩溃)。 - 文件名与语言码修复:文件名尾随点/空格裁剪(Windows 拒绝以点/空格结尾的名称,纯点串兜底产出合法基名);字幕语言码 BCP-47 大小写规范化(
zh-tw→zh-TW/yue-hk→yue-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
修复与安全性加固
- 直播录制加载登录凭据,自动录制账号可看最高画质:
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异常过滤对齐)不再无限重试,直接报错并保留已录分段。
- 读停滞看门狗:连接既不复位也不 EOF、只是不再有数据(网络黑洞)时,无超时客户端上的
新增测试
- 直播录制集成测试新增至 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
修复与安全性加固
- 直播录制完整性校验:
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 时抛出明确的KeyNotFoundException;FavListFetcher收藏夹翻页遇到风控或非零 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
修复
- 适配 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
安全
- webhook 回调 SSRF 重定向封堵:任务完成回调改用专用
AllowAutoRedirect=false的 HttpClient,不再经共享客户端跟随攻击者可控的Location重定向到内网/云元数据地址。 - 回调全零地址拦截:
IsSafeCallbackUrl字面 IP 分支补拦0.0.0.0与[::](连接时绑定回环)。 - 局域网回调边界说明:字面 IP 的 RFC1918 内网地址仍放行(局域网回调用法);攻击者构造的域名回调走 DNS 解析分支、内网段一律拒绝。需进一步收紧的局域网用户应配置
--serve-token或前置反向代理。
维护
- 修复 2 个编译警告:
ServeApiSecurityTests空 host 用例的 null 赋值、IsSafeCallbackUrl的literalIp可能为 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
修复(发布前回归审查)
- mp4box 字幕参数分裂:字幕
:name=内嵌含空格语言名(如 "Aymar aru")时,在 Unix 上被 .NET 拆成两个 argv 导致混流失败。改为把名称/语言代码放在外层引号内(EscapeString 后保持单 token)。 - mp4box 音频 lang 引号结构:音频轨
:lang=的不平衡内层引号在 Windows CRT 下会破坏含引号的 lang 值,改为去掉内层引号、值留在外层引号内。 - 直播录制失败退出码:重连耗尽抛出的 HTTP 超时 OCE 不再被
LiveCommand误判为"用户取消"返回 0,改为落到失败分支返回 1(catch加when (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.data与BBDown.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 重绑定窗口压缩到最小。
修复
- 直播录制超时误判:
HttpClient2 分钟超时抛出的TaskCanceledException不再被当成"用户取消"静默结束录制,而是按瞬态故障进入重连;重连等待期间取消也不再留下孤儿.part文件。 - 直播录制重连语义:主播下播(
当前未在直播)作为终结态正常结束并改名为最终文件,不再被当可恢复故障重试 3 次后抛错;WAF/风控返回非 JSON 的JsonException也纳入重连。 - ProgressBar 计时器竞态:
Dispose与speedTimer回调改用同一把锁同步,消除对已释放Timer调用Change()导致的进程崩溃(serve 长驻场景)。 - 订阅文件丢失更新:
SubscriptionStore的读-改-写完整序列纳入_ioLock,并发写者不再互相覆盖。 - 批量下载超时中止:单个分P 的 HTTP 超时(
TaskCanceledException)不再让整批下载中止,进入"记录失败后继续"分支;封面下载不再吞掉用户取消信号。 - 空收藏夹误导报错:无
-p时选中分P为空(空收藏夹等)改为抛可读的InvalidOperationException,而非ArgumentNullException。 - Parser 免二压丢音轨:重请求响应带
dash但缺audio/video数组时沿用第一轮完整轨道,不再静默丢弃。 - 直播录制退出码:重连耗尽保留
.part并抛错,live命令退出码为 1(此前对超时误判为取消会返回 0)。
测试
- 新增
DownloadTaskSnapshotTests.AddSavePath_IsVisibleToSnapshot;ServeApiSecurityTests断言SanitizeUntrustedOptions清空insecure/filePattern/multiFilePattern;WidevineCdmTests非法 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
安全
- DRM 密钥进程列表暴露:
mp4decrypt解密密钥改为通过临时文件传递(--key-file),避免命令行对同主机ps aux可见。临时文件使用后覆写并删除。 - Debug 日志密钥脱敏:Widevine 解密密钥在 debug 日志中仅显示前 8 字符。
- SSL 跳过诊断增强:
--insecure模式下记录被跳过的证书错误类型到 debug 日志,便于排查。
修复
- WidevineCdm 异常吞噬:protobuf 解析失败和 RSA 解密失败不再静默吞错,改为记录诊断日志并降级返回 null。
- 异步死锁防护:
LoginCommand、LoginTVCommand、BBDownApiServer中.GetAwaiter().GetResult()调用改为Task.Run(...).GetAwaiter().GetResult(),防止被 GUI 宿主复用时死锁。 - 调试日志文件清理:仓库根目录遗留的 20 个
debug_*.json已删除,并加入.gitignore。
测试
- 新增
WidevineCdmTests:PSSH 解析边界、非法输入降级。 - 新增
ParserTests:ThrowIfPlayLimited全覆盖、WbiSign、Codec 映射。 UrlResolverTests添加[Trait("Category", "Integration")]标记,CI 可通过--filter排除。
维护
.remember/、.pi-subagents/、debug_*.json、artifact/加入.gitignore。Parser.csDispose 所有权说明注释。WidevineCdm.csRSA 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