watch — 讓Claude從頭到尾看完一部影片 是做什麼的?
將影片拆分為Claude原生能夠讀取的東西:幀圖片(使用Read工具查看)+ 逐字稿(文字)。結果不僅理解話語,還能掌握螢幕上發生的事。
雙語支援。 這是英文版。完整的俄文對應版本為
SKILL.ru.md。 使用者使用哪種語言就使用哪種語言工作;工作流程與指令完全相同。
依賴項目(透過 install.sh 一次性安裝)
檢查方式:command -v yt-dlp ffmpeg whisper node
yt-dlp→~/.local/bin/yt-dlp(安裝於~/.local/python312下的 Python 3.12 — 系統 Python 通常過舊;近期 yt-dlp 版本需要 3.10+);ffmpeg→ 來自imageio-ffmpeg,符號連結至~/.local/bin/ffmpeg;whisper→openai-whisper(安裝於系統 Python 下;模型會在首次使用時下載);node→~/.local/node(v24)— 用以繞過 YouTube 的防護措施。
針對 YouTube,install.sh 還會設置:
- 一個 PO-token 提供者(
bgutil),以指令稿模式建構於~/.local/bgutil-pot/server/build/; - Node.js 執行環境 + 一個 EJS 元件,用以解決 YouTube 的 n-challenge;
- 來自已登入 YouTube 帳號的 Cookie,存放於
~/.config/watch/cookies.txt。
如果 Cookie 過期(YouTube 再次要求「確認你不是機器人」),請使用者透過瀏覽器擴充功能(如「Get cookies.txt LOCALLY」)重新匯出 cookies.txt,並放置於 ~/.config/watch/cookies.txt。
務必透過包裝腳本下載:bash ~/.claude/skills/watch/yt.sh … — 它會自動加入正確的 YouTube 旗標。對於直接 mp4/Loom/Zoom 網址,這些額外旗標不會造成影響。
工作流程
1. 設定
- 建立工作資料夾:
mkdir -p /tmp/watch/<slug>(slug = 從網址/主題提取的簡短名稱)。 - 解析網址(YouTube / Loom / Zoom 分享連結 / 直接影片檔案)。若是本機檔案則跳過下載步驟 — 直接處理該檔案。
2. 逐字稿 — 優先使用字幕(免費時可用)
bash ~/.claude/skills/watch/yt.sh --write-subs --write-auto-subs --sub-langs "en,ru" \
--skip-download --convert-subs srt -o "/tmp/watch/<slug>/subs.%(ext)s" "<URL>"
如果出現 .srt 檔案,那就是一份帶時間戳的現成逐字稿 — 直接使用它。
3. 下載影片(擷取畫面與作為 Whisper 備援都需要)
bash ~/.claude/skills/watch/yt.sh -f "bv*[height<=480]+ba/b[height<=480]/18/best" \
-o "/tmp/watch/<slug>/video.%(ext)s" "<URL>"
你會得到 .mp4 或 .webm 檔案 — 之後使用實際的檔案名稱(video.*)。
如果沒有字幕,就用 Whisper 將音訊轉錄成文字(模型 small;若要快速測試可用 base):
whisper "/tmp/watch/<slug>/video.webm" --model small --language en \
--output_format srt --output_dir "/tmp/watch/<slug>/"
第一次執行時會下載模型(small 約 460 MB)— 這是正常的一次性行為。若非英語音訊請移除 --language en,或設定正確的語言代碼。Whisper 速度較慢:一段 34 分鐘的片段需要數分鐘 — 請在背景執行。
4. 按 場景變化 擷取畫面(關鍵步驟 — 非定時取幀)
ffmpeg -i "/tmp/watch/<slug>/video.webm" -vf "select='gt(scene,0.3)',showinfo" \
-vsync vfr "/tmp/watch/<slug>/frames/frame_%04d.png" 2> "/tmp/watch/<slug>/scenes.log"
- 臨界值
0.3— 調整0.2–0.4以控制畫面密度(數值越低 = 畫面越多)。 - 從
scenes.log中的 showinfo 日誌(pts_time)取得每幀的時間戳。 - 如果畫面太多(長影片),保留約 60–150 張最具資訊量的畫面,並刪除時間上過於接近的幀。解碼長影片需要一些時間 — 請在背景執行。
備援方案 — 如果場景太少(0–2 幀)。 平順、未經剪輯的素材(單一連拍鏡頭、空拍機、頭像談話)產生的場景變化很少。此時改以固定間隔取樣:
ffmpeg -i "/tmp/watch/<slug>/video.webm" -vf "fps=1/5,scale=960:-1,showinfo" \
-vsync vfr "/tmp/watch/<slug>/frames/frame_%04d.png" 2> "/tmp/watch/<slug>/scenes.log"
根據影片長度調整間隔(1/5 = 每 5 秒一張畫面),使總數維持在約 150 張以內。第 i 張畫面的時間戳 = i × 間隔。
4a. YouTube:為何所有操作都經過 yt.sh
YouTube(2025 年後)需要同時具備以下三項,否則會回傳 HTTP 403 / 「不是機器人」/「僅限圖片」:
- 來自已登入帳號的 Cookie(
~/.config/watch/cookies.txt); - PO-token(來源證明)— 由
bgutil在本機產生(指令稿模式,Node); - 解決 n-challenge — 使用 Node 執行環境 + EJS 元件(
--remote-components ejs:github)。 以上全部已內建於yt.sh— 直接呼叫即可。直接 mp4/Loom/Zoom 來源沒有這些防護措施。如果再次要求「確認你不是機器人」,代表 Cookie 已過期 — 要求提供新的cookies.txt。
5. 分析
- 讀取逐字稿(
.srt)。 - 檢視提取的畫面(透過 Read 工具進行視覺辨識):簡報投影片、程式碼、示範畫面、圖形。
- 利用時間戳將視覺內容與逐字稿對應起來。
6. 報告
提供:
- TL;DR(3–5 行);
- 附時間戳的關鍵概念;
- 文字中未呈現但螢幕上顯示的內容(圖表、使用者介面、示範畫面);
- 附時間戳的 Notable moments / Quotes。
7. 儲存至知識庫(先詢問)
詢問:「將此分析結果儲存至您的知識庫(Obsidian)?」如果同意,則在適當資料夾中撰寫一則 Markdown 筆記,並包含相關筆記的連結。未經確認不得儲存。
規則
- 工作檔案置於暫存資料夾
/tmp/watch/<slug>— 不要污染專案目錄。 - 未經明確要求,不得對外發布或傳送任何內容。
- 不應繞過需要登入才能觀看的私人影片 — 應告知使用者。