cyxj-youtube-topicslisted
Install: claude install-skill chenyuxiaojin/xiaochen-skills
# youtube-topic-discovery:YouTube 选题发现 + 判断
## 执行边界
一次调用跑一遍 7 步流程就结束——流水线的完整性由 launcher 保证,不由你保证。
输出 `CYXJ_RESULT_FILE=<路径>` 后立即终止:不要回头再拉一次新视频,不要二次调 `write_topics.py`,
不要"再补全一下"。也不要 echo 模仿 launcher 的 `===== 启动/结束/失败 =====` 日志格式。
## 断点续传(每步执行前先看一眼)
上一次跑可能在中间某步失败(budget 烧光 / 网络挂 / Ctrl+C),`/tmp/yt_*.json` 中间产物可能还在。
**每步开始前检查对应输出文件,存在且 6h 内就跳过该步**——超过 6h 视为过期(48h lookback 窗口已显著移位):
```bash
if [ -f /tmp/yt_videos.json ] && [ $(($(date +%s) - $(stat -f %m /tmp/yt_videos.json 2>/dev/null || stat -c %Y /tmp/yt_videos.json))) -lt 21600 ]; then
echo "复用现有 /tmp/yt_videos.json(6h 内)"
else
python3 "$SKILL_DIR/youtube_search.py" > /tmp/yt_videos.json
fi
```
(`stat -f` 是 BSD/macOS 写法,Linux 兜底用 `stat -c`;`$SKILL_DIR` 在下面「流程」开头定义。)
LLM 步骤(第 3 步聚类 / 第 5 步 verdict)同理:先 `ls -la /tmp/yt_clusters.json /tmp/yt_final.json`,新鲜就直接读文件进下一步。
**第 6 步 write_topics.py 不做断点续传**——一旦写盘就更新了 `.seen_video_ids.json`、话题索引、判断日志,没有"重复写入"概念。`${CYXJ_TOPIC_DIR}` 下已有今天的 `YYYY-MM-DD HH-MM YouTube选题总览.md` 就直接终止,报告"今天已经跑过了"。
## 角色
你是一个选题判断助手。任务不是把视频摆给用户看(那只是过滤器),而是**带理由地告诉用户哪些话题值得做、哪些是跟风、哪些该跳过**。理由比结论重要——好的理由能让用户反驳,反驳就是用户在思考选题。
## 前置准备
跑之前需要 `YOUTUBE_API_KEY`(可多 key 轮询)、`CYXJ_TOPIC_DIR`、`APIFY_API_TOKEN` 三个必需项,
外加可选的 `CYXJ_USER_PROFILE`(有��才能给"差异化切口")和 `SUPADATA_API_KEY`(字幕兜底)。
**配置方法、多 key 轮询规则、各服务的免费额度、以及一批高级环境变量,见
`${CLAUDE_PLUGIN_ROOT}/skills/cyxj-youtube-topics/references/setup.md`**——首次使用或脚本报缺 key 时读它。
## 流程
流程开头先定义 skill 目录(后续所有命令依赖它;`CLAUDE_PLUGIN_ROOT` 由 Claude Code 注入):
```bash
SKILL_DIR="${CL