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 リリースは Python 3.10+ が必要)ffmpeg→imageio-ffmpegから、~/.local/bin/ffmpegにシンボリックリンクwhisper→openai-whisper(システム Python 下。モデルは初回使用時にダウンロード)node→~/.local/node(v24)— YouTube の防御機構を突破するために必要
YouTube の場合、install.sh は以下もセットアップします:
- POトークンプロバイダー(
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 URL の場合、余分なフラグは無害です。
ワークフロー
1. セットアップ
- 作業用フォルダを作成:
mkdir -p /tmp/watch/<slug>(slug は URL/トピックから短い名前を付ける) - URL(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秒に1フレーム)を動画の長さに合わせて調整し、フレーム数が約 150 枚になるようにしてください。i 番目のフレームのタイムスタンプ = i × 間隔です。
4a. YouTube:なぜすべてが yt.sh を経由するのか
YouTube(2025年以降)では、以下の3つすべてが同時に必要です。そうしないと HTTP 403 / 「ボットではありません」 / 「画像のみ」が発生します:
- ログイン済みアカウントの Cookie(
~/.config/watch/cookies.txt) - POトークン(Proof-of-Origin)—
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行)
- タイムスタンプ付きの主要概念
- テキストにはないが画面上に表示されているもの(グラフ、UI、デモ)
- タイムスタンプ付きの注目すべき瞬間/引用
7. ナレッジベースへの保存(事前に確認)
確認する:「この分析をナレッジベース(Obsidian)に保存しますか?」「はい」の場合、関連ノートへのリンクを含むマークダウンノートを適切なフォルダに書き込む。確認なしでは保存しないでください。
ルール
- 作業ファイルは一時フォルダ
/tmp/watch/<slug>に置く — プロジェクトを散らかさないこと - 明示的なリクエストなしに外部に公開・送信しないこと
- ログインが必要なプライベート動画はバイパスせず、代わりにユーザーにその旨を伝えること