mcpField
V
video-ingest

video-ingest

github.com/joelhooks生産性6536 回インストール1 日前に更新
リポジトリ

video-ingest について

video-ingestは、Inngestイベントを通じて動画をvaultに取り込むためのスキルです。ダウンロード、NASへの転送、文字起こし、要約の補完を連携し、実行監視や一括登録の手順も示します。

主な機能

  1. 01イベント駆動の動画処理パイプライン
  2. 02動画の自動ダウンロードとNAS転送
  3. 03文字起こしとvaultノートの自動生成
  4. 04動画の一括登録
  5. 05実行監視とトラブルシューティング

活用シーン

  1. 01動画URLからノートを作成
  2. 02既存の音声や文字起こしテキストを処理
  3. 03複数の動画をまとめてキューに登録

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/joelhooks/joelclaw --skill video-ingest

インストール後、Claude Code で/video-ingestを入力して読み込まれたか確認します。

詳細

動画の取り込み — Inngest パイプライン経由

動画は Inngest イベントバス経由で取り込みます。yt-dlp、mlx-whisper、scp を実行したり、Vault ノートを手動で作成したりしないでください。 パイプラインがダウンロード → NAS への転送 → 文字起こし → Vault ノート作成 → 要約の拡充まで、すべて処理します。

クイックスタート

joelclaw send pipeline/video.requested -d '{"url":"URL_HERE"}'

# legacy alias still accepted
joelclaw send pipeline/video.download -d '{"url":"URL_HERE"}'

以上です。残りはイベントチェーンが処理します。

別の方法(raw curl):

curl -s -X POST "http://localhost:8288/e/$INNGEST_EVENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"pipeline/video.requested","data":{"url":"URL_HERE"}}'

パイプラインの流れ

pipeline/video.requested       — you send this (legacy alias: pipeline/video.download)
    ↓
video-download function        — yt-dlp → /tmp → NAS transfer
    ↓ emits
pipeline/video.downloaded      — logged by system-logger
pipeline/transcript.requested  — auto-triggered (legacy alias: pipeline/transcript.process)
    ↓
transcript-process function    — mlx-whisper (M4 Pro, ~5min/hr of video)
    ↓ emits
pipeline/transcript.processed  — logged
content/summarize.requested    — auto-triggered (legacy alias: content/summarize)
    ↓
content-summarize function     — pi enrichment → vault note with summary
    ↓ emits
content/summarized             — logged, done

送信前:ヘルスチェック

イベントを送信する前に、必ずパイプラインが正常に稼働していることを確認してください。

# Inngest server
curl -s http://localhost:8288/health

# Worker (should show functions including video-download)
curl -s http://localhost:3111/ | python3 -c "
import json,sys
d=json.load(sys.stdin)
fns = [f.get('id','?') for f in d.get('functions',[])]
print(f'Worker OK — {len(fns)} functions: {', '.join(fns)}')
"

# Docker container running
docker ps --filter ancestor=inngest/inngest --format "table {{.Status}}\t{{.Ports}}"

ワーカーが停止している場合:

kubectl -n joelclaw rollout restart deployment/system-bus-worker
kubectl -n joelclaw rollout status deployment/system-bus-worker --timeout=180s
joelclaw refresh

実行状況の監視

進行状況をリアルタイムで確認する
# Worker logs — shows step execution + failures
kubectl logs -n joelclaw deploy/system-bus-worker -f

# Docker logs — shows event dispatch
docker logs -f $(docker ps -q --filter ancestor=inngest/inngest) 2>&1 | grep -v DEBUG
イベントが発火したか確認する
# Look for the video's events in Docker logs
docker logs $(docker ps -q --filter ancestor=inngest/inngest) 2>&1 | grep -i "video\|transcript\|summarize" | tail -20
ダッシュボード

ブラウザーで http://localhost:8288 を開くと、関数、イベント、実行状況とステップごとのトレースが表示されます。

完了を確認する
# Check if vault note was created
ls -la ~/Vault/Resources/videos/*SLUG*

# Check canonical telemetry for pipeline entries
joelclaw otel search "video|transcript|summarize" --hours 24

一括取り込み

複数のイベントを送信します。Inngest は同時実行数を制御しながらキューに入れて処理します。

joelclaw send pipeline/video.requested -d '{"url":"https://youtube.com/watch?v=XXXX"}'
joelclaw send pipeline/video.requested -d '{"url":"https://youtube.com/watch?v=YYYY"}'
joelclaw send pipeline/video.requested -d '{"url":"https://youtube.com/watch?v=ZZZZ"}'

手動での文字起こし(YouTube 以外)

ディスク上にある音声ファイルや、Granola/Fathom から取得した生テキストの場合:

# From audio file
joelclaw send pipeline/transcript.requested -d '{"source":"manual","audioPath":"/path/to/audio.mp4","title":"Recording Title","slug":"recording-title"}'

# From raw text (Granola, Fathom, etc.)
joelclaw send pipeline/transcript.requested -d '{"source":"granola","text":"transcript text...","title":"Meeting Title","slug":"meeting-title"}'

要約のみを再実行する

Vault ノートは存在するものの、より良い要約が必要な場合:

joelclaw send content/summarize.requested -d '{"vaultPath":"/Users/joel/Vault/Resources/videos/SLUG.md"}'

オプション

フィールドデフォルト説明
url必須YouTube または動画の URL
maxQuality"1080"動画の最大解像度:"720"、"1080"、"4k"

保存先

項目保存先
動画とメタデータNAS:/volume1/home/joel/video/YYYY/SLUG/
Vault ノート~/Vault/Resources/videos/SLUG.md
デイリーノートのリンク## Videos の下の ~/Vault/Daily/YYYY-MM-DD.md
ランタイムテレメトリーjoelclaw otel(Typesense/ClickHouse の otel_events)
永続的なソースの記録Vault ノートと、起点となった Inngest イベント/実行

トラブルシューティング

イベントが受け付けられて(200 OK)も何も起きない場合:

  1. Docker からワーカーへの接続を確認する — 最もよくある問題です:

    docker logs $(docker ps -q --filter ancestor=inngest/inngest) 2>&1 | grep -E "ERROR|Unable" | tail -5
    

    「Unable to reach SDK URL」と表示される場合は、inngest スキルの serveHost に関する注意点を確認してください。

  2. ワーカーが実際に稼働していることを確認する:

    kubectl get deploy -n joelclaw system-bus-worker
    kubectl get pods -n joelclaw -l app=system-bus-worker
    
  3. 該当する関数のワーカーエラーを確認する:

    kubectl logs -n joelclaw deploy/system-bus-worker --tail=80
    
  4. 特定の実行 ID を GraphQL で詳しく調べるには、inngest-debug スキルを使用します。

やってはいけないこと

  • ❌ yt-dlp を直接実行しないでください — ダウンロードと NAS への転送はパイプラインが処理します
  • ❌ mlx_whisper を直接実行しないでください — 文字起こしはパイプラインが処理します
  • ❌ 手動で NAS に scp しないでください — 転送はパイプラインが処理します
  • ❌ Vault ノートを手動で作成しないでください — 適切なフロントマター付きでパイプラインが作成します
  • ❌ 動画の処理に codex/バックグラウンドタスクを使わないでください — Inngest は永続性があり、再試行も行います

コメント