Skip to content

feat(download): 合集批量下载支持分包、断点续传与失败重试 - #190

Open
wangshucheng wants to merge 1 commit into
wechat-article:masterfrom
wangshucheng:batchDownload
Open

wangshucheng wants to merge 1 commit into
wechat-article:masterfrom
wangshucheng:batchDownload

Conversation

@wangshucheng

Copy link
Copy Markdown

背景 / 问题

大合集在一次批量下载时,会把全部文章资源塞进单个 zip,再调用 JSZip.generateAsync 生成。资源(尤其是图片/视频较多)体量过大时,单次打包的内存峰值过高,极易触发 Array buffer allocation failed,导致整批下载失败,且失败前已下载内容无法复用、只能重头再来。

主要变更

1. 分包下载(composables/useBatchDownload.ts

  • 默认 20 篇/包,将合集拆分为多个独立分包。
  • 每个分包独立执行「下载文章内容 → 打包资源 → 生成 zip → 保存文件」后随即释放内存,内存峰值被限制为单包大小,根治 Array buffer allocation failed
  • 单包文件名带序号与总包数(partXX-ofYY.zip),便于排序与解压。

2. 断点续传

  • 分包粒度进度持久化到 localStorage(key 按 taskId,建议传 fakeid + album_id 区分合集),再次触发下载时跳过已完成分包。
  • checkResumable() 同时校验文章总数与分包大小:若调整后分包划分变化,旧进度不再误判为可续传。

3. 失败重试

  • 单包内置 3 次重试(间隔 3s);某包失败仅做标记并继续后续包。
  • 全部包处理结束后,可「继续下载」仅补失败的分包,无需重跑成功包。

4. 进度反馈 UI(pages/dashboard/album.vue

  • 下载按钮实时显示「分包 X/Y · 阶段 · 计数」。
  • 检测到可续传进度时,按钮切换为「继续下载」。
  • 新增整体进度条(UProgress 百分比)+ 失败分包红色高亮提示;切换合集时自动检测续传进度。

5. 分包大小可配置(composables/useDownloadSettings.ts

  • 新增设置 composable,管理并持久化「分包大小」(默认 20,范围 1–200,越界自动 clamp)。
  • 下载按钮前新增「分包大小 / 篇·包」输入框:含大量视频/大图的合集可调小到 5–10,降低单次打包内存峰值;调整分包大小时自动重新检测续传状态。

变更文件

  • composables/useBatchDownload.ts(+328/-26):核心下载逻辑重写为分包 + 续传 + 重试。
  • composables/useDownloadSettings.ts(新增):分包大小设置与持久化。
  • pages/dashboard/album.vue(+88):进度反馈 UI 与分包大小配置控件。

测试建议

  1. 普通图文合集:默认 20 篇/包完整跑通,确认生成多个 partXX-ofYY.zip
  2. 大合集/含视频合集:调小分包大小,验证不再出现 Array buffer allocation failed
  3. 下载中途关闭页面再进入同一合集:按钮应变为「继续下载」,仅补未完成的分包。
  4. 部分分包失败后:结束时可「继续下载」仅补失败包。

This branch has not been deployed

No deployments
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.

1 participant