Skip to content

fix(mp): stream public-account article images to disk - #132

Merged
finlater merged 3 commits into
finlater:mainfrom
szey:fix/mp-article-images-on-disk
Sep 5, 2026
Merged

fix(mp): stream public-account article images to disk#132
finlater merged 3 commits into
finlater:mainfrom
szey:fix/mp-article-images-on-disk

Conversation

@szey

@szey szey commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

变更说明

修复低内存设备在开启“公众号文章图片”后,下载图片较多的公众号文章时出现内存不足的问题。

原因

现有实现通过 client:get_binary 将每张图片完整读入 Lua 字符串,再生成体积更大的 Base64 字符串并持续拼接到同一个 HTML 文档中。下载过程中,原始图片、Base64 副本和不断增长的 HTML 会同时驻留在 RAM;在Kobo Libra 2 等设备上容易触发 OOM。

修改内容

  • 改用项目已有的 Client:download_to_file,把公众号图片逐张流式写入文章旁的本地资源目录。
  • 生成的 HTML 只保存相对文件路径,不再嵌入 Base64 图片数据。
  • 为每篇文章使用独立的隐藏资源目录,避免不同文章的图片文件相互覆盖。
  • 规范化 mmbiz.qpic.cnmmbiz.qlogo.cn 的协议相对 URL 及 HTML 转义参数。
  • 相同图片 URL 只下载一次,文章内的重复图片引用复用同一个本地文件。
  • 下载后检查文件头,只提交 PNG、JPEG、GIF 或 WebP;异常响应会被删除。
  • 单张图片继续使用 64 MiB 大小上限。
  • 图片下载、格式识别或文件提交失败时保留原始远程 URL,不影响文章正文保存。
  • 每处理完一张图片执行增量垃圾回收,进一步降低连续下载时的峰值内存。
  • 新增 spec/mp_article_images_spec.lua 回归测试。

类型

  • Bugfix
  • Feature
  • Refactor
  • Documentation
  • Other

Bugfix 要求

修复前的清晰复现步骤:

  1. 使用 Kobo Libra 2(512 MiB RAM)、KOReader v2026.07.1 和 WeRead 插件 v1.2.0。
  2. 在 WeRead 设置中启用 Public account article images
  3. 打开并下载一篇包含多张图片的公众号文章。
  4. 下载过程中出现 not enough memory,文章无法正常保存或打开。
  5. 关闭公众号图片下载后,同一文章的正文可以正常打开。

预期行为:公众号文章图片能够下载和显示,图片总量不应导致 Lua RAM 随 Base64 HTML 持续增长。

实际行为:启用图片后,原始图片与 Base64/HTML 副本同时占用内存,在低内存设备上触发 OOM。

Feature 要求

不适用。本 PR 不新增 UI、菜单、弹窗或交互,只修复现有公众号图片下载路径。

测试

  • 已在 KOReader 中手动测试
  • 已运行 bash scripts/run_lua_specs.sh
  • 已运行 bash scripts/check_lua_namespace.sh
  • 已运行 luacheck main.lua _meta.lua weread spec
  • 如涉及插件加载/KOReader 兼容性,已运行或触发 KOReader integration
  • 不适用,仅文档或注释变更

测试说明:

- Kobo Libra 2 / KOReader v2026.07.1 实机验证:补丁前开启公众号图片后出现 not enough memory;补丁后同一使用流程可以下载并显示公众号文章图片。
- 新增回归测试验证:图片只使用 download_to_file、不调用 get_binary;重复 URL 只下载一次;HTML 不包含 data:image/Base64;失败时保留远程 URL;流式处理不会保留资源大小级别的 Lua 内存。
- weread/lib/content.lua 与新增 spec 均通过 Lua 语法解析。
- git diff --check 与定向敏感信息扫描通过。

非公开 WeRead API

  • 不涉及非公开 WeRead API
  • 已新增或更新可复现的 Python 验证脚本

脚本路径:

不适用;没有新增或修改 API、端点、请求参数或认证流程。

复现命令与脱敏结果:

不适用。

模块结构

没有新增或移动运行时模块。实现保留在现有 weread/lib/content.lua,回归测试位于 spec/mp_article_images_spec.lua,符合项目命名空间约定。

截图

不适用;没有 UI 或交互变更。

Checklist

  • 我已经说明这个 PR 解决的问题或新增的特性。
  • 如果是 bugfix,我已经提供复现步骤或关联 issue。
  • 如果是新增 UI/交互特性,我已经提供截图或录屏。(不适用)
  • 我没有提交 KOReader settings/weread.lua、API key、cookie、token、x-wrpa-* 或私人书籍内容。
  • 新增或移动的项目 Lua 模块遵循 weread/lib/weread/ui/ 命名空间规范。(未新增或移动运行时模块)
  • 新增或修复的逻辑包含对应回归测试;若无法自动化,已在测试说明中解释原因。
  • 如果修改了用户可见文本,我已经更新 weread/lib/i18n.lua。(不适用,没有新增用户可见文本)
  • 如果修改了菜单结构,我已经同步更新 README 菜单结构。(不适用,没有修改菜单)
  • 如果涉及非公开 WeRead Web API,我已经在 scripts/ 中提交可独立运行、可复现的 Python 验证脚本,并填写了复现命令和脱敏结果。(不适用,没有修改 API)

@finlater

Copy link
Copy Markdown
Owner

感谢贡献,麻烦修复CI问题,另外download_mp_images已经是死代码了 可以直接删除

@finlater
finlater merged commit 54d225d into finlater:main Sep 5, 2026
1 check passed
@finlater

finlater commented Sep 5, 2026

Copy link
Copy Markdown
Owner

感谢贡献 已合入

@szey
szey deleted the fix/mp-article-images-on-disk branch September 6, 2026 05:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants