douyin-downloader/PROJECT_SUMMARY.md

141 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 项目实现总结dy-downloader
## 1. 项目概览
- **项目名称**: Douyin Downloader (`dy-downloader`)
- **版本**: `2.0.0`
- **更新时间**: `2026-02-18`
- **当前状态**: ✅ 核心功能可用,自动化测试通过
## 2. 当前实现能力(按代码现状)
### 2.1 已支持
- 单个视频下载(`/video/{aweme_id}`
- 单个图文下载(`/note/{note_id}`
- 抖音短链下载(`https://v.douyin.com/...`,会先解析后下载)
- 用户主页发布作品批量下载(`/user/{sec_uid}` + `mode: [post]`
- 无水印优先下载,支持封面/音乐/头像/原始 JSON
- 并发下载、重试、速率限制
- 基于作品发布时间(`create_time`)生成文件名/目录日期前缀(`YYYY-MM-DD_...`
- 生成独立下载清单文件 `download_manifest.jsonl`
- 时间过滤(`start_time` / `end_time`
- 数量限制(当前对 `number.post` 生效)
- SQLite 去重与增量下载(当前对 `increase.post` 生效)
- 翻页受限时的浏览器兜底(采集 `aweme_id` 并补全详情)
### 2.2 已新增(本次实现)
- 用户点赞下载(`mode: [like]`
- 用户合集下载(`mode: [mix]`)与单合集链接(`/collection/{mix_id}`、`/mix/{mix_id}`
- 用户音乐模式下载(`mode: [music]`)与单音乐链接(`/music/{music_id}`
- `number.like` / `number.mix` / `number.music``increase.like` / `increase.mix` / `increase.music` 生效
- `number.allmix` / `increase.allmix` 兼容保留,并在加载时归一化到 `mix`
## 3. 架构与模块
```text
dy-downloader/
├── cli/ # CLI 入口与展示
├── core/ # 下载主流程、URL解析、API客户端
├── storage/ # 文件、元数据、数据库
├── auth/ # Cookie / token 管理
├── control/ # 限速、重试、并发队列
├── config/ # 配置加载与默认配置
└── utils/ # 日志与通用工具
```
## 4. 下载数据落盘策略
### 4.1 文件系统(主数据)
默认目录结构(`folderstyle: true`
```text
Downloaded/
├── download_manifest.jsonl
└── 作者名/
└── post/
└── 2024-02-07_作品标题_aweme_id/
├── 2024-02-07_作品标题_aweme_id.mp4
├── 2024-02-07_作品标题_aweme_id_cover.jpg
├── 2024-02-07_作品标题_aweme_id_music.mp3
├── 2024-02-07_作品标题_aweme_id_avatar.jpg
└── 2024-02-07_作品标题_aweme_id_data.json
```
命名日期优先使用作品发布时间 `create_time`;若缺失或非法,会回退到当前日期并记录告警。
### 4.2 独立下载清单(新增)
- 文件:`{path}/download_manifest.jsonl`
- 形式:每行一条 JSONappend-only
- 典型字段:
- `date`(作品发布日期)
- `aweme_id`
- `author_name`
- `desc`
- `media_type`
- `tags`(来自 `text_extra`、`cha_list`、`desc` 中 `#`
- `file_names`
- `file_paths`
- `publish_timestamp`(若可解析)
- `recorded_at`(写入时间)
### 4.3 SQLite 数据库(可开关)
- 默认开关:`database: true`
- 默认库文件:`dy_downloader.db`
- 表结构:
- `aweme`:作品明细、作者、发布时间、下载时间、保存路径、原始 metadata
- `download_history`:每次任务 URL、类型、总数、成功数、配置快照
> 当 `database: false` 时,不写 SQLite但**仍会写**媒体文件和 `download_manifest.jsonl`。
## 5. 关键流程(简版)
1. 读取配置(命令行 > 环境变量 > 配置文件 > 默认配置)
2. 初始化 Cookie 与 API 客户端
3. 解析链接类型(视频 / 图文 / 用户)
4. 拉取作品数据并应用时间/数量/增量规则
5. 并发下载媒体文件
6. 写入可选 JSON 元数据
7. 追加写入 `download_manifest.jsonl`
8. 若开启数据库,写入 `aweme``download_history`
## 6. 近期更新2026-02-18
- ✅ 文件名和目录日期从“下载时间”改为“作品发布时间(`create_time`)”
- ✅ 新增独立下载清单 `download_manifest.jsonl`
- ✅ 清单中补充 `date/file_names/tags` 等可追溯字段
- ✅ 增加对应测试,确保发布时间命名与清单写入行为
## 7. 测试与验证
执行命令:
```bash
PYTHONPATH=. pytest -q
```
结果:
```text
71 passed
```
说明:当前有 `pytest-asyncio` 的 deprecation warning事件循环 scope 配置),不影响功能正确性。
## 8. 后续建议
1.`like/mix/music` 增加浏览器兜底,降低 API 分页受限影响。
2.`download_manifest.jsonl` 增加轮转或归档策略(长期运行场景)。
3. 补充数据库查询 CLI例如按作者/日期/标签检索)。