Communityコーディング&開発github.com

watch — 動画を最初から最後まで視聴する

YouTubeやLoom、Zoomの録画、直接のmp4リンクなど、あらゆるURLの動画を視聴します。タイマーではなくシーンチェンジ検出(ffmpeg)でフレームを抽出するため、グラフィック、デモ、編集、Bロールを見逃しません。字幕はyt-dlpで優先取得し、Whisperをフォールバックとして使用します。

watch — 動画を最初から最後まで視聴する とは?

このスキルは、Claudeが動画を「目で見て」理解できるようにするためのツールです。動画をフレーム画像(Readツールで視覚認識)と文字起こし(テキスト)に分割し、単なる言葉だけでなく、画面上で実際に何が起こっているのかを把握します。YouTube、Loom、Zoom録画、直接mp4ファイルなど、あらゆるURLソースに対応しています。キーとなるのは、ffmpegのシーンチェンジ検出(`gt(scene,0.3)`)を用いて、タイマーサンプリングではなく、意味のある瞬間だけをフレームとして抽出する点です。これにより、スライド、コード、デモ、UIなど、テキストだけでは得られない視覚情報を確実に捉えます。字幕は無料で取得できるyt-dlpの自動字幕を優先し、なければWhisper(モデルはsmall推奨)で文字起こしします。`/watch <URL>` または「この動画を見て」「この録画を確認して」というユーザーの指示で発動します。

対応✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/akimov121-hub/watch/tree/main

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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 / 「ボットではありません」 / 「画像のみ」が発生します:

  1. ログイン済みアカウントの Cookie(~/.config/watch/cookies.txt)
  2. POトークン(Proof-of-Origin)— bgutil によってローカル生成(スクリプトモード、Node)
  3. 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> に置く — プロジェクトを散らかさないこと
  • 明示的なリクエストなしに外部に公開・送信しないこと
  • ログインが必要なプライベート動画はバイパスせず、代わりにユーザーにその旨を伝えること

関連スキル