豆备 DOUBAK
← 开发日志

档案里第一次有了真的图片

作品封面进档案,bundle 格式随之升到 1.1:surface 多了一个 asset。

在此之前,把档案离线打开,图全是空的——所有 <img> 都指向 doubanio.com,而档案里没有那些字节。这是「备份必须联网才能看」的病根, 也正是别的豆瓣备份工具普遍留着的那个洞。今天补上了第一块:作品封面。

格式先动,代码后动

档案格式在另一个仓库里,是整个项目的基石,规矩是先落规范,再落生产者和消费者。 所以顺序是:bundle 升到 1.1,surface 词表新增一个取值 asset, 然后扩展才跟上。

surface 说的是「这个捕获是页面的哪一种表面」——一个 HTML 列表页、 一个详情页、还是一张图片。加 asset 而不是复用已有取值,是因为解析器以后 必须能一眼把非 HTML 的资源筛出来:它们不参与任何抽取,只在重放的时候被引用。

同一次改动里还加了 current_spec_version,把「读者能接受什么版本」 和「生产者现在该写什么版本」分成两个字段。以前这是一个字段, 意味着一个还没支持 1.1 的读者没法表达「我认得 1.1,但我自己写的是 1.0」。

封面跟着作品详情页走

封面图不是一条独立的路线,它挂在作品详情页那条路线下面:抓到一个详情页, 顺手把页面里那张封面也抓下来。这个决定很省事,但有一个必须写清楚的后果——

如果一次增量抓取没有重抓某个作品详情页,那这个作品的封面也不会有。

对于「上次抓的时候还没有封面、这次也没重抓详情页」的老条目,档案里就是没有图。 这不是 bug,是这个设计的直接推论,所以它被写进了文档而不是被悄悄容忍。 补齐老条目封面的办法是显式地重抓一遍作品详情页,面板上有这个入口。

顺手撞上的坑:Referer

doubanio.com 上的图片要求带对 Referer。抓取队列里的条目可以自带请求头, 这一段本来是通的——直到它走过一次 checkpoint 之后就不通了。

原因是崩溃恢复:checkpoint 把队列写进 OPFS,恢复的时候再读回来。 条目上自带的那份请求头没有进序列化,于是恢复一次,所有图片就开始 403。 这类 bug 有个共同的形状——某个字段在内存里存在、在磁盘上不存在, 于是一切正常直到第一次崩溃。今天修的另一个也是同一族: 崩溃恢复会静默丢掉「派生出来的活」(作品详情页是从标记列表派生的), 恢复之后那些活就消失了,而抓取还会开开心心地报告自己跑完了。

「恢复之后还是不是同一份东西」这件事,得每加一个字段就重新问一次。 MV3 的 service worker 随时会被杀,所以这不是边缘情况,这是日常。

← 更新:公开测试开始 更早:一堆档案不等于一条链 →