vault-youtube-synclisted
Install: claude install-skill lllloo/obsidian-memory
# YouTube Channel to Notes
將 YouTube 頻道影片批次轉換成 Obsidian vault 筆記。
> 本 skill 產出進入 `Inbox/YouTube/`,代表「待消化暫存」。使用者讀完會內化成 Cards 並歸檔至 `Topics/<主題>/`,Inbox 原篇刪除。Skill 只負責抓��,不負責消化。
## 資料夾規則
- 筆記存放:`Inbox/YouTube/<頻道名>/`(例:`Inbox/YouTube/Chase-H-AI/`)
- 此資料夾已在 `quartz.config.ts` 的 `ignorePatterns` 中,**不會發佈到網站**
- 每個頻道資料夾下建立 `01.index.md` 與 `02.影片清單.base` 作為索引(數字前綴確保固定排第一)
- 影片筆記的 frontmatter 需加 `parent: "[[01.index]]"`,讓 Obsidian 圖譜能從影片連回頻道 index(`.base` 檔案不產生圖譜連結,只有 property link 有效)
## 前置作業
用 `Read vault-map.md` 確認 cwd 為 repo root(harness-native,不經 shell);讀不到就停止並請使用者 cd 到 repo root。
本 skill 高頻踩雷點:defuddle transcript 若含 token / 個資直接跳過該筆;頻道主題 tag 先用 `Grep` 查既有 vault tags 沿用,避免 `claude-code` vs `claudeCode` drift。
## 步驟 0:判斷執行模式
依使用者輸入決定處理範圍:
- **模式 A — 指定頻道**:使用者給 handle 或頻道 URL(例:`@Chase-H-AI`、`https://www.youtube.com/@Chase-H-AI/videos`)→ 直接以該 handle 執行步驟 1-6
- **模式 B — 同步全部既有頻道**:使用者未指定頻道,或明說「同步全部 / 更新所有頻道 / yt 全部更新」→ 掃 `Inbox/YouTube/*/01.index.md`,從每份 frontmatter 的 `source:` 欄位抽出 handle,**依序**逐頻道跑步驟 1-6(頻道之間順序執行避免 YouTube rate limit;單頻道內步驟 5 仍維持 5-6 部一批平行)
模式 B 取得頻道清單(每行一個 `source:` URL),cwd = repo root:
```
python3 .agents/skills/vault-youtube-sync/scripts/list_channels.py
```
模式 B 規則:
- 只處理已有 `01.index.md` 的頻道;**不會自動加新頻道**。新頻道首次同步仍須 `/vault-youtube-sync @handle` 顯式觸發
- 單頻道任一步驟失敗(fetch_videos error、network 異常等)→ 記錄錯誤、跳下一頻道,不中斷整批
- 全部跑完後在步驟 6 用一張總表呈現各頻道結果
## 步驟 1:抓取影片清單與頻道簡介
用 `fetch_videos.py` 一次抓取頻道頁面,同時取出影片清單與頻道簡介。cwd = repo root:
```
python3 .agents/skills/