## Before / After
| 场景 | Before | After |
| --- | --- | --- |
| 首轮下载 | 只看 `DONE ok=22 failures=...`,人工继续补 | 每轮都产出 `download_manifest.tsv`、`missing_or_unmatched.tsv`、`candidate_audit.tsv` |
| 候选不足 | 先用 `/api/ss`,失败后临时发现 `/api/s/{q,m,n,k}` | 默认并行跑 `/api/ss` + QQ/咪咕/网易/酷我接口,并记录每个平台候选数 |
| 验收 | 人工数文件,后来才发现缺 54 号和 5 首短音频 | `--check-only --source-dir <src> --output-dir <out> --min-duration 45 --qa-json qa_report.json`;缺号或短音频直接 exit 1 |
| 交付口径 | “下载完了”容易漏掉错误匹配、短音频、登录弹窗 | 只有 `expected_count=55`、`missing_indices=[]`、`short_tracks=[]`、`unmatched=[]` 才能说完成 |
### 建议命令
```bash
python3 /Users/bytedance/Documents/learning-bu/.agents/skills/song-mp3-download/scripts/download_tonzhon_mp3.py \
--source-dir "/path/to/source" \
--output-dir "/path/to/out" \
--expected-artists "/path/to/expected_artists.tsv" \
--probe-duration
python3 /Users/bytedance/Documents/learning-bu/.agents/skills/song-mp3-download/scripts/download_tonzhon_mp3.py \
--source-dir "/path/to/source" \
--output-dir "/path/to/out" \
--check-only \
--min-duration 45 \
--qa-json "/path/to/out/qa_report.json"
```
### 成功信号
```text
total_expected 55
total_mp3 55
missing_indices none
short_under_45s 0
unmatched 0
exit_code 0
```
### 失败信号
```text
missing_indices 54
short_under_45s 5
unmatched 3
exit_code 1
```
失败后不要重新开始整批任务,优先查看 `candidate_audit.tsv`,只对失败序号加 `--probe-duration --force` 或补 `expected_artists.tsv`。