Releases: KaiHuaDou/BBDownNext
Releases · KaiHuaDou/BBDownNext
Release list
v2.2.0
v2.2.0
新增
- 文集 / 空间图文 / 空间音频 / 空间动态 / 单音频下载
- 文集:
https://www.bilibili.com/read/readlist/rl{id}(简写rl{id}/readlist{id}),逐篇复用专栏导出链路产出 Markdown,落在工作目录/文集名/下。 - 空间图文投稿:
https://space.bilibili.com/{mid}/upload/opus(简写spaceOpus{mid}),拉取动态流仅提取图文动态(MAJOR_TYPE_OPUS),逐条导出 Markdown,落在工作目录/UP 名/下;接口带 WBI 签名与 buvid3,未登录被风控时提示登录后重试。 - 空间动态:
https://space.bilibili.com/{mid}/dynamic(简写spaceDynamic{mid}),按动态类型分发:图文动态导出 Markdown、视频动态(MAJOR_TYPE_ARCHIVE)复用视频管道下载(-g/-W等选项对视频项全部适用)、转发动态取原动态按其类型处理;直播 / 剧集更新等其余类型跳过,逐条失败继续(末尾汇总抛出)。 - 空间音频投稿:
https://space.bilibili.com/{mid}/upload/audio(旧版/audio页同义,简写spaceAudio{mid}),新增音乐域(BBDown.Core.Music)经 music-service 接口逐条下载音频流(web 端恒 192K)与歌词.lrc;付费 / 大会员曲目未登录时下载试听片段并提示;逐条失败跳过,末尾汇总抛出。 - 单音频输入:
https://www.bilibili.com/audio/au{au_id}或简写au{au_id},下载该条音频(含歌词.lrc),CLI / serve / GUI 三端一致支持。 ResourceId新增ReadList/SpaceOpus/SpaceAudio/SpaceDynamic/Audio子类型(规范串readlist{id}等可经 serve API 往返);ContentMode新增Audio与Mixed(空间动态混合域,内容字符无失效提示);GUI / WebUI 的 URL 识别与任务类型标签同步。- GUI(桌面端)对文集 / 空间图文 / 空间音频 / 空间动态输入支持功能性下载:执行统一经
WorkerDispatcher(与 CLI / serve 同一分发点),b23 短链先展开再识别形态;TaskKind精简为视频 / 直播两类(直播保留独立会话注册供停止按钮)。 - serve 空间动态任务(
Mixed模式)同样构造事件流上下文,视频项的进度经事件流正常回发。
- 文集:
- 纯函数测试补充
SsrfGuard.IsPrivateAddress:覆盖私网各段 / CGNAT / 基准网络 / 多播与保留段 / 受限广播 / IPv4-mapped IPv6 / 公网白名单共 31 个用例。- WebUI:任务状态映射新增「错误文案含『已取消』但无结构化字段时判为失败」回归用例;
maxRetry新增负数、小数、NaN 兜底用例。 - 本次新增纯函数全覆盖:
InputResolver.TryDispatch(集合 URL / 简写 / 视频与合集形态不误吞 / 非法输入拒绝;单音频auURL / 简写 / 空间音频列表不误吞);ResourceId新类型规范串往返与前缀长度优先(spaceOpus等长前缀不被space误吞,au/av同长互不误吞);ContentSelector.ModeOf全类型矩阵(含Audio/Mixed)与ContentMode.Audio的失效提示;SpaceOpusDownload.TryGetOpus(MAJOR_TYPE_OPUS提取 / 非图文类型拒绝 / 结构缺失拒绝,OpusItem与该方法改 internal 以便测试);SpaceDynamicDownload.TryResolveItem(图文 / 视频 / 转发分发与转发深度上限,DynamicItem同改 internal 以便测试);AudioDownload.ResolveExt(扩展名推断与.m4a兜底);WebUIurlDetector单音频标签用例。
- 合集 / 系列链接识别扩围:识别
medialist/play|detail/ml{id}老版分享链接(ml 号即 biz_id)、channel/collectiondetail/channel/seriesdetail(带sid=参数)、空间lists/{sid}/尾斜杠容错三种新形态;CLI(InputResolver)与 GUI / WebUI(UrlDetector)三端同步识别与标签;合集 / 系列链接的 query 参数缺失或非数字时报可读异常(原为FormatException)。
重构
- 执行域统一分发
- 新增
WorkerDispatcher(BBDown.Core/Pipeline/)作为资源类型 → 执行器的唯一分发点:CLI(Program.RunApp)与 serve(TaskWorker)共用,直播 / 专栏 / 文集 / 空间集合走独立链路,其余走视频下载管道。 - CLI 移除
RunApp顶部的OpusInputResolver/LiveInputResolver字符串早分流,改用纯字符串探测InputResolver.TryDispatch(新 partial 文件InputResolver.Dispatch.cs);serve 删除TaskWorker内重复的 switch 分发。 TaskWorker.ContentModeOf提升为ContentSelector.ModeOf(ResourceId),CLI 与 serve 共用同一内容适用域判定。
- 新增
- serve 任务执行链(无用户可见行为变化)
- 删除
TaskQueue包装层:TaskStore/TaskWorker直接持有执行队列Channel的读写端,TaskEnvelope移至TaskStore.cs。 DownloadTask新增Scope(构造时定格ResourceId规范串),替换各处每次调用的ResourceIdJsonConverter.Format字符串分配。TaskSocketHub拆分:连接生命周期与帧收发留在TasksSocket.cs,转发与广播泵移入TasksSocket.Forward.cs,帧记录移至序列化上下文文件。BBDownServer.SetUpServer拆出限流注册(AddServeRateLimiting)与请求管线装配(ConfigurePipeline)两个方法。
- 删除
- 工程升级与现代化:目标框架 .NET 9 → .NET 10(SDK 10.0.401,
LangVersion=preview,Win7 兼容构建 TFM 同步net10.0-windows),启用 C# 15 集合表达式容量形式([with(n)]);.editorconfig重组对齐 Visual Studio 默认模板(新增 static 字段命名规则与格式规则);DownloadTask/QueueRunner/ContentOption私有字段改用 C# 14field关键字自动属性;测试项目补TestingPlatformDotnetTestSupport使dotnet test经 MTP 集成;WebUI 依赖升级(vitest 5 / vite 8.3 / unocss 66.10.2)且test:unit改--run。
修复
- GUI 配置与队列文件改为原子写入(同目录临时文件 + 原子替换):写入途中崩溃或断电不再损坏既有文件,恢复队列与用户配置不会被静默清空。
- GUI 关闭窗口时已完成任务不再被误存为未完成:执行器退出码先于 UI 回投落位,已返回的任务不进入恢复队列,下次启动不会重复下载。
- GUI 队列调度收尾竞态:调度标志复位与滞留重查收拢到 UI 线程执行,关窗后标志不再永久卡死,极端时序下入队任务不再永久滞留;恢复队列启动后直接拉起调度,不再静滞在等待列表。
- serve 停止端点与任务收尾的并发竞态:取消源统一经任务对象的
Cancel/DisposeCts串行化,不再抛ObjectDisposedException导致 500。 - serve 任务收尾段整体兜底,收尾异常不再击穿后台执行器的聚合等待拖垮消费者;完成回调(CallBackWebHook)在服务器关停中断重试等待时静默放弃,不再上抛。
- WebUI 任务取消态判定改用结构化
isCancelled字段,不再解析错误文案:含「已取消」字样的普通失败不再被误判为取消。 - 内嵌 WebUI 的 SPA 入口
index.html加Cache-Control: no-cache,升级后不再因浏览器缓存旧入口而引用已下线的旧资源。 - serve 队列满 / 认证失败超限的 429 响应补
Retry-After头(与限流窗口一致),客户端可按统一语义退避。 DownloadTask任务状态与成败标志同存一个原子整数,收尾一次落位,查询不再读到「已结束但成败标志未落位」的中间快照。- 分 P 选择串(
--pages/ serve 的Pages)设长度与 token 累计上限,选中列表日志截断,超长输入不再放大 CPU / 内存与日志行。 - DRM 插件 license / 公钥响应改经
HttpTransfer有界读取(64 MB),插件不再有无界ReadAs*Async。 - 事件转发器(
forwarders)所有权竞态:最后订阅者离开与新订阅交错的瞬间,旧转发循环收尾会误删后注册的转发器条目,可能并行跑两个转发器、重复推事件/快照帧;收尾改按「槽位仍是自己的 cts」校验后摘除(与LiveSignal.Unregister同范式)。
安全
- 文件名模板
<res>/<fps>/<dfn>/ 编码等服务器可控占位符与Page的 aid / cid 统一过GetValidFileName:镜像站 /--insecure下对端下发含分隔符或..的值被转义,产物无法穿越工作目录。 - 业务日志统一单行化(CR / LF 替换为空格),接口
message的控制字符(ANSI 转义等)在ReadApiError统一净化,服务器可控文本不再能伪造日志行。 - serve 回调地址(CallBackWebHook)私网过滤补齐保留段
240.0.0.0/4与受限广播255.255.255.255。
变更
- 内部 API:
TaskStore构造参数由TaskQueue改为ChannelWriter<TaskEnvelope>,TaskWorker由TaskQueue改为ChannelReader<TaskEnvelope>;DownloadTask的取消源不再对外直接Dispose。 - 进度采样由每秒 5 次提升到 8 次,与 CLI 进度条渲染帧率一致;
ProgressSampler采样回调改为必传(内部 API),删除无回调时只记录不采样的分支。 docs/API.md任务时间戳措辞改为「UTC 纪元,与时区无关」;README Docker 示例补--work-dir /downloads,挂载目录不再形同虚设。
v2.1.1
v2.1.1
新增
- serve 任务受理模式(enqueue / start)
- 提交即执行与入队暂停分离:
POST /api/v1/tasks接受?mode=enqueue,任务以Pending状态仅入暂停表、不立即执行;新增POST /api/v1/tasks/{id}/start将暂停任务投入执行队列(200 已启动 / 404 非暂停态 / 429 队列满)。Pending成为DownloadStatus的独立状态,位于Queued之前。 Pending任务不计入运行统计:/running与/healthz的运行中计数均排除Pending(尚未进入执行队列)。- 单任务删除扩展:
DELETE /api/v1/tasks/{id}同时清理已完成任务与 enqueue 暂停态任务(从暂停表移除并释放取消源);运行中任务仍须先经 stop 端点取消。 GET /api/v1/tasks/finished保留,返回已完成任务列表(与 v2.1.0 一致)。
- 提交即执行与入队暂停分离:
- 工作目录校验
- 新增
WorkDirException(位于BBDown.Core):工作目录无效或不可写入时抛出,进程退出码 1 并打印原始文案(不含「请升级」误导语)。 WorkSetup新增ValidateWorkDir(创建并校验目录,失败抛WorkDirException)与纯函数NormalizeWorkDir(去空白、展开环境变量与~、转为绝对路径,空输入返回 null);ResolveWorkDir复用二者。- serve 在启动时一次性校验
--work-dir,坏值直接报错退出(不再让每个任务在运行时失败)。 - CLI 的
--work-dir输入做Trim,描述改为「设置下载输出目录」。
- 新增
- BBDown.WebUI(新前端,WIP)
- 内容字符勾选:提交区补齐 12 个内容复选框(音频 / 视频 / 独立封面 / 封面嵌入 / 弹幕 / 专栏图片 / 嵌入元数据 / YAML front matter / 评论 / 全部评论 / AI 字幕 / 字幕),3 列网格布局对齐 GUI;
content字符串按 Core 规范顺序维护,专栏模式仅i/M生效,其余字符自然失效。 - 任务类型标识:任务列表按规范 id 前缀显示资源类型(视频 / 番剧 / 专栏 / 直播 / 课程 / 空间 / 收藏 / 合集 / 系列 / 稍后再看),与 Core
ResourceId规范形态一致。 - 提交拆为「加入并执行」与「加入队列」:后者经
?mode=enqueue提交、Pending状态可经任务项的「启动」按钮调startTask触发;任务列表状态栏新增Pending计数。 - 状态层重写:
state/拆分为store(全局状态)/types/snapshot(事件流帧 → 视图模型归一)/taskView(任务 → 视图模型,含ResourceId前缀识别)/connection(WebSocket 订阅与重连)/actions(提交 / 取消 / 移除 / 启动)/useTasks(组合式封装),useTasks.ts大幅瘦身。 - 网络层:
api/client.ts的submitTask接受mode参数并新增startTask;api/ws.ts重构为显式状态机(connecting / active / reconnecting,无disabled降级态);任务列表与完成态由taskList帧推送驱动,移除 REST 轮询;新增lib/storage.ts(localStorage 读写封装,取代散落的localStorage直接调用)。 - 事件流始终开启:选项面板不再接收
interactive-available(无关闭通道的概念),任务交互选项恒可点击;lib/options.ts新增maxRetry,lib/format.ts修正 ETA 折算。 - 内嵌 WebUI(
--webui):serve新增--webui,在同一监听端口同源托管 BBDown.WebUI 的前端产物(dist 在 CI 构建并以嵌入式资源打进可执行文件),访问监听地址即可使用,无需单独部署前端或配置跨域;任意--listen端口均同源(前端以location.origin调用 API);构建时未嵌入 dist 则启动告警并不托管前端。静态资源匿名放行(不触发--serve-token鉴权),CSP 在--webui启用时由default-src 'none'放宽至'self'族。
- 内容字符勾选:提交区补齐 12 个内容复选框(音频 / 视频 / 独立封面 / 封面嵌入 / 弹幕 / 专栏图片 / 嵌入元数据 / YAML front matter / 评论 / 全部评论 / AI 字幕 / 字幕),3 列网格布局对齐 GUI;
重构
- GUI 代码拆分(无用户可见行为变化)
- 入口类
Program由App.axaml.cs迁出为独立Program.cs;新增GuiPaths.cs集中ExeDirectory(配置文件 / 队列文件路径逻辑统一迁入)。 MainWindow按职责拆分为分部类:MainWindow.Download.cs(单任务下载执行ExecuteTaskAsync)、MainWindow.Progress.cs(进度 / ETA / 标题回投,含byIndex索引避免线性扫描任务列表)、MainWindow.Tasks.cs(任务列表刷新维护byIndex)。QueueRunner执行循环拆入QueueRunner.Execute.cs;Concurrencysetter 调大时主动放行一个等待槽,使排队任务立即扩容而非等到有任务完成。csproj的StartupObject改为BBDown.GUI.Program。
- 入口类
- 文档与配置
ARCHITECTURE.md更新 GUI 文件树、新增 BBDown.WebUI 章节与 serve 任务状态机说明;API.md同步 enqueue/start 与Pending状态、专栏导出、工作目录措辞;README.md/docs/compared-to-upstream.md同步「下载输出目录」措辞。- 新增
Settings.XamlStyler统一 XAML 格式化规则;AGENTS.md移除一段过时的测试范围说明尾注。 - 新增
BBDown.Core.Tests/WorkDirTests.cs覆盖WorkDirException/ValidateWorkDir/NormalizeWorkDir。 - 正则收口:下载初始态识别(
InitialStateRegex)与 PCDN 主机识别(PcdnRegex)整合至BBDown.Core/Util/Utils.cs统一管理(改为partial源生成方法,调用点经Utils.引用)。
修复
- 通用异常出口(
MapExitCode兜底分支)移除「请升级到最新版本后重试」这句对所有错误都无意义的误导文案,仅打印原始消息(调试模式仍附堆栈)。 - 进度条比例钳制到 [0, 宽度],时长 0 不再越界崩溃。
- 评论楼中楼按 Rpid 去重;多 P 收藏详情拉取失败记日志而非静默丢页;fav 去重改
HashSet<Page>降为 O(1)。 - 账号探测缓存:探测异常时清除故障 Task,避免后续全部抓取反复失败无恢复。
- 直播分段写模式改
FileMode.Create,断流重试不再追加到旧段导致损坏;异常分支清理残缺段。 - 直播合并仅删成功合并段,可挽救分段不再被误删;编码候选消失时显式记录回退(避免静默混入异编码导致数据丢失)。
- 字面量
Console.WriteLine改走日志层;InputResolver正则未命中改可读错误、短链非重定向不再误报;useIntlApi在归一化前捕获,ApiType 与实际抓取一致;PageQueue进度分母用原始分 P 数;Muxer死分支trackID=2统一trackID=1并清理章节临时文件;DashDownload空CoverUrl不上报封面路径。 - aria2c 支持断点续传:目标已存在则跳过、
-c续传,-x/---s` 受连接数约束不再无上限。 - b23.tv 短链在入口展开,直播 / opus 不再被误判为视频。
- DASH 音视频 / 背景音 / 角色音轨失败即时清理临时文件,且仅对成功角色发起后处理,避免以残缺文件覆盖原轨。
- FLV 混流捕获 ffmpeg 退出码,非 0 抛异常不再静默成功;混流失败清理残缺产物。
- FLV 片段并发上限受
DownloaderAdapter.MaxRangeConcurrency约束,aria2c 连接数随之收敛。 - gRPC 响应
using释放,避免句柄泄漏。 - GUI 队列调度丢失唤醒:无运行任务仍有等待任务时重查并重启调度,避免空队列卡死。
- opus 空段落仅当整项缺失才报错;SRT 正文转义换行 / 回车;速度除零回落
0 B/s。 - serve 任务
SavePaths加锁并快照枚举,并发保存不再触发InvalidOperationException。 - serve 任务 scope 统一:opus 多值 id 经
ResourceIdJsonConverter.Format归一,任务查询 / 事件帧 / 启动取消按同一规范串定位,多值 id 不再漏判。 - MP4Box 元数据改走
-itags <文件>通道:命令行形态是冒号分隔的name=value列表,值里的:(视频页 URL、含冒号的简介)会被当成字段分隔符且 GPAC 未定义转义语法;改为临时文件后值按行读取,多值不再错乱,简介换行也得以保留。 - 字幕语言标识(
lan)在产生处净化:此前直接拼进落盘路径,镜像站 /--insecure下由对端控制的值可借..与分隔符把字幕写出工作目录。 - ASS 字幕不再被改名
.srt:目标扩展名沿用源文件(INTL 非 json 接口下发的是 ASS 成品),播放器可正常渲染。 - 文件名模板的
<publishDate>/<videoDate>按不变文化格式化并净化:此前自定义格式串里的:按当前区域设置解析(部分区域设置下时间分隔符不是:),产物路径随之漂移,含冒号的结果在 Windows 上还会让整条路径失效。 - 大会员网页兜底跟随
--ep-host:此前播放页地址硬编码官方域名,镜像站用户命中大会员限制时兜底会被重定向回可能不可达的官方站。 - 收藏夹翻页按实际返回量终止:此前按
media_count折算的总页数翻页,计数畸形大或每页返回空时会把空页一路请求到底。 - INTL 番剧信息不再对响应体做
\/字符串替换:\/是合法 JSON 转义,提前替换会把原文里\\+/的组合错误归并。 - gRPC 请求
Host头取目标地址:此前一处传死值,端点迁移即与 TLS 的 SNI 不一致。 - 取消 / 超时杀外部进程时连带子进程树,避免 aria2c / ffmpeg 派生的孙进程继续占用带宽与文件句柄。
- 工作目录环境变量展开支持 Unix 的
$VAR/${VAR}:.NET原生的Environment.ExpandEnvironmentVariables只展开%VAR%(Windows / Unix 均适用),不处理$VAR/${VAR};新增仅对 Unix 生效的最小替换,把$NAME/${NAME}换成对应环境变量的值(缺失则替换为空),不处理通配 / 命令 / 转义。此前该分支缺失,导致 Linux 下NormalizeWorkDir_ExpandsEnvironmentVariables未展开、被当成相对路径。
安全
- serve 免令牌时按
Host头拒绝非回环请求:DNS rebinding 后攻击者页面发起的是「同源」请求,同源 GET 不携带Origin,写端点的 Origin 校验覆盖不到读端点,只能按请求目标的 Host 判定;带令牌时跳过该校验以保留反向代理部署(此时认证才是边界)。同时修正了「rebinding 可由 Origin 判定拦截」的错误注释。 - 响应体读取统一设 64 MB 上限:此前被攻破的端点或
--insecure下的中间人可用 gzip 炸弹 / 分块慢发打满进程内存。全库响应体读取收口到HttpTransfer.ReadBody*单一入口。 - 携带 Cookie 的请求逐跳校验重定向目标:此前 HttpClient 的自动重定向在库内部完成,凭据门只覆盖首跳,重定向到任意主机不受约束;改为手动逐跳后每跳均过
IsTrustedCookieHost,跳数上限 10(303 转 GET、307 / 308 保持原方法与请求体)。 - serve 认证失败记录超限改为按最后失败时间裁剪:此前整体清空,等于周期性重置攻击者的失败计数、放宽爆破限速。
变更
- 任务事件流改为始终开启:移除
--no-interactive/-ni选项(事件流不再有关闭通道),任务列表与完成态经 WebSocket/hubs/tasks的taskList帧推送驱动,WebUI 移除 REST 轮询与disabled降级态;交互选项(--interactive-quality/--interactive-pages)仍经事件流送达,无订阅者时回落非交互。详见 API.md WebSocket 事件流。 - 工作目录措辞统一为「下载输出目录」:CLI
--work-dir、serve--work-dir,以及 README / API.md / ARCHITECTURE.md /docs/compared-to-upstream.md的对应描述。
v2.1.0
v2.1.0
新增
- serve 远程下载服务
- 任务队列化:任务受理即入队(
Status=Queued),按提交顺序执行,--max-concurrent控制真正并发的下载数(非串行),排队中任务可被停止端点取消。 - 任务事件流:开启
--interactive后经 WebSocket/hubs/tasks实时推送任务消息、进度快照(200 ms 周期帧)与选项请求;submitChoice帧可远程应答交互选项;HTTP API 的?token=查询参数仅限 WebSocket 握手路径使用。 - 健康检查:新增
GET /healthz(进程存活与运行中任务数,匿名放行)。 - 限流与加固:全局限流(60 次 / 分钟 / IP)、任务提交限流(10 次 / 分钟 / IP)、认证失败滑动窗口(每分钟超 5 次改返 429)、写端点 Origin 校验(CSRF)、WebSocket 每 IP 连接上限 5、请求体上限 1 MB / 请求头超时 15 秒、错误消息路径脱敏。
- 任务类型扩展:支持直播(
LiveRoom)与专栏(OpusArticle)任务提交,与音视频任务共用队列与并发闸门。
- 任务队列化:任务受理即入队(
- 图形界面(GUI)
- 交互总线化:逐集确认 / 选轨经
AskBus统一发布,CLI 控制台读输入应答、serve 经 WebSocket 远程应答,交互选项结构化(id/label),静态Interaction类退役。 - 弹窗交互:选项区新增「逐集确认」「交互选清晰度 / 轨道」开关,交互请求在窗口内弹窗应答(多任务并发弹窗叠加),配置随队列持久化。
- 进度阶段化:进度条消费阶段边界事件(分 P 切换 / 重下时重置剩余时间基准),任务行进度随下载阶段显隐。
- 直播 / 专栏进度接入总线:直播录制经进度总线发布样本(时长 / 分段 / 清晰度 / 速度),GUI 以不确定进度条 + 详情文本展示;专栏图片按张数上报进度。
- 选项区重组:登录独立成区;新增「内容选项」(分 P 选择 / 评论 / 弹幕 / 逐集确认 / 展示全部分 P / 试看);原「选项」拆为「下载选项」、「高级选项」更名「解析选项」;「仅解析不下载」时禁用下载选项区。
- 交互选项完整描述:选清晰度 / 选轨展示 Dfn / 分辨率 / 编码 / 帧率 / 码率 / 估算体积(按分 P 时长折算),逐集确认标注 y / n / a / q 含义。
- 交互总线化:逐集确认 / 选轨经
- 下载与解析
- 请求凭据门:携带 Cookie 的请求仅允许发往 B 站官方域或用户显式配置的 host(
--host/--ep-host/--tv-host),防止用户可控 URL(如 b23.tv 短链展开)将 Cookie 外泄第三方。 - 每项独立重试:
--max-retry控制每个下载项首次尝试之外的额外重试次数(默认 3);非必要项(字幕 / 封面 / 弹幕 / 背景配音 / 角色配音 / 评论)耗尽仅跳过该项,视频 / 音频 / 混流等必要项耗尽则该分 P 失败(分 P 互不影响);三入口均暴露该选项。 - mp4box 混流配音轨:
BuildMp4boxArgs在视频、主音频之后编入配音 / 背景音轨(与 ffmpeg 同序、字幕之前),Title 缺失回落 PersonName,二者相同不再重复写 artist 标签。 - 并发直播录制:
LiveSignal改为按sessionId键控的注册表,同一进程内可并发录制多个直播间互不影响(CLI 房间号 / GUI 任务序号 / serve 任务 id 各自用同一标识停止对应录制)。
- 请求凭据门:携带 Cookie 的请求仅允许发往 B 站官方域或用户显式配置的 host(
- BBDown.WebUI(新前端,WIP)
- 前端脚手架:Vue 3 + Vite + TypeScript + Vitest(pnpm workspace,oxlint / oxfmt 静态检查、vue-tsc 类型检查),目标复刻 GUI 业务功能,尚未生产可用。
- 业务复刻:对接 serve REST 快照轮询与 WebSocket
/hubs/tasks事件流(--interactive)——任务队列五态展示、下载目标识别、内容 / 下载 / 解析选项面板(serve 请求契约排除的字段禁用并标注原因)、任务提交 / 取消 / 移除 / 清空 / 继续、连接设置(地址与令牌 localStorage 持久化);serve 未开--interactive时事件流降级禁用、状态仍由轮询提供。
修复
- 番剧发布时间解析在非公历 locale 下中断:
pub_time格式固定为公历yyyy-MM-dd HH:mm:ss,ParseExact改以InvariantCulture解析,不再受 CurrentCulture 默认历法(fa-IR / ar-SA 等)影响。 - serve 日志双打印:启动路径装配了两个控制台渲染器,业务日志输出两遍;现仅保留一个。
- serve 任务已下载字节数多轨并发回退:进度样本累计改由总线按任务维护,音视频轨并行下载时
TotalDownloadedBytes不再来回跳动。 - aria2c 启动失败静默无提示:未安装 / 路径错误时
Process.Start抛Win32Exception裸异常,现包装为含指引的可读错误。 - CI 测试结果上传缺日志:失败排查依赖 Testing Platform 的
TestResults/*.log,上传 artifact 补 log 文件(原仅 trx)。
变更
- serve
- REST API 路径与方法重排:
/get-tasks*改为/api/v1/tasks*;新增任务由POST /add-task(恒 200)改为POST /api/v1/tasks(202 受理 / 200 命中已有 / 400 输入非法 / 429 队列满);删除已完成任务由 POST 改为 DELETE(/finished、/finished/failed、/{id});停止任务由/stop-task/{id}改为POST /api/v1/tasks/{id}/stop。 - 鉴权模型重构:默认免令牌即可调用,
--serve-token显式传入才启用强制鉴权(所有访问须带X-BBDown-Token头或?token=查询参数,缺失 / 错误返回 401);HTTP API 不再接受?token=查询参数传令牌(防令牌进访问日志 / 历史,query 令牌仅限 WebSocket 握手路径);未传入令牌时即使绑定非回环地址也仅打印警告、不再自动生成令牌;免令牌模式下认证 handler 返回NoResult而非Fail,不再为每个请求输出「无效或缺失令牌」。 - 请求契约加回交互式选项(
InteractivePages/InteractiveQuality)与直播清晰度(LiveQuality),CORS 改为默认放行回环来源(非回环Origin仍被拦截);凭据加载提示恢复(回退加载 cookie / token 时重新输出「加载本地 cookie / token...」)。 - WebSocket
optionRequest帧演进:options由字符串数组改为{ id, label }对象数组,并携带任务scope与回落选项defaultOptionId;submitChoice的choice即选项id。
- REST API 路径与方法重排:
- 内部与构建
- 进度阶段句柄收窄:
ProgressBus.BeginStage返回IDisposable,删除单实现接口IProgressScope与其无效Report成员。 - 工作流事件收窄:删除
IWorkflowContext,任务事件队列统一为具体类ChannelWorkflowContext(交互能力并入AskBus)。 - 直播状态行迁移:
LiveProgress由 Core 迁至 CLI 并改订阅进度总线(BBDown.Core不再含控制台渲染组件);直播进度样本Ratio恒 0,Detail承载时长 / 分段 / 清晰度。 - 交互选项描述统一来源:
TrackSelect提取DescribeVideo/DescribeAudio,日志列表与交互选项共用同一格式化文本。 - GUI 构建矩阵调整:win-x64 额外产出 Win7 兼容包(YY-Thunks / VC-LTL 静态消除 CRT 依赖,
SupportedOSPlatformVersion=7.0),win-arm64 不构建 Win7 兼容版。 - BBDown.WebUI lint 配置迁移
.oxlintrc.json→.oxlintrc.jsonc:保留的禁用规则逐条注明原因(与 AGENTS 约定 / 技术现实冲突),恢复代码已满足的规则(switch-case-braces、prefer-template等 10 条)并补齐对应代码。 - README 致谢列表按字母序重排并补齐依赖项。
- 破坏性变更:直播录制
LiveDownload.RunAsync第三参数新增sessionId(会话标识),LiveSignal改为键控注册表,原进程级单槽停录接口不再存在(调用方需传入唯一会话标识)。
- 进度阶段句柄收窄:
v2.0.0
v2.0.0
新增
- 分片级重试:分片瞬态故障由 downloader 库退避重试(上限 5 次)并从断点续下,避免整 P 退避重下。
- FLV 分段并行下载:片段间并行(上限 4),且与片段内 downloader 并行连接合计不超过 32(原片段间串行)。
修复
- 修复下载进度条在混流阶段残留并改为只在下载时显示:进度条显隐由主媒体下载窗口信号驱动(进入音视频轨下载时显示,下载结束进入混流 / 封装时立即清行),封面 / 弹幕等附属下载不显示;采样空闲超时保留为兜底。
- 修复下载 403:downloader 适配层的下载请求缺失
User-Agent导致 B 站 CDN 直接拒绝(403 Forbidden),补回User-Agent: Mozilla/5.0,与旧下载头保持一致。 - 修复交互式输入被进度条覆盖:使用
-iap逐集确认或手动选轨时,后台进度条持续重绘会覆盖[y/n/a/q]提示与用户输入;现交互读输入前暂停进度条渲染、读完后恢复(Interaction新增BeforeRead/AfterRead钩子,CLI 的ProgressBar据此Suspend/Resume)。 - 修复下载进度条与日志互相污染:进度条按退格增量重绘,日志紧跟其后会把光标推离行尾,下一帧把 spinner 字符打到日志行首;现写日志前先擦除进度条行(
Logger.BeforeWrite钩子,与直播状态行同机制)。
变更
- 进度采样由每秒 1 次提升到 5 次,速度显示按采样周期折算为每秒速率。
- 解析性能:播放器信息(player/v2)与拉流解析并行发起;WEB 自动档 playurl 由两次请求(qn 档 + 最高档)合并为单次最高档请求,每分 P 少一次 API 调用。
- 下载引擎整体替换为 Downloader 库(v5.9.5,AOT 兼容):多线程分片与断点续传由库实现(续传元数据内嵌
.download临时文件末尾,服务端内容变化自动删除重下),移除自研分片下载器与.bbdown.part/.bbdown.json清单;分片并发仍为 32,--single-thread与 CMCC 域名强制单块。 - 下载性能:分片并发上限 32;字幕并行下载。
v2.0.0-rc.2
v2.0.0-rc.2
新增
- 图形界面扫码登录:弹出窗口支持 WEB / TV / APP 三通道扫码,凭据写入
BBDown.data,登录态显示昵称。 - 图形界面接通直播录制与专栏导出链路:任务执行按目标分流到直播 / 专栏(此前界面可识别但无法执行),运行中的直播任务提供「停止录制并合并」按钮(对应 CLI 的 Ctrl+Break 语义)。
- 图形界面队列持久化:关闭时保存未完成(等待 / 运行)任务到
BBDown.GUI.queue.json,启动时恢复为等待。 - 新增
BBDown.GUI.Tests纯逻辑单元测试(目标识别 / 参数映射 / 状态转换器 / 任务队列,37 例)。
修复
- 修复 APP 接口请求头:
x-bili-metadata-bin的 access_key 由恒空改为登录 token,authorization头仅在登录后发送。
变更
- 图形界面任务列表展示解析出的视频标题(替代裸 URL),落盘文件路径写入日志;运行中显示实时速度与剩余时间。
- 图形界面队列状态栏拆分为等待 / 运行 / 成功 / 失败 / 已取消计数;日志区改为 ListBox 虚拟化渲染并新增「导出日志」按钮。
- 图形界面登录态探测覆盖 WEB / TV / APP 三类凭据(TV / APP 登录后不再误显示「未登录」)。
- 登录编排重构:抽取
WebCredentialAsync/TvCredentialAsync/AppCredentialAsync与GenerateQrPng,成功返回凭据数据由调用方处置(GUI 落盘复用,CLI 行为不变)。 - 外部后处理触发改为全轨调起:
--post-process配置后对所有 DASH 轨发起后处理,是否加密由处理方自行判断(退出码 0 且无产物视为无需处理);主程序移除 playurl 加密标记解析(widevine_pssh/bilidrm_uri)与轨道IsEncrypted字段。 - 图形界面适配后处理:常用输入区新增「后处理程序」路径项(含文件选择),随配置持久化,任务执行前按快照配置 Core 后处理通道,留空则不启用;下载能力与 CLI 的
--post-process一致。 - 新增
Plugins/BBDown.Sample后处理示例插件(协议最小实现与模板:复用主程序源生成器上下文解析请求 JSON,自带独立构建配置、中央包管理与协议契约测试,演示「无需处理」语义;Plugins/目录忽略规则开特例);PROTOCOL.md与ARCHITECTURE.md的参考实现改为内置 Sample,不再引用独立插件仓库。 - 图形界面由 WPF 迁移至 Avalonia:界面文件由 xaml 改为 axaml(
MainWindow/App/Theme),目标框架net9.0-windows改为net9.0,移除Ookii.Dialogs.Wpf依赖、改用 Avalonia 原生StorageProvider与TaskDialog等价能力,启用 AOT 单文件发布(PublishAot、不变全球化、Fluent 主题裁剪根保护);配套 BBDown.Core / Cli / Serve 做 AOT 友好调整(移除冗余 using、字符串比较改StringComparison.OrdinalIgnoreCase)。界面修复:日志区改用 StackPanel 物化并修正普通行前景色(深色下不再黑字不可见);内容复选项勾选态接入INotifyPropertyChanged以反映默认值变化;移除按钮移入任务项(运行中显示取消、其余显示 X);状态文字全状态显式着色(修正等待中黑字不可见);按钮放大、Expander 充满、日志与队列等宽。 - 图形界面独立 CI(
gui.yml)构建矩阵由仅 Windows 扩展为 Windows / macOS / Linux 三平台(各 x64 / arm64,Linux 仅 glibc 不产 musl);因 AOT 强制自包含,移除框架依赖(fd)产物,统一发布自包含 AOT 单文件。 - 弹幕
.ass文件头的Script Updated By地址由nilaoda/BBDown改为KaiHuaDou/BBDownNext。
v2.0.0-rc.1
v2.0.0-rc.1
新增
- 图形界面窗口尺寸与位置记忆:关闭时保存(最小化时按还原边界),启动时经虚拟屏幕范围校验后恢复,显示器变更后窗口不再落在屏幕外。
- 图形界面支持拖放输入:拖拽文本(如视频链接)到窗口即填入下载目标。
- 图形界面任务列表按状态着色(运行蓝 / 成功绿 / 失败红 / 取消灰),运行中任务可内联单独取消;队列状态栏实时显示等待 / 运行 / 完成计数,「移除」按钮仅在选中等待中任务时可用。
- 图形界面新增「打开输出目录」按钮:工作目录无效时回退打开 exe 所在目录。
修复
变更
- 图形界面日志区由 TextBox 改为 RichTextBox:逐行追加、错误行红色高亮、按段落数控制上限;勾选「调试」自动展开日志区。
- 图形界面文件 / 目录选择与错误提示统一改用
ookii-dialogs-wpf(VistaFolderBrowserDialog/VistaOpenFileDialog/TaskDialog),替代 Win32 旧对话框与 MessageBox。 - 图形界面样式抽取至
Theme.xaml集中定义(字段标签 / 输入框 / 复选框行 / 操作按钮四类),窗口改为固定初始尺寸 1120×820(保留最小尺寸)。 - 图形界面分 P 间隔与评论条数失焦校验非负整数(无效回退上次有效值);勾选「仅解析」时禁用下载内容 / 弹幕格式 / 评论格式选项,避免无效配置误导;常用输入框补 ToolTip 说明。
- 内部架构重构:下载处理层(下载管线、媒体下载、混流、DRM、直播、登录、工具)从 BBDown(CLI)下沉至 BBDown.Core,CLI 项目仅保留命令行解析、serve 模式与交互渲染;下载域模型统一归入
BBDown.Core.Download命名空间,命名空间依赖调整为单向无环;对应测试迁移至 BBDown.Core.Tests。用户可见行为不变。 - 日志输出目标可注入:新增
Logger.Output委托,null 时写控制台(含颜色与BeforeWrite钩子),GUI 等无控制台宿主可替换为自定义输出(如窗口日志区),BeforeWrite仅对默认控制台路径生效。 - 交互式下载(逐集确认、手动选轨)抽象为
Interaction.AskLine/AskIndex回调,CLI 默认读控制台,无控制台宿主返回 null 时按「不交互」回落处理。 --user-agent由进程级全局改为请求级:经WorkSetup.ResolveConfig落入AppConfig.UserAgent,空串回落进程级默认;并发任务各自生效,不再共享全局(删除HTTPUtil.SetUserAgent与 Program 中的全局设置)。- 图形界面改为直接引用 BBDown.Core 下载库:不再以子进程调用 BBDown.exe,移除 BBDown.exe 路径选择与自动检测界面(BBDown.GUI 独立运行,无需额外的 BBDown.exe);任务日志经 Core 日志回调进入窗口日志区,仍按级别着色;下载能力与 CLI 一致。
- 图形界面直播清晰度下拉补齐杜比 / 4K / 2K 档位(此前仅 5 档),档位列表改以 Core
LiveQuality为单一来源。 - 下载内容字符 m 由「混流元数据」改称「嵌入元数据」,与「封面嵌入」(C)措辞对齐;内容字符、API 通道、弹幕/评论格式等选项列表改为由 Core 枚举/表单一来源生成(GUI 与 CLI 帮助一致),内容字符规范顺序统一为 a v c C d i m M o O S s。
- 内部重构:
DownloadUtil拆分出独立的DownloadConfig(配置类)与PartDownloader(分片续传执行层),HTTPUtil拆分出独立的Redactor(日志脱敏),单文件行数回落至约定上限(384 行)以内,用户可见行为不变。 - 安全:DRM 解密密钥(
--drm-key)纳入日志脱敏——调试日志的运行参数快照清空DrmKeys,无效条目告警打码 key 部分,自由文本脱敏规则扩展覆盖drm_key/drm-key键值对。 - 外部后处理插件架构:新增
--post-process <exe>,下载完成后带加密标记的轨道文件交由外部进程处理,成功产物替换原文件参与混流;进程不可用或处理失败时静默保留原文件(加密流照常输出)。主程序不再内置解密能力,原密钥选项与图形界面输入项移除,密钥与加密信息均由外部进程自行获取管理。
v2.0.0-beta.2
v2.0.0-beta.2
新增
- 多 P(总集数大于 1)且开启元数据混流(
-m)时写入分 P 序号与总集数:FFmpeg 容器写track/track_total元数据,MP4Box 容器写tracknum元数据(x/N)。 - 稍后再看列表新增纯
watchlater字符串入口:直接输入watchlater(忽略大小写)即按整个列表下载(此前仅支持/watchlater/等 URL 形态)。
修复
- serve 模式解析与播放信息获取接入取消令牌:
InputResolver.ResolveIdAsync/ChapterMeta.FetchPlayerV2Async补CancellationToken并沿调用链贯通,服务器关停(Ctrl+C)可中断排队中的任务解析与播放信息请求,不再悬挂。 - SSRF 防护补漏:回调地址校验对 IPv4-mapped IPv6(如
::ffff:169.254.169.254)先归一化为 IPv4 再判定私网,云元数据 / 内网地址不再绕过过滤。
变更
- 图形界面单文件发布启用压缩与原生库自解压,发布工作流补充 checkout 步骤。
- FFmpeg 混流时视频简介元数据键由
description改为synopsis(MP4 容器映射为ldes)。 - 混流选项改为
--mux/-m单值枚举:none(不混流)/mpeg4(FFmpeg 混流为 MP4,默认)/mp4box(MP4Box 混流)/mkv(FFmpeg 混流为 Matroska,视频.mkv/ 纯音频.mka),取代--skip-mux与--mp4box两个布尔开关;图形界面同步改为「混流方式」下拉框。 - serve 任务标识改为
ResourceId规范字符串:DownloadTask的Aid(字符串)字段更名为Id,JSON 序列化为规范编码(如season2539、av170001、fav100_200);/get-tasks/{id}、/remove-finished/{id}、/stop-task/{id}路径参数使用同一编码。旧版「裸 AID 数字」路径与Aid字段废弃。 - 下载内容字符
C由「封面混流」改称「封面嵌入」,CLI 帮助文本与图形界面同步更新。
v2.0.0-beta.1
v2.0.0-beta.1
新增
- DRM 解密支持:默认解析 playurl 中的 DRM 信息(
is_drm/drm_type/bilidrm_uri),新增--drm-key直接传入解密密钥(kid:key或纯key,hex / base64 均可,可多次)。bili_drm 通道提供匹配 key 时自动解密后混流;未提供 key、Widevine 通道或解密失败时明确提示原因并保留加密文件(原始.m4s不删除,路径打印在日志中)。不内置 SPC/CKC 协议逆向,key 仅由用户提供。 - 图形界面 BBDown.GUI(WPF,仅 Windows):单窗口封装命令行下载——子进程调用 BBDown.exe(stdout / stderr 重定向到日志区,按系统代码页解码,行带
[任务N]前缀);下载内容按 CLI 字符集(a / v / c / C / d / i / m / M / o / O / S / s)全量 CheckBox 配置,其余选项(布尔、输入、高级)与 CLI 参数一一对应;任务队列支持多任务排队与并发控制(1–8,运行中可调),「执行」与队列任务共享并发池;BBDown.exe 启动时自动检测(exe 同目录 → PATH,也可手动选择或自动检测);面板选项随 exe 便携保存(BBDown.GUI.config.json,不保存 url 与队列)。 - HDR Vivid 画质档位:登记 qn=129(APP 端档位),APP 通道解析出的 HDR Vivid 轨道不再被当未知清晰度丢到排序末尾;APP playurl 请求能力位加 16384(HDR Vivid)。
- 播放信息失败可读报错:playurl 返回非 0 code(-400 / -404 / -352 等)时直接提示具体原因,风控(-352)额外建议稍后重试或补充已登录 Cookie,不再静默解析出空轨道。
- 收藏夹 / 稍后再看列表容错:单个视频被删除或触发风控时跳过该视频继续下载其余分 P(
Ctrl+C仍立即终止),列表分页整页失效时不再死循环。 - 交互选清晰度跨重试保留:DASH 手动选择的视频 / 音频轨序号与 FLV 选择的清晰度在下载失败重试时沿用,不再静默回落默认第 0 条轨道。
- 仅音频内容集(内容不含 v)时,评论区与字幕文件随产物改落
.m4a基底,与混流产物扩展名一致。 - CLI 新增短选项:
-va/-aa(视频 / 音频升序)、-P(允许试看)、-L(混流音频语言)、-C(cookie)、-cwd(工作目录)、-c(配置文件)。 - 未提供 Cookie 下载时自动补充
gaia_source=pre-load参数(videostream_url.md 要求,缺失可能触发 v_voucher 风控)。
修复
- 修复图形界面任务执行崩溃:调度在后台线程读取界面控件(BBDown.exe 路径)触发跨线程异常,现经 UI 线程读取。
- 修复图形界面子进程日志乱码:BBDown.exe 按系统控制台代码页输出(中文系统为 GBK),读取端不再强制 UTF-8。
- 图形界面无法识别的下载目标不再进入队列;空队列点击「开始队列」仅提示队列为空,不再显示「调度已启动」。
- 修复弹幕颜色值超出 int 范围(8 位 ARGB)时弹幕解析中断,现跳过无效值并记日志。
- 修复 WBI 签名对已编码值二次编码:值含
%XX时不再重复编码(否则%变%25与线上签名不符),未编码值仍按官方算法编码。 - 分 P 间隔(
--delay-per-page)调整:首个分 P 与评论下载不参与等待,间隔仅在分 P 之间生效。 - 图形界面 UI 线程未处理异常不再直接崩溃退出:记录错误日志、提示后正常关闭。
- 图形界面全部取消勾选下载内容时显式传
--get ""(此前回落默认内容集导致全量下载)。
变更
- 图形界面:任务列表条目超长自动换行;选项布局调整(下载内容三列、常用输入整行化、任务列表宽度与日志高度可用分隔条调节、日志可用折叠完全隐藏、Aero 主题);新增独立 CI(
gui.yml:Windows 单文件自包含发布并上传产物,可手动触发追加到最新 Release),主 CI 不再构建图形界面。 - 图形界面 CI 构建矩阵扩展:
gui.yml增加win-arm64,每个架构分别发布 framework-dependent(不含运行时)与自包含(sc,含运行时)双产物并上传。
v2.0.0-alpha.3
v2.0.0-alpha.3
新增
- 稍后再看列表下载:输入
https://www.bilibili.com/watchlater/、https://www.bilibili.com/watchlater/#/list、https://www.bilibili.com/list/watchlater等地址时,把整个稍后再看列表按添加顺序当作一个大列表下载,多 P 视频自动展开分 P,支持-p/-iap;接口私有,需要登录 Cookie(未登录时提示通过--cookie或配置文件提供 SESSDATA)。分享链接携带bvid/oid参数时只下载该单个视频(bvid优先,本地解码)。 - 交互式逐集选择分 P:新增
--interactive-pages/-iap,下载前列出全部分 P 逐个确认是否下载([y]要,[n]不要,[a]剩余全部要,[q]剩余全部不要,直接回车表示不要);与--pages同时给出时以交互选择为准。 - Web 登录成功后自动校验凭据并打印账号名(best-effort,校验失败仅告警,不阻断登录)。
- Windows 7 兼容:
win-x64产物接入 YY-Thunks 与 VC-LTL(构建时-p:WindowsWin7Compat=true),可在 Windows 7 上直接运行,无需安装 .NET 运行时;Windows 7 用户需先安装 KB3140245(TLS 1.1 / 1.2 支持)。 - 纯图文动态导出:
opus子命令现支持非专栏的图文动态(item.type == 0),按其MODULE_TYPE_CONTENT正文导出 Markdown(此前会误判为专栏导致下载失败)。 - 顶部相册下载:专栏 / 图文动态的顶部相册(opus/detail 的
MODULE_TYPE_TOP模块,前端样式.opus-module-top__album)图片随正文一并下载,并置于 Markdown 文档最前。
变更
- 交互式选择清晰度更名:
--interactive/-ia→--interactive-quality/-iaq。 - 手动分 P 选择更名:
--select-page/-p→--pages/-p;serve 请求契约字段同步由selectPage改为pages。 - 命令行选项按 README「参数说明」分组重排(解析模式 → 清晰度与编码 → 下载内容 → 直播录制 → 下载方式与性能 → 账号与凭据 → 文件、路径与调试),
--help显示顺序与文档一致。 - 扫码登录(Web / TV / APP)轮询接入全局取消与失败重试:
Ctrl+C可立即终止扫码等待,单次轮询失败自动重试至多 3 次,网络抖动不再直接中断登录。 - 旧版专栏(data.type == 0)HTML 降级转换策略调整:白名单标签(链接 / 加粗 / 斜体 / 代码 / 引用 / 标题 / 列表 / 分割线 / 段落换行)可靠转换为 Markdown,其余标签(img、span 样式、figure、table 等)原样保留——CommonMark 支持内嵌 HTML,保真优于剥壳;仅解码正文文本段,标签属性内的 HTML 实体(如 ")保留原样;旧版转换产物标记 IsRawMarkdown,渲染时跳过行内转义。
- OpusImageUtil 抽出 NormalizeProtocol 统一协议补全(// 补 https、http 升 https),OpusHtmlToMarkdown 与 OpusMarkdownRenderer 复用,删除两处重复的 NormalizeUrl。
- 移除
opus子命令:专栏 / 图文导出统一走根命令自动识别(BBDown <专栏地址>、BBDown opus{id}、BBDown cv{id});裸数字不再触发专栏,保留给视频 av 号简写。 - 列表型输入的「UP 主页」展示收紧:仅当列表内全部视频归属同一 UP 时才打印主页链接,混合多个 UP 的列表(稍后再看、收藏夹等)不再打印仅代表首个视频作者的误导性主页。
修复
- 修复交互式选择清晰度与
--hide-streams的冲突消解失效:此前修正结果未贯穿到下载阶段,-iaq -hs会不显示流列表却仍要求输入序号;现冲突在管道入口统一消解,手动选择时强制显示全部流。 - 修复 FLV 源交互式选择清晰度不生效:重解析后仍沿用首次解析的分段列表,实际下载的始终是默认清晰度;现按所选清晰度刷新分段列表。
- 修复 serve 任务可远程触发控制台输入阻塞:交互式选项(清晰度 / 逐集确认)依赖本地 stdin,现从 serve 请求契约移除,远程请求无法再让任务阻塞在
Console.ReadLine。 - 修复配音流序号越界崩溃:多角色配音流数少于主音频时,序号越界的角色不再抛异常,跳过该角色的配音并告警。
- 修复 article/view 版图片(para_type 3 的 line.pic)被误判为分割线、图片丢失的问题,现正确渲染为图片段落。
- 修复 link_card 无跳转地址(如 article/view 版角色卡只有 show_text)时输出
> []( )空链接,改为输出带标题的引用文本。 - 修复旧版专栏 HTML 转换中 img / figure / 样式标签被剥壳消失的问题,现按原样保留。
- 修复纯图文动态 opus 下载失败:此前仅凭
basic.rid_str判定专栏,动态的 rid_str 不是 cv 号,会请求正文接口返回 404;现按item.type区分专栏(1)与动态(0)。 - 修复图文动态正文解析失效:
MODULE_TYPE_CONTENT模块类型字段读取错误,导致动态正文被判为空。
v2.0.0-alpha.2
Full Changelog: v2.0.0-alpha.1...v2.0.0-alpha.2