feat(export): 支持 CSV 计划导出和稳定导出索引 (#114)
两个核心增强: 1. **CSV 计划导出工作流** (`--write-plan-csv` / `--from-plan-csv`) - 支持 blacklist (export=0 跳过) / whitelist (export=1 导出) 两种模式 - `--size-mode estimate|scan` 控制是否扫本地附件 - UTF-8 BOM 编码, Excel/WPS 直接打开 - 解决了之前"动不动全量导出"的痛点 2. **`_export_index.json` 稳定导出索引** - 用 username 追踪当前 JSON 文件 - 联系人备注/群名变化时自动重命名旧文件 (而不是产生孤儿) - 同名联系人冲突时自动追加 `__<username>` 后缀 - atomic write (tmp + os.replace), bootstrap from existing files 3. **JSON metadata 扩展** - 新增 `date_first_msg / date_last_msg / contact_remark / contact_nick_name / contact_tags / contact_memo` 测试: 717 行, 20 tests pass, 覆盖 CRUD 索引、黑白名单、命名冲突、incremental rename、UTF-8 BOM。
This commit is contained in:
@@ -14,6 +14,12 @@
|
||||
为语音消息填充转录文本。`transcribe_chat.py` 可重复运行 —— 已转录的
|
||||
消息会被跳过。
|
||||
|
||||
`export_all_chats.py` 批量导出时会在输出目录维护 `_export_index.json`。
|
||||
该索引用稳定的 `username` 记录当前 JSON 文件名;联系人备注或群名变化后,
|
||||
下一次导出会先把旧文件重命名为新的可读文件名,再继续增量合并。若新的
|
||||
显示名文件已经属于另一个 `username`,导出文件会追加 `__<username>` 后缀,
|
||||
避免覆盖同名联系人或同名群。
|
||||
|
||||
## 顶层结构
|
||||
|
||||
```json
|
||||
@@ -21,6 +27,12 @@
|
||||
"chat": "<display name>",
|
||||
"username": "<wxid 或 @chatroom>",
|
||||
"exported_at": "YYYY-MM-DD HH:MM:SS",
|
||||
"date_first_msg": "YYYY-MM-DD HH:MM:SS",
|
||||
"date_last_msg": "YYYY-MM-DD HH:MM:SS",
|
||||
"contact_remark": "<remark>",
|
||||
"contact_nick_name": "<nick name>",
|
||||
"contact_tags": ["<tag>"],
|
||||
"contact_memo": "<memo>",
|
||||
"is_group": true,
|
||||
"messages": [ ... ]
|
||||
}
|
||||
@@ -30,6 +42,9 @@
|
||||
- `username` —— 稳定的 WeChat 用户名(1-on-1 聊天为 `wxid_*`,群聊为 `*@chatroom`)。
|
||||
`transcribe_chat.py` 会优先读取本字段而非基于 `chat` 再次模糊匹配,避免同名联系人漂移。
|
||||
- `exported_at` —— 本地时间字符串,仅作溯源用途。
|
||||
- `date_first_msg` / `date_last_msg` —— 本次导出结果中第一条 / 最后一条消息的本地时间。
|
||||
- `contact_remark`、`contact_nick_name`、`contact_tags`、`contact_memo` ——
|
||||
单聊联系人 metadata;群聊中省略。
|
||||
- `is_group` —— **仅**群聊出现且为 `true`;1-on-1 聊天时省略。
|
||||
- `messages` —— 消息数组,跨所有 DB 分片按时间由旧到新排序。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user