上传工作流
本文详述“新建项目/上传到项目”的完整流程与各阶段的行为。
阶段一:扫描与解析
- 从所选本地文件/文件夹中构建“候选话目”。
- 文件名解析优先匹配:
- 形如“第N话/集/章”或“……N话/集/章”。
- 范围 N-M、N~M、N~M、N—M、N_ M、N 至 M、N 到 M 等;若存在多段范围,取所有范围的最大右端值作为话数。
- 小数与段号(如 62.1)按 62 处理,避免 621 的误判。
- 噪声过滤:日期(yyyy-mm-dd / yyyymmdd)、分辨率(1080p/720p/2160p)等被排除。
- 支持“卷/番外/普通话”命名:卷NN、番外NN 或“番外”;普通话用纯数字 NN。
阶段二:元数据确认
- 弹出 TreeDataGrid 对话框列出所有候选话目。
- “话数”列可编辑,回车或确认按钮将写回模型。
- 同步展示每一话的已识别文件(源/翻译/排版)。
阶段三:远端准备
- 按“卷/番外/普通话”一致的规则创建远端目录结构。
- 若目录已存在则跳过并校验是目录。
阶段四:合并与写入 JSON
- 如为“新建项目”,会先下载并合并聚合清单 /project.json(中文不转义、带缩进)。
- 下载已有项目 JSON(若“上传到项目”),合并新增的话目项并排序(RankKey)。
- 上传回项目 JSON。
阶段五:文件上传
- 大文件(压缩包、PSD 等)采用本地文件路径直传(零拷贝流式上传),连接复用,超时无限。
- 文本(.txt)通常较小,直接以内存字节上传。
- UI 显示整体 Completed/Total,当前文件 BytesSent/BytesTotal 与速度(MB/s)。
- 若远端同名文件已存在,会先根据 raw_url 下载旧文件并备份为“_yyyyMMddHHmmss”后缀文件,再上传用户文件,避免直接覆盖。
阶段六:刷新
- 上传完成后刷新项目列表与映射缓存。