简体中文
验证记录
最近验证日期:2026-10-27。早期阶段记录保留在下方;其中 512 MB / WASM 输出已由磁盘封装替代,后续的固定 16 GiB 输入上限也已改为动态磁盘预算。
自动检查
| 项目 | 结果 |
|---|---|
pnpm test | 325 个测试通过 |
pnpm test:native | 38 个测试通过 |
pnpm format:check | 通过 |
pnpm lint | 通过 |
pnpm typecheck | 通过 |
pnpm build | Chromium MV3 构建通过 |
pnpm build:firefox | Firefox MV3 构建通过 |
git diff --check | 通过 |
生产包约 34 MB,其中约 32 MB 是随扩展打包的 FFmpeg WASM。Chromium 已检查下载中心、欢迎页和设置页;Firefox 本轮仅确认构建通过。
输入单个 moof 样本元数据分页验证(2026-10-27)
输入 moof/traf 按范围遍历,固定头部与 trun 行分开读取。每轨道片段保留 4 个复制的 16 KiB 源页、128 个自适应摘要、256 条原始样本和 512 条计算时长;不创建完整样本、run 计数或排序时间戳数组。首次访问流式摘要,默认值 run 用算术累计;乱序显示时长按 256 样本窗口计算,必要时重扫候选块。片段内 senc / saiz/saio 也按位置读取,变长加密信息最多保留 128 个检查点。
- 新增 32 项回归,共 325 项 Node 测试。覆盖顺序 / 逆序 / 乱序 / 重复 PTS 的每包字节与时长、第一样本 / 默认 / 逐行标记、1 / 263 / 2,003 样本 run、默认与显式 run 混合、并发 seek、旧包后续访问、页淘汰 / I/O 重试 / 取消、5 GiB moof 填充与 64 位基址、畸形行 / 版本 / 尺寸 / 偏移、ESM 与两个 CommonJS 入口。实际读取超过原
2^20上限的显式行;默认值 run 以约 42.9 亿样本验证算术定位与关键帧查找,未分配对应媒体。 - 四种加密输入覆盖固定 IV、可变子样本
senc、可变saiz和固定saiz配合saio;随机读取并对照 AES-CTR 解密后的全部目标包字节,元数据查询不取密钥。 - 隔离 GC 进程生成 2 万 / 40 万样本,单 run 与每样本一个 run 均限制保留堆小于 4 MiB、buffer 小于 1 MiB,规模间增长小于 2 MiB / 512 KiB。单 run 稀疏源实测保留堆约 0.31 / 0.34 MiB、buffer 约 0.21 / 0.20 MiB。另以 8 MiB Node Buffer 的小视图返回解析页,验证缓存真正复制。相同 40 万样本 Blob 输入与操作,上一轮实现保留约 68.6 MiB 堆 / 6.1 MiB buffer,新实现约 0.39 MiB 堆 / 64 KiB buffer。测量排除源媒体和预热轨道发现,不代表进程峰值。
- Chromium 加载扩展后直接运行生产 Worker:真实 12 秒 H.264 / B 帧视频配短音轨,以及三个各 30,003 样本的合成输入片段,均完成 OPFS 输出。HTTP Worker 插桩最大 Blob 读取 128 KiB、OPFS 读写 64 KiB,每次 8 次打开 / 8 次关闭;描述、媒体与排序文件归零,任务目录无残留。未覆盖真实 CDN / 下载 API、Firefox 运行或原生播放。
- Node / Python、格式、lint、类型、Chromium / Firefox 构建、冻结锁文件安装和 diff 检查通过。测试入口为
tests/downloads/mp4Moof.test.ts、tests/fixtures/downloads/mp4MoofMemory.ts;对照脚本与浏览器产物位于忽略提交的output/size-audit/。
这些边界限制单片段样本元数据的保留内存。首次摘要与任意重排 PTS 查找仍可能增加 CPU / I/O,调用方保留的片段、单包 / 子样本、源缓存、编解码和其他叶子 box、普通 MP4 的加密辅助表仍有各自开销;不承诺整个任务或峰值恒定内存。下方描述保留各历史阶段的限制。
GOP 描述分页与时间戳外部排序验证(2026-10-27)
生产输出路径在包到达时写入固定 56 字节样本记录与媒体,使用每轨道两个 56 KiB 记录页替代当前片段 / GOP / 排队数组。时间戳使用固定 4,096 项游程缓冲和两个归并文件,页最多 64 KiB。标量摘要选择 trun 字段,条目直接分页写出,不构造完整 moof 树。已完成前缀按页压缩,保留排队逻辑引用,每轨道复用四个文件。
- 新增 31 项回归,共 293 项 Node 测试通过。覆盖描述页淘汰 / 更新、非页对齐释放、媒体尾部、部分 I/O、1 / 4,096 / 4,097 / 10,003 项排序边界、重复 / 小数时间、短读、打开 / 读写 / 截断 / 关闭错误与清理、七个暂存方法错误、排序背压 / 取消、轨道失衡、输出逐字节一致、B 帧、零时长、负起始时间、seek、超过 4 GiB 的 MDAT / 64 位轨道基址、ESM 和两个 CommonJS 入口。既有测试已走新生产暂存,先前可选媒体暂存路径也继续覆盖。
- 隔离 Node 进程启用 GC,追加、排序并写出 2 万 / 40 万样本 GOP,包含降序 / 重复 PTS、不同样本大小与时长。保留堆增量约 0.15 / 0.18 MiB,buffer 均约 0.11 MiB;大规模场景在排序、描述更新、trun 序列化和回读期间采样约 0.47 MiB 堆 / 0.30 MiB buffer。测试限制堆 / buffer 绝对值与规模间增长,实际存储读写不超过 64 KiB。上一轮已将载荷落盘的路径,相同 40 万样本仍保留约 58 MiB 堆;对照保留原媒体暂存,避免把载荷优化计入本轮收益。该测量隔离输出暂存增量,排除源媒体、预热缓存和进程峰值。
- Chromium 已加载扩展 origin 运行生产 Worker:真实 12 秒 H.264 / B 帧视频配短音轨,以及三个各 10,003 样本、需要外部归并的合成 GOP,均完成输出;八个样本 / 媒体 / 排序文件全部截断为零并关闭句柄。HTTP Worker 插桩观测到 8 次打开 / 8 次关闭、21 次排序写入,最大读写页 64 KiB。模拟描述写入配额不足保留
QuotaExceededError并关闭所有句柄;终止阻塞中的归并写入后,任务目录清理重试一次成功,无残留。 - Node / Python、格式、lint、类型、Chromium / Firefox 构建、冻结锁文件安装及 diff 检查通过。无头 Chromium 原生播放仍停留在加载状态,因此本轮确认 OPFS 与自动化数据包 / 字节 / seek 一致性,不计为原生播放验证;未覆盖真实 B 站 CDN、完整下载 API 或 Firefox 运行。内存入口为
tests/fixtures/downloads/mp4FragmentSamplesMemory.ts,浏览器产物位于忽略提交的output/size-audit/。
新路径限制输出 GOP 元数据、排序和 moof/trun 生成的保留内存;临时磁盘占用、排序 / 前缀压缩 I/O 仍可增长,并使用专用 Worker 的 OPFS 同步访问句柄。单个 / 调用方持有的数据包、编解码 / 加密信息、源缓存及输入端单个 moof 的整体解析仍有独立开销,不能据此承诺整个任务恒定内存。下方限制描述对应各自历史阶段。
当前片段 / 超长 GOP 媒体落盘验证(2026-10-27)
当前片段载荷改用独立 OPFS 暂存:每轨道一个 64 KiB 写页,等待背压后清除样本媒体引用。moof 偏移确定后,每次最多回读 64 KiB 并刷新输出,再关闭 / reset 轨道暂存,后续片段截断复用同名文件。解码顺序、显示时间、时长、关键帧标记和片段边界保持一致。
- 新增 21 项回归,共 262 项 Node 测试通过。覆盖真实 4 秒单 GOP H.264 / B 帧输出逐字节一致与前后 seek、短音轨、暂存复用 / 截断、reset 串行、追加 / 回读背压、写入 / 读取 / reset 错误、截断页、追加 / 回读取消、大 backing view 和三个模块入口。虚拟超过 4 GiB 的 MDAT 同时检查扩展头尺寸、后续轨道超出有符号 run 偏移后的 TFHD 绝对基址,不分配多 GiB 媒体;共享适配器的既有部分 I/O 测试也通过。
- 隔离 Node 进程启用 GC,为不间断 GOP 逐包分配约 32 KiB 新载荷。2,048 / 8,192 样本约为 64 / 256 MiB;保留媒体 buffer 均不到 0.1 MiB,写入 / 回读期间采样约 0.9 / 1.0 MiB。旧路径在 8,192 样本时保留约 256 MiB。大规模场景在收尾前已落盘 256 MiB,媒体页不超过 64 KiB、目标写块不超过 1 MiB。测试限制载荷 buffer 绝对值与规模间增长,覆盖收尾;另有小视图指向新分配 8 MiB backing buffer 的回归,检测旧输入大分配是否被保留。
- Chromium 已加载扩展 origin 运行生产 Worker:12 秒单 GOP 视频和三 GOP 视频分别搭配短音轨,均完成 OPFS 输出;视频媒体暂存分别为 487,961 / 160,188 字节,后者只保存最后一个 GOP。轨道索引数对应 1 / 3 个片段。HTTP Worker 内插桩确认媒体读写页不超过 64 KiB,三 GOP DASH 共提交 4 次轨道文件。模拟配额错误保留
QuotaExceededError;终止阻塞中的媒体写入后,目录清理重试一次成功,均无任务目录残留。 - 无头 Chromium 原生播放未完成加载,因此本轮确认 OPFS 行为及自动化数据包 / 字节 / seek 一致性,不计为原生播放验证;未覆盖完整下载 API、真实 B 站 CDN 或 Firefox 运行。Node / Python、格式、lint、类型、双浏览器构建、冻结锁文件安装和 diff 检查通过。内存入口为
tests/fixtures/downloads/mp4FragmentMediaMemory.ts,本地浏览器产物位于忽略提交的output/size-audit/。
GOP 样本 / 时间戳元数据、排序和 moof/trun 树仍随样本数增长,单个排队 / 调用方持有的数据包也可能固定 backing buffer。测量隔离媒体载荷保留,不承诺堆或进程峰值恒定;落盘增加磁盘 I/O 和片段暂存空间,配额预估仍是参考。progressive FFmpeg 处理保持不变。下方历史记录的限制对应各自阶段。
输出 fMP4 索引落盘验证(2026-10-27)
应用始终为 muxer 提供磁盘 TFRA 暂存。每个片段完成后,每轨道追加一条 28 字节记录,等待写入背压,再释放已写 chunk 和样本;每轨道保留一个 64 KiB 写页与计数。收尾先提交临时文件,再流式写出 MFRA 头、最多 64 KiB 的 TFRA 页和 MFRO,每页刷新输出,不再构造完整索引树或 buffer。临时磁盘占用仍随条目增长,并检查 MFRO 的 32 位包围尺寸上限。
- 新增 21 项测试,全量 241 项 Node 测试通过。覆盖与旧 muxer 索引逐字节一致、跨页、轨道提前结束、数据包跳转、64 位时间戳、超过 4 GiB 的稀疏输出偏移、两个 CommonJS 入口、部分读写、写入背压、配额 / 读取 / 提交错误、截断页、收尾取消、句柄释放、任务目录清理和短暂 OPFS 锁。
- 隔离 Node 进程启用 GC,丢弃输出媒体、使用真实磁盘暂存。2 千 / 10 万片段的保留堆约 0.7 / 1.7 MiB,buffer 均约 1.1 MiB;10 万片段收尾采样堆约 1.7 MiB,buffer 约 1.2 MiB。测试同时限制堆 / buffer 绝对值与两种规模间的增长,并在收尾读页阶段采样。
- 旧的无暂存路径处理 10 万片段保留约 40 MiB 堆;新路径在收尾前已写出 2,752,512 字节,最终磁盘索引 2,800,000 字节,经 43 次有界读取写出 2,800,048 字节 MFRA,输出写块不超过 1 MiB。该测量隔离索引成本,排除媒体本身,不代表进程峰值或整个任务内存。
- 从 Chromium 已加载扩展 origin 直接执行构建后的生产 Worker:真实短 DASH 素材生成两个轨道索引文件;5,000 片段 AAC 输入生成 140,000 字节 OPFS 暂存和 140,048 字节最终 MFRA。索引打开时终止 Worker,清理重试一次成功,任务目录无残留。本次无头会话中原始素材与输出的原生播放均停留在加载状态,因此本轮确认 OPFS / 索引行为及自动化数据包 / seek 一致性,不计为浏览器播放验证;未覆盖完整下载 API、真实 B 站 CDN 或 Firefox 运行。
- Node / Python 测试、格式、lint、类型、Chromium / Firefox 构建、冻结锁文件安装和 diff 检查通过。内存入口为
tests/fixtures/downloads/mp4OutputIndexMemory.ts,本地浏览器复现产物位于忽略提交的output/size-audit/。
当前片段 / GOP 媒体、编解码 / 加密状态与输入源缓存仍有各自开销;progressive 输入仍使用 FFmpeg,不属于本次 Mediabunny 输出索引优化范围。下方历史记录的内存限制描述对应各自阶段。
输入 fMP4 片段索引按需读取验证(2026-10-27)
输入 mfra 按文件范围遍历,保留 TFRA 描述信息,每轨道最多缓存 4 个复制的 16 KiB 索引页。首次索引访问流式校验顺序,有序索引二分查找,乱序索引流式回退,不展开排序副本。每轨道的位置提示与累计解码时间锚点分别最多保留 128 条,全局片段摘要最多保留 128 条;优先复用最近访问记录,超限后淘汰。
- 新增 25 项回归,全量 220 项 Node 测试通过。覆盖两个 TFRA 版本、1/2/3/4 字节引用字段、跨页、超过 4 GiB 的偏移、跳过 8 MiB 索引填充、多
trun与非首个样本引用、B 帧 / 显示偏移、关键帧及后续关键帧查找、轨道提前结束、跨轨道并发、旧包继续访问、独立 init input、乱序 / 重复 / 无效引用、错误索引提示的回退、截断 / 不安全字段、I/O 重试、取消、淘汰后回读。向后跳转后,相邻查找必须复用新提示,不能重复从头扫描。ESM 与两个 CommonJS 入口均执行真实解析。 - 隔离 Node 进程按需生成片段与索引条目,禁用读取日志;有 / 无 TFRA 均读取 2 千 / 4 万片段的全部数据包,再在淘汰后前后跳转。断言限制保留堆(4 MiB)、buffer(1 MiB)以及两种规模间的增长(2 MiB / 512 KiB)。4 万片段实测保留堆约 1–3 MiB,buffer 约 0.13–0.20 MiB。
- 上一轮实现相同 4 万片段操作的保留堆,有 TFRA 约 19 MiB、无 TFRA 约 15 MiB,触发新增堆断言。对照仅放宽旧实现的请求尺寸断言,允许其整块读取
mfra。另有回归将索引页作为 8 MiB Node Buffer 的小视图返回,要求缓存真正复制数据、保留 buffer 小于 1 MiB,避免小视图固定大 backing store。 - 缺少
tfdt时通过精确 TFRA 样本 / run 引用,或从保留锚点 / init 边界连续重建解码时间;解码终点与显示终点分开,避免淘汰后累加 B 帧 / 显示偏移误差。片段解析、时间恢复和缓存发布共用串行锁,读取失败不发布半成品。 - 本地 HTTP 与隔离 Chromium 已加载的生产扩展分别执行生产 Worker:真实 AAC / 视频素材重复为每轨道 200 个片段,每份输入含 8 MiB
mfra填充。AAC / DASH 均写出 OPFS,能播放并在跳转到 1 秒及接近 400 秒后继续播放,视频产生解码帧且无媒体错误。HTTP Worker 内记录最大 Blob 读取为 192 KiB;扩展 origin 内直接执行已打包 Worker。本轮未覆盖完整 runner / 下载 API 或真实 B 站 CDN,Firefox 仍仅构建验证。 - 全部 220 项 Node 测试、38 项 Python 测试、格式、lint、类型检查、Chromium / Firefox 构建、冻结锁文件安装与 diff 检查通过。内存入口为
tests/fixtures/downloads/mp4FragmentMemory.ts;对照脚本、真实重复素材、日志和浏览器结果位于忽略提交的output/size-audit/。
上述边界覆盖输入查找索引的保留内存,不随片段数线性增长;首次校验和乱序查找仍需扫描索引条目,淘汰后可能增加索引读取或前缀回扫。单个 moof 与其中样本仍整体解析,调用方保留的数据包会保留对应片段,输出索引仍随片段数增长,编解码 / 加密元数据另有开销。测试排除源媒体本身,不承诺整个任务或峰值恒定内存。
普通 MP4 样本表按需访问验证(2026-10-27)
在上一轮 moov 分页补丁上,八张普通 MP4 样本表保留在输入源中;每轨道最多保留 8 个 16 KiB 原始页,stts / ctts / stsc 各最多 128 个前缀检查点和 256 条解码记录,外加少量顺序读取游标。移除了全量样本大小、chunk 偏移、同步样本、累计大小和显示时间排序数组。首次访问扫描游程表建立检查点,大小 / 偏移 / 同步样本条目按需分页,缓存淘汰后可重新读取;PCM 按需把 chunk 合并为包。
- 新增 15 项回归测试,总计 195 项 Node 测试通过。覆盖 16 KiB 边界、带符号 CTTS、大正偏移、时间戳重排和重复、关键帧 seek、四种大小编码、大 chunk 内的可变样本大小、PCM 分组、惰性读取、缓存淘汰后回读、页 I/O 失败重试、样本计数截断及损坏 / 不安全的字段。既有跨轨道并发、取消、64 位偏移、真实封装和双 CommonJS 入口测试仍通过。
- 独立 Node 进程固定输入、禁用读取日志,首次和最终测量都经过 GC 与事件循环回合;执行 256 次分散 seek 和 2,048 次顺序访问。2 万 / 40 万样本的保留 JS 堆分别约 1.71 / 1.74 MiB,buffer 增量约 0.28 / 0.27 MiB。回归同时限制堆、buffer 绝对值与增长,避免把线性数组换成线性 typed array。
- 同样的 40 万样本操作在上一轮解析实现上保留约 106 MiB JS 堆,并触发新增内存断言;对照仅放宽旧实现的 64 KiB 页断言,未改变其解析行为。测试测量的是输入解析相关保留内存,不包括输入素材本身,不代表进程峰值或完整下载任务内存。
- Chromium 中运行本次构建的生产 Worker,带 8 MiB
moov填充区的真实 AAC / DASH 均完成 OPFS 封装;最大单次 Blob 读取仍为 128 KiB。输出可播放并跳转到 1 秒后继续播放,DASH 解码 42 帧,无媒体错误。验证从本地 HTTP 页面调用 Worker,未覆盖本轮完整下载 runner、真实 B 站 CDN 或 Firefox 运行。 - 格式、lint、类型检查、Chromium / Firefox 构建、冻结锁文件安装与
git diff --check通过。复现数据与浏览器结果位于忽略提交的output/size-audit/,内存测试入口为tests/fixtures/downloads/mp4TableMemory.ts。
普通样本表的保留索引不再随样本数线性增长;初始化时间仍随游程条目数增长,随机访问可能从固定检查点重扫,极宽 CTTS 偏移范围也可能增加候选样本扫描量。输出片段索引、输入碎片索引、加密辅助信息、编解码 / 元数据叶子 box 及当前 GOP 媒体仍有各自内存开销,整个任务不承诺恒定内存。
输入 MP4 索引分页验证(2026-10-27)
第一阶段固定版本 Mediabunny 补丁不再完整读取 / 保留原始 moov:按 box 遍历,样本表延迟到首次数据包访问,并以最大 64 KiB 的解析器请求分页读取。底层源仍可能合并请求或预读;编解码配置、标签等其他叶子 box 仍按 box 读取,该阶段解析后的样本表仍随样本数增长,后续优化见上节。
- 新增 13 项测试:覆盖八种样本表的跨页边界、定长
stsz、4/8/16 位stz2(含奇数样本)、co64、逐包字节 / 时间戳、前后跳转、并发轨道与同轨道共享初始化、损坏表、输入 I/O 失败重试和取消。Node / browser CommonJS 入口与正常 ESM 入口都执行真实解析。 - 稀疏源在
moov内放置 5 GiB 的扩展尺寸填充 box,真实索引与媒体位于 4 GiB 之后;不分配完整文件,断言解析器请求不超过 64 KiB、实际源读取不超过 256 KiB,并跳过填充区。 - 生产
remuxMedia路径使用带 8 MiB 填充区的真实 Blob,记录每次Blob.slice,断言单次读取不超过 256 KiB,并完成音频封装。这些边界用于回归测试,不代表所有输入文件的 I/O 或总内存硬上限。 - 隔离 Chromium 中执行构建产物的生产 Worker,带 8 MiB 填充区的有效 AAC 与 DASH 素材均成功写出 OPFS;Worker 内记录的最大 Blob 读取为 128 KiB。输出分别加载音频 / 视频元素播放、跳转到 1 秒后继续播放,DASH 解码 42 帧,无媒体错误。该验证在本地 HTTP 页面调用生产 Worker,未覆盖完整下载 runner 或真实 B 站 CDN。
- 全部 180 项 Node 测试、格式、lint、类型检查和 Chromium / Firefox 生产构建通过;Firefox 未进行运行验证。
大文件流程与索引内存优化验证(2026-10-27)
有效 Range 续传不再受每条线路 32 次请求限制;缓存统计只读取已提交清单,恢复缓存时仍逐块校验。封装 Worker 保留 120 秒启动握手超时,启动后取消无字节进度超时和 FFmpeg 的固定 30 分钟总时限,暂停 / 取消仍终止 Worker。
- 新增 8 项回归测试,覆盖连续 99 个有效 Range、无进展响应、统计不打开媒体块且复用仍拒绝损坏缓存、Worker 启动失败、长时间解析 / 最终写入无字节进度、长任务取消、多片段关键帧与随机访问、长音频输出的保留堆内存。原有真实 WASM 测试增加禁用固定超时、逐包时间戳与轨道起始偏移校验。
- DASH / AAC 输出改为最小 2 秒片段的 fMP4;固定版本 Mediabunny 补丁释放已写片段的样本后缀,保留
tfra所需的首个同步样本与原序号,并修复同片段多个关键帧的标记压缩。progressive 同样分片输出,使用delay_moov保留 AAC / 视频起始偏移。 - 独立 Node 进程强制 GC、丢弃已写出的媒体,50 万个 AAC 包(约 3 小时逻辑时长、约 90 MiB 输出)的保留 JS 堆由原普通 MP4 约 76 MiB 降至约 2 MiB。回归上限设为 16 MiB,为不同运行时留余量;这是输出索引测试,不代表完整任务总内存只有 2 MiB,也没有实际等待 3 小时传输。
- 隔离 Chromium 生产扩展中,模拟 CDN 首次中断后连续返回 46 个有效 Range,真实 runner、缓存、Worker 和下载 API 完成约 12 秒 DASH 文件保存;独立 M4A 和两个 FLV 分段也分别完成保存。元数据与 CDN 响应为测试数据,未下载真实 B 站内容。
- 三份保存结果用 Chromium 媒体元素实际播放,分别向后、向前拖动并继续播放;视频产生解码帧,没有媒体错误。自动数据包测试进一步确认编码字节、B 帧解码顺序、关键帧、轨道偏移和跨片段查找。
- 通过格式、lint、类型检查、Chromium / Firefox 构建、冻结锁文件安装与
git diff --check。复现脚本、保存结果与检查日志位于忽略提交的output/size-audit/。Firefox 仍仅确认构建通过。
输出元数据仍随片段数缓慢增长;输入普通 MP4 解析后的样本表、超长 GOP 的当前片段以及 WASM 工作内存仍是剩余边界。fMP4 对部分旧播放器 / 编辑器的兼容性低于普通 MP4。此次未进行真实超 16 GiB 完整传输或封装测试。
动态配额预算与压缩清单验证(2026-10-27)
固定 16 GiB 输入上限已移除,容量改由尚未缓存的输入、约 105% 的封装输出和 64 MiB 安全余量动态判断。服务器长度 / 实际增长决定容量检查,码率估算只显示进度。配额 API 只是估算;最终下载目录的空间不包含在 origin 配额中。
- 配额预算测试使用 100 GiB 可用配额,允许 20 GiB 输入;覆盖空间缩小 / 增长、未知长度响应、已缓存数据不重复预留、已完成轨道的输出预算、配额 API 不可用与封装前重新检查。
- 缓存清单 v2 用连续块计数取代每块一个数组项。通过共享小 Blob 构造超过 16 GiB 的逻辑缓存,验证加载、追加、完成、文件引用和紧凑清单;这是元数据 / 引用测试,没有实际写入或封装超过 16 GiB 的媒体。旧 v1 清单可保留前缀并继续提交为 v2。
- 真实 Chromium 生产扩展下载 64 MiB 的有效 MP4(小媒体加合法 padding box),将配额估算从 1 GiB 动态缩小到 1 KiB。输入在 8 MiB 处停止,任务明确失败,有效前缀保留为 v2 清单,没有创建最终下载。
- 恢复真实配额后重试,通过强 ETag 与 HTTP Range 从已缓存字节继续,完成浏览器内封装和文件保存。配额决定为模拟,OPFS、队列通信、续传、Worker 和下载 API 均执行真实代码。
- 下载缓存面板显示当前浏览器剩余配额估算,并说明输入与输出的双份空间需求。Firefox 本轮仅验证构建,真实 CDN 长时间传输、超 16 GiB 完整下载 / 封装仍未实测。
Progressive 磁盘封装验证(2026-10-27)
在上一阶段的 DASH / AAC 磁盘封装基础上,把旧格式 FFmpeg 输出改为 OPFS 同步文件,移除旧的 512 MiB 分支。没有重新实现 FLV 解析或时间戳拼接,所有分段继续交给随扩展打包的 FFmpeg。
- 真实 Chromium 生产扩展从本地 HTTP 服务器流式读取两个 FLV 分段,总输入 1,450,828,932 字节(约 1.35 GiB),经 WORKERFS、FFmpeg WASM 和同步磁盘输出,保存 MP4 为 1,450,825,099 字节。队列和浏览器下载 API 均完成,最终 MIME / 扩展名为
video/mp4/.mp4。 ffprobe确认 H.264 视频 360 帧及 AAC 音轨,输出约 12.06 秒。本机 FFmpeg 仅用于素材生成和结果检查:逐帧解码校验输出等于原 180 帧序列重复两次,没有漏帧、换序或画质变化。- 封装进度约 91% 时取消同一大任务,实际终止同步写盘 Worker;任务保留取消状态,OPFS 输入与输出清理为空,没有泄漏同步文件锁。
- 新增 7 项真实 FFmpeg WASM 测试,覆盖 FLV / MP4 分段拼接、编码图像及 AAC 数据包一致性、分段音画偏移一致、无音轨视频、损坏素材、配额错误和稀疏文件超过 4 GiB 的定位、短写、截断。定位测试确认 MEMFS 没有分配媒体文件内容。
- 16 GiB 仍是缓存容量保护,并非 16 GiB 实测承诺。FFmpeg 仍需 WASM 工作内存和索引;真实 B 站 CDN 长时间传输和 Firefox 运行验证尚未补测。
浏览器磁盘封装验证(2026-10-27)
使用隔离的 Chrome for Testing 156 加载 Chromium 生产扩展,播放接口返回固定测试元数据,媒体请求转发到本地流式 HTTP 服务器。真实执行 runner、OPFS 缓存、封装 Worker、浏览器下载 API 和文件保存;未使用本地助手处理下载任务。本机 FFmpeg 仅用于生成测试素材和检查保存文件。
- 随机噪声 H.264 视频加 AAC 输入共 998,260,771 字节(约 952 MiB),输出 MP4 为 998,259,482 字节。任务与浏览器下载状态均为完成,最终扩展名
.mp4、MIMEvideo/mp4。 ffprobe确认输出 H.264 视频轨 8 秒、AAC 音轨 1.8 秒,分别保留原轨道长度。视频数据在封装前后的 SHA-256 一致,确认无损复制。- 在同一大文件的封装进度超过 91% 时取消,任务保持
cancelled,没有创建新的下载;随后确认 OPFS 缓存目录没有遗留输入或临时输出。 - 独立 AAC 从同一 runner 路径保存为
.m4a;使用明确的 M4A MIME,避免 Chromium 将audio/mp4归为视频并替换后缀。 - 新增数据包级回归测试比较 B 帧顺序、时间戳、时长和每个编码包字节;覆盖独立 AAC、缺失轨道、写盘失败、取消、配额不足、输出保留到保存结束和 MIME。
- 页面关闭残留的
merged-output使用缓存清理机制移除。磁盘输出仍需配额,16 GiB 是容量上限,未完成 16 GiB 实测;真实 B 站 CDN 长时间传输和 Firefox 运行验证尚未补测。
全项目审查修复验证(2026-10-13)
修复原生进度中的 undefined 覆盖队列必填字段、压缩素材的传输长度与解压长度混用、设置 / 帮助导航中断下载中心,以及已结束原生会话保留页面监听器和媒体清单的问题。新增 3 项回归测试,合计 121 项 JavaScript / TypeScript 测试与 38 项 Python 测试通过;格式、ESLint、类型检查、Chromium / Firefox 生产构建和 git diff --check 通过。
- 使用 structured clone 保留显式
undefined,验证合并 / 保存进度不会擦除已接收字节,完成后的队列仍可解析;非法进度被拒绝且不修改原任务。 - 本地 HTTP 服务器返回真实 gzip 响应,验证解压素材正常读取、微小素材不被压缩开销误判超限,解压后的实际字节仍受预算限制。
- 隔离 Chromium 加载生产扩展,验证设置和帮助在新标签页打开,点击当前下载中心标题不刷新页面;原生任务与等待任务保持原状态。
- 30 条未启动的历史任务不注册页面监听器。原生任务筛选隐藏 / 恢复后继续运行且不重复注册;隐藏期间完成后会话退役,取消、失败、权限拒绝和清空历史后均不遗留页面监听器。
原生联调模拟权限决定、Native Port 和 B 站元数据,执行真实扩展 UI、后台消息与存储,没有连接已安装宿主或保存真实原生文件。脚本与截图位于忽略提交的 output/playwright/:review-fixes-setup.js、review-fixes-check.js、review-fixes-resume.js 和 review-fixes-running.png。
Firefox 本轮使用新的隔离配置,仍在启动阶段报 Could not find profile folder.,未加载扩展。Firefox 仅确认构建通过;structured-clone 回归测试不能替代 Firefox 实机验收。
Chromium 浏览器验证
使用单独的 Chrome for Testing 配置目录加载真实生产扩展。页面与 API 元数据使用固定测试数据,CDN 返回本地生成的两秒 H.264 / AAC 音视频。FFmpeg Worker、WASM、任务通信、持久化和浏览器下载 API 均执行真实代码,没有模拟“下载成功”。
已验证:
- 单视频没有范围切换控件,点击「下载视频」可以保存 MP4。
- 多 P 从 URL 的
p=2识别 P2;切换「全部分 P」后依次生成 P1、P2、P3 三个文件。 - 同时提交两次相同分 P,只新增一个任务,第二次返回新增数 0。
- 下载中取消并立即重试可以完成,新执行使用不同
runId。 history.pushState切换到 P3 后按钮更新为「下载当前 P3」,页面始终只有一个下载面板。- 同时打开两个下载中心,第二个显示已有执行窗口,不重复处理队列。
- 弹窗能读取当前视频;单视频弹窗与页面下载卡片展示一致。
- 关闭下载中心会把处理中与等待中的任务标为中断失败。
- 生成文件经
ffprobe检查,包含 H.264 视频轨、AAC 音轨,时长 2 秒。
测试发现并修复了两处仅构建检查不易发现的问题:WXT autoMount 需要选择器锚点;Navigation API 的地址变化事件先于 window.location 更新,必须使用事件中的 newUrl。
本地截图位于忽略提交的 output/playwright/:single-video.png、popup-single.png、multipart-current.png、multipart-all.png、download-center.png。截图使用测试视频标题,不是实际 B 站内容的下载证明。
真实接口检查
直接运行项目的 getVideoInfo / getVideoMedia,使用未登录请求检查普通多 P 视频:成功解析 23 个分 P,获取两条 DASH 轨道,选择实际返回的 480P 标清,视频、音频各有 3 个主/备用地址。
该检查验证元数据、WBI 签名、实际流解析与选择;没有使用用户 Cookie,也没有验证登录后的会员高画质。完整 B 站站点中的布局版本、账号状态及真实 CDN 长时间传输仍需要日常使用验证。
Firefox 验证边界
Firefox 生产构建通过。web-ext lint 为 0 errors、7 warnings,提示来自依赖打包代码中的动态 import、Function 构造器和 Vue DOM 操作;不等同于商店审核已通过。
本机 Firefox 测试运行时未能启动:有界面模式出现 macOS sandbox / GPU helper 错误,无界面模式报告无法找到配置目录。因此 Firefox 的注入、Referer、WASM 和文件下载尚未完成运行验证。可通过 about:debugging#/runtime/this-firefox 临时加载 dist/firefox-mv3/manifest.json 后,按 Chromium 的上述步骤补测。声明的最低版本为 Firefox 142。
当前限制
- 下载时保持下载中心标签页打开;没有断点续传。
- 每个分 P 音视频输入总计最多 512 MB,峰值内存会高于输入大小。
- 实际画质受账号和服务端返回限制;同分辨率、同帧率优先 SDR,同画质优先 AVC。
- 直播、番剧、互动视频、试看和 DRM 内容不在当前支持范围。
本轮能力扩展验证
同日增量验证,计划见 roadmap.md。新增 8 个单元测试,合计 21 个通过。覆盖自选页码完整校验、源顺序、去重、旧任务迁移、设置局部更新、暂停调度、重试容量及状态重置、画质上限、竖屏和 progressive 回退。
Chromium 使用新的隔离配置加载生产扩展,已验证:
- 当前 P2 切换自选后默认勾选 P2;反选得到 P1、P3,按 P1 / P3 顺序入队。
- 全选、单项取消、清空可用;空选择禁用提交;后台拒绝失效 P99。
- 720P 偏好提交后改变默认值到 480P,已有任务仍保留并实际选择 720P;弹窗改为 1080P 后页面同步更新;刷新后偏好保留。
- 先暂停再入队,任务保持 queued;刷新下载中心后仍暂停。
- 网络读取中暂停,当前任务继续保存成功,下一项经过调度周期后仍 queued;恢复后两项均 completed。
- 两份输出用 ffprobe 检查,均包含 H.264 视频与 AAC 音频,时长 2 秒。
- 搜索
p3只显示 P3;失败筛选只显示失败记录。 - 在隔离测试存储中构造三条失败记录(含重复分 P)和一条取消记录,批量重试只重新排队两个不同分 P,取消项保持取消,重复历史保持失败,旧执行信息被清除。
- 单视频隐藏范围选择器;多 P 弹窗和页面共用选择器;380 px 弹窗和 390 px 下载中心无横向溢出;使用说明页面内容已检查。
验证素材沿用本地两秒视频,元数据和播放接口是模拟响应。模拟的 1080P / 720P / 480P 地址返回相同小视频,用于验证选择策略和传递路径,不代表输出素材具有这些分辨率。本轮没有进行登录账号、高画质权限或真实 B 站 CDN 验证。
截图位于 output/playwright/:extensions-custom-parts.png、extensions-popup.png、extensions-single.png、extensions-paused-search.png、extensions-failed-filter.png、extensions-queue-mobile.png、extensions-options.png。测试脚本与截图均为忽略提交的本地产物。
本轮再次尝试 Firefox 运行验证,分别使用项目目录和系统临时目录下的新配置,均在浏览器启动阶段报 Could not find profile folder 并退出;尚未进入扩展运行阶段。Firefox 构建通过,但上述新增交互仍需在可运行的 Firefox 中补测。
P1 素材与文件组织验证
同日继续实现 P1,新增 11 项测试,总计 32 项通过。覆盖独立 AAC 选择、字幕语言 / 人工与自动字幕排序、SRT 毫秒进位与无效时间、图片签名、素材去重和旧队列迁移、文件设置快照、路径注入与保留文件名、扩展名、记录字段白名单和 CSV 公式转义。格式、Lint、类型检查和 Chromium / Firefox 构建均通过。
在隔离的 Chromium 生产扩展中,使用模拟 B 站接口和本地两秒音视频验证:
- 全部 3 个分 P 分别添加 MP4、M4A、SRT、XML,再添加封面,共 13 个任务。封面只入队一份,重复按钮禁用;五种输出独立去重。全部任务经过真实浏览器保存并标记 completed。
- 三份 M4A 经
ffprobe检查仅有 AAC 音轨,时长 2 秒;三份 MP4 仍含 H.264 和 AAC。封面 PNG 与原始响应逐字节相同;SRT 包含两段正确时间轴与中文;XML 保留原弹幕文本。 - 非法模板禁用保存,选择按 UP 主 / 视频建目录,入队后恢复默认模板和目录,既有 13 个任务仍使用提交时的设置。
- 将队列筛选为「音频 M4A」,JSON 和 CSV 各导出 3 条记录;检查 JSON 字段及 CSV 列数与中文编码。
- 封面响应为 HTML、字幕需登录、弹幕为空时分别显示对应错误,不生成伪素材文件;恢复接口后批量重试成功。
- 封面请求等待响应时取消,没有生成浏览器下载 ID;单项重试后保存成功。
- 390px 下载中心、380px 字幕弹窗没有横向溢出。设置页修改目录后下载中心同步更新,刷新设置页仍保留选择。
- 通过模拟权限拒绝检查 UI 错误反馈,通知开关保持关闭;通过模拟通知 API 验证保存完成后触发一次,回调时任务已 completed 且浏览器下载已 complete,重复终态更新不重复通知,关闭开关成功。原生权限弹窗和系统桌面通知显示尚未验证。
Playwright 会把文件重定向到隔离的临时下载目录;文件设置验证了任务快照和传给浏览器的相对路径,尚未验证真实用户下载目录中的文件夹和重名后缀。新素材接口本轮使用模拟响应,未验证登录账号的字幕权限或真实弹幕内容完整性。
P1 再次尝试用新建临时配置启动本机 Firefox,仍在启动阶段报 Could not find profile folder,未进入扩展运行阶段;Firefox 仅确认构建通过。
截图和检查脚本位于忽略提交的 output/playwright/:p1-cover-panel.png、p1-queue.png、p1-queue-mobile.png、p1-failures.png、p1-popup-subtitle.png、p1-options.png,输出样例以 p1-video-*、p1-audio-*、p1-subtitle-*、p1-danmaku-*、p1-cover-* 和 p1-history.* 命名。
P2 批量来源验证(2026-10-05)
新增 21 项测试,合计 53 项通过。覆盖完整链接 / ID 识别、协议和主机限制、保留分 P 与逐行错误、分页 schema、重复 / 空分页、不可用条目、WBI 查询、业务 / HTTP / 非 JSON 错误分类、成功记录跳过、不同素材与语言身份、1000 个活跃任务容量及单视频原子入队。格式、Lint、类型检查、Chromium / Firefox 构建和 git diff --check 通过,无新增权限或运行依赖。
Chromium 在新的隔离配置中加载本轮生产扩展,使用模拟列表 / 元数据 / 播放接口和本地两秒音视频,验证:
- 链接列表保留
p=2,逐行提示无效地址,重复链接只保留一次;失效视频与不存在的 P99 单项报错后继续处理其他视频。 - 收藏夹跨页去重,整页失效视频仍可翻到后续有效页;重复页停止继续读取;空收藏夹和未登录错误明确显示。
- 合集与系列采用各自分页结构;UP 投稿带 WBI 签名,隐藏合集条目跳过,后续页可继续读取。这三项成功场景使用模拟响应。
- 停止读取后切换为链接列表,旧响应不会覆盖新预览。修改输入或来源后旧预览禁用入队,重新输入无效内容也不会重新激活旧结果。
- 「全部 P」按原页序入队;av 与 BV 解析后按相同任务身份去重。活跃项始终跳过,成功项默认跳过;关闭成功跳过可重新入队。历史场景在隔离存储中构造成功记录验证。
- 导入期间把默认画质从 720P 改为 480P、改命名和目录,已开始的整个批次仍使用原快照。5 次元数据请求之间的 4 个间隔为 1010–1012 ms,符合本地 1 秒限速策略。
- 停止入队等待当前视频的全部 P 提交后结束,后续视频保留勾选;风控
-352停止后续请求。非下载中心页面提交批量消息被后台拒绝。 - 关闭发起导入的下载中心后,正在请求的条目不再入队,尚在后台等待限速的条目不会继续发起元数据请求;其他下载中心保持可用。
- 从批量导入进入真实 runner 的视频,经过 FFmpeg WASM 合并和浏览器下载保存,任务状态
completed,浏览器下载状态complete,文件 22110 字节。ffprobe确认 H.264 视频轨、AAC 音轨,时长 2 秒。 - 1280px 桌面与 390px 窄屏布局已查看;窄屏文档宽度为 390px,没有横向溢出。
模拟接口用于验证分页、权限错误和入队行为,不代表真实账号能访问这些资源;模拟画质地址仍返回同一个两秒测试视频。真实保存验证沿用原有下载链路,不修改用户下载记录或真实配置。
匿名真实接口抽查
对实现本身的 getBatchPage 使用无 Cookie 请求,并设置与扩展规则相同的 Referer;请求之间至少间隔 1 秒,遇到风控不重试:
| 来源 | 结果 |
|---|---|
收藏夹 1103407912 | 成功解析真实空列表,0 项 |
系列 UID 1958703906 / ID 547718 | 成功解析第一页 30 项,总计 564 项,下一页为 2 |
UP 投稿 UID 3985676 | 返回 -352,保留业务错误并停止;真实成功读取尚未验证 |
| 合集 | 研究时直接接口抽查返回 -352;本轮未完成真实成功读取 |
来源契约参考 yt-dlp 上游 Bilibili 提取器。这些站点内部接口没有在本项目中获得可依赖的官方稳定性或限速承诺;1 秒是本地保守策略,不能保证消除风控。UP 请求复用现有 WBI 和浏览器会话,真实登录后的私密收藏权限、合集 / UP 成功读取仍待日常使用验证。
本轮 Firefox 使用新隔离配置再次启动,仍报 Could not find profile folder 后退出,未进入扩展运行阶段;仅确认生产构建通过。
本地验证脚本和截图位于忽略提交的 output/playwright/:p2-fixture.js、p2-links-check.js、p2-sources-check.js、p2-enqueue-check.js、p2-save-check.js、p2-visual-check.js、p2-close-check.js、p2-links.png、p2-import-desktop.png、p2-import-mobile.png,真实输出样例为 p2-imported.mp4。
P2 大型任务验证(2026-10-05)
自动化检查
JavaScript / TypeScript 共 77 项测试通过。本轮新增 24 项:20 项缓存与续传测试、3 项本地任务导出契约测试、1 项媒体表示身份测试。涵盖强 / 弱 ETag、Range 起止 / 总大小 / 响应长度校验、200 忽略 Range、304 完整缓存重验证、416 完成或有界重试、缺失 Content-Length、截断 / 超长 / 压缩响应、资源重定向隔离、跨 CDN 重下、签名 URL 刷新、预算、取消、配额、元数据损坏、孤立块、清理与统计并发。
Python 助手 25 项测试通过,包括模拟 HTTPS 响应中的断点续传、缓存 SHA-256 校验、强制退出后尾部恢复、恶意清单 / 路径 / URL、重定向、符号链接与硬链接、输出重名、临时文件原子发布、不支持原子发布的文件系统明确失败,以及保存成功后缓存清理失败仍返回成功。真实本机 FFmpeg / ffprobe 覆盖 DASH 音视频、M4A 和 progressive 拼接;测试 CDN 为模拟响应。详见 助手说明。
格式、ESLint、类型检查、Chromium / Firefox 生产构建和 git diff --check 通过。CI 新增 pnpm test:native,不新增 JavaScript 依赖或扩展权限。CI 缺少 FFmpeg / ffprobe 时原生媒体烟雾测试会明确跳过,其余 Python 边界测试继续执行。
Chromium 生产扩展
使用新隔离配置加载生产扩展;B 站 API 与 CDN 由 Playwright 模拟,执行真实 OPFS、队列消息、WBI、FFmpeg WASM 和浏览器下载保存:
- 模拟视频网络中断,磁盘元数据记录 1466 / 2932 字节。自动重新取流尝试一次后仍失败,缓存保留。刷新页面再点击原任务的「重试」,请求带
Range: bytes=1466-和匹配的If-Range;服务器返回合法 206 后继续下载。 - 真正通过 WORKERFS 挂载磁盘输入并合并,浏览器确认任务
completed、下载状态complete。输出p2-cached-output.mp4为 22110 字节,ffprobe 检测到 H.264 视频、AAC 音频和 2 秒时长。保存完成自动清理任务缓存。 - 模拟一次进度消息发送失败后,后续状态更新仍继续,任务正常合并并保存为 completed;串行更新队列不会被单次进度错误永久阻断。
- 独立 M4A 与 progressive MP4 也通过真实 WORKERFS / FFmpeg 保存;估算超限任务在媒体下载前失败并提示导出本地任务。
- 活跃下载持锁时点击清理显示等待当前任务结束的提示;主动取消后释放锁、清理该任务缓存;手动清理可执行并显示 0 B。测试流的取消行为显式跟随 AbortSignal。
- 从已完成任务点击「导出本地任务」,生成版本 1 清单,含完整两轨、720P 画质、提交时的目录和文件命名;输出文件没有 Cookie、队列 runId 或浏览器下载 ID。
- 将这一份浏览器实际导出的清单交给 Python 助手,以相同本地两秒媒体代替 CDN 响应,实际调用本机 FFmpeg 并保存 22109 字节 MP4;本机与 WASM 的封装结果大小略有差异,媒体轨道与时长一致。
- 桌面 1280px 和窄屏 390px 页面已查看;窄屏文档宽度 390px,无横向溢出。缓存、说明、命令换行与导出反馈可见。
本地检查脚本:output/playwright/p2-cache-check.js、p2-cache-formats-check.js、p2-progress-recovery-check.js;截图:p2-cache-desktop.png、p2-cache-mobile.png;导出清单:p2-native-task.bili.json。这些模拟接口和本地媒体不代表真实账号、真实 CDN 都支持 ETag / Range,也不证明 GB 级资源的性能或磁盘容量。
边界
- 浏览器仍限制单任务输入 512 MB,输出仍经过 WASM 内存。OPFS 缓存不能消除合并的内存边界;实际大文件应使用本地助手。
- Windows 助手路径、真实 CDN 的续传、浏览器磁盘回收与真实配额不足没有现场实测;相应失败分支通过自动化模拟验证。真实大型资源的长时间运行和吞吐性能尚待验证。
- Firefox 本轮分别尝试项目下绝对路径和
/tmp的新隔离 profile,进程均报Could not find profile folder.并退出 1,未进入扩展运行。仅确认 Firefox 构建通过,尚不能确认该环境的 OPFS / WORKERFS 运行兼容性。
P3 会话恢复与长期历史(2026-10-05)
自动检查
新增 17 项测试,JavaScript / TypeScript 合计 94 项通过。7 项会话测试覆盖来源 / 分页 / 勾选 / 快照恢复、版本冲突、新会话替换、失去响应后的回执重放、失败重试、选项与回执保护、BV / av 别名及 UTF-8 大小限制。10 项长期历史测试覆盖一次性迁移、完成状态转移、删除不复活、最近成功替换、5000 条与 3 MiB 淘汰、损坏数据、重新入队、超过 100 条后的去重、检索与安全导出。
本地助手 25 项测试通过。format:check、ESLint、typecheck、Chromium / Firefox 构建和 git diff --check 通过,无新增依赖或扩展权限。普通进度更新不会解析和重新编码整个长期历史;迁移或新任务完成时才处理历史归档。
Chromium 生产扩展
使用独立 Chrome for Testing 配置加载生产扩展,B 站元数据 API 和历史数据使用测试 fixture;真实执行扩展消息、storage.local、页面交互与下载记录文件保存。本轮不重复声称测试了真实媒体下载:新增完成归档用构造的 saving 任务经真实 runner.update 消息验证,媒体保存的既有验收见上方 P2。
- 125 条旧队列包含 123 条成功记录;全部成功项在队列裁剪前迁移到独立历史,不伪造旧记录的完成时间,也不保留 runId / 浏览器下载 ID。
- 删除单条历史后,队列更新与刷新不会恢复该记录。清空队列仍保留其余 122 条成功记录。重新入队生成新 ID,沿用字幕语言、720P 偏好、命名模板与目录;重复添加活跃素材被拒绝。
- 构造 saving → completed 转移,真实 runner.update 将成功记录及完成时间归档;重复终态消息不重复写入,删除记录后迟到消息不会使其复活。
- 20 条分页、搜索与素材筛选、筛选后回到第一页正常。实际导出 JSON / CSV 文件均只含 2 条筛选结果。390px 页面无横向溢出。
- 收藏夹来源、其他来源草稿、勾选、480P / 全部 P / 关闭成功跳过及下一页游标均在刷新后恢复;刷新本身没有发起来源 API 请求。
- 停止分页后刷新,迟到响应不会覆盖已保存的条目和游标。停止入队仅完成当前视频的 3 个任务;刷新保留 1 条回执与 2 条待处理视频,恢复后选项保持锁定,手动继续只新增剩余 6 个任务。
- 修改来源产生的过期预览在刷新后仍禁止入队;重新预览创建新会话并解锁选项。390px 批量导入布局无横向溢出。
- 两个真实下载中心标签页的旧版本写入被拒绝。清除队列与成功历史后,以旧版本和 skipCompleted=false 重放同一 batch.add,返回原回执,不新增任务、不请求 API。使用最新版本保存也不能擦除回执或修改已固定的选项。
- 全部 P 模式的重复来源和 BV / av 别名不会重复加入,关闭成功跳过后仍遵守本会话的回执;独立长期历史参与批量跳过,删除对应记录后可重新加入。
- 新建独立配置加载最后一次构建,损坏会话显示简洁错误;显式清除后可编辑,100 条测试队列不受影响。重置有效会话被拒绝,避免旧页面覆盖其他窗口的新会话。损坏历史可通过界面确认清空,刷新后正常使用。最终控制台无错误或警告。
本地脚本与产物在忽略目录 output/playwright/:p3-fixture.js、p3-library-check.js、p3-library-ui-check.js、p3-completion-check.js、p3-session-ui-check.js、p3-receipt-cas-check.js;截图为 p3-library-desktop.png / p3-library-mobile.png、p3-session-restored-desktop.png / p3-session-restored-mobile.png。JSON / CSV 导出保留为 p3-library.json / p3-library.csv。
边界
- 长期记录按数量与大小有界,不是全量下载档案;无法找回升级前已经淘汰的旧记录,也不检查磁盘文件是否仍存在。
- 本轮来源接口为模拟数据,不证明真实登录、风控或 CDN 行为;既有真实接口和大型任务边界继续适用。
- Chromium 已进行扩展运行验证。Firefox 本轮再次用隔离配置启动两次,第二次预先创建目录并传入绝对 profile 路径,仍均在启动阶段报
Could not find profile folder.、退出码 1,未加载扩展;确认构建通过,尚未完成 Firefox 实机验收。
P3 任务控制、P4 助手直连与 P5 素材组合(2026-10-05)
原规划聊天中剩余的三项功能已实现。自动检查为 118 项 JavaScript / TypeScript 测试、38 项 Python 测试全部通过,格式、ESLint、类型、Chromium / Firefox 生产构建和 git diff --check 通过。增加的是可选 nativeMessaging 权限,没有新增运行依赖;宿主注册由用户运行安装脚本。
新增测试覆盖单任务暂停与缓存保留、快速暂停 / 继续的旧执行隔离、保存阶段边界、迟到 storage 事件、排序、组合原子容量校验、完整成员保留及存储预算。活动组合的已完成成员同样计入 1000 个保留名额,新增任务为后续进度与文件名预留空间;历史以完整组在 4 MiB 预算内淘汰,避免反复暂停大组合撑满存储。
Python 原生协议测试覆盖帧长度与身份、过期链接刷新、断开 / 取消、FFmpeg 子进程结束、输出发布前取消、配置与安装路径,安装测试只写临时目录。真实子进程测试确认:即使浏览器保持 stdin 打开,任务完成后 Python 也正常退出,修复了守护线程读取 BufferedReader 导致的退出崩溃。已有真实 FFmpeg / ffprobe 封装检查继续通过;Windows 路径与注册函数在测试中验证,未在 Windows 主机执行注册。
Chromium 运行证据
使用独立 Chrome for Testing 配置与真实生产扩展,B 站元数据 / 播放 / 素材接口为固定响应,媒体为本地两秒样例:
- 页面勾选五种素材与全部 3 个分 P,一次新增 13 个成员,只含一份封面。任务共享组合 ID,快照目录为视频目录,队列暂停状态保持。
- 等待任务单项暂停,刷新后仍为暂停;继续后可以下移,队列按调整后的顺序执行。
- 全部 13 个素材经过真实 WASM、浏览器下载 API 与文件保存,组合显示已保存 13 / 13,长期记录包含 13 份素材。MP4 经 ffprobe 确认为 H.264 + AAC,M4A 仅 AAC,时长均 2 秒。样例的画质标签用于验证选择策略,不代表实际测试媒体分辨率。
- 网络传输中暂停,OPFS 保留 1466 / 2932 字节的视频前缀;暂停期间另一份封面正常完成。刷新后继续发送
Range: bytes=1466-与对应强 ETag 的If-Range,最终真实合并并保存 MP4。 - 桌面组合选择与完成卡片已查看;390px 下载中心没有横向溢出。
- 原生助手界面联调验证权限拒绝不改变队列、独占交接、进度回传、筛选隐藏行后仍继续运行、过期地址重新取流、完成写入长期记录、取消发送及迟到完成结果被拒绝。此测试仅模拟 Native Port 和权限决定,执行真实扩展 UI / 后台 / 存储;没有连接已安装宿主或实际保存原生文件,不能视为系统注册后的端到端证明。
截图与临时脚本位于忽略提交的 output/playwright/:pnext-bundle-panel.png、pnext-bundle-completed.png、pnext-mobile.png、pnext-bundle-setup.js、pnext-pause-check.js、pnext-native-check.js 与 pnext-native-result.png。真实输出为 pnext-video-*.mp4、pnext-audio-*.m4a、pnext-cover-1.png、pnext-subtitle-*.srt、pnext-danmaku-*.xml 与 pnext-resumed.mp4。
尚需真实环境验收
- 本轮再次启动 Firefox 隔离配置,仍在加载扩展前报
Could not find profile folder.并退出。Firefox 构建通过,运行验收尚未完成。 - 没有把宿主安装到用户正在使用的浏览器,实际注册后的浏览器与宿主连接、系统权限弹窗,以及 Windows / Linux 实机仍待验证。
- 真实登录权限、真实 CDN 长时间续传与 GB 级磁盘 / 内存压力尚未补验;模拟响应、短媒体与协议测试不能替代这些项目。