Agent Skill · /watch

Seu agente assiste o vídeo — não adivinha pelo título.

Cola uma URL ou um arquivo, faz a pergunta. O agente puxa legendas, extrai frames, transcreve o áudio e lê cada frame como imagem. Ele responde como quem assistiu.

# cola a URL + a pergunta
/watch https://youtu.be/… o que acontece em 0:30?

▸ yt-dlp   legendas encontradas (auto)
▸ ffmpeg   42 frames · scene-aware
▸ transc.  captions · 0:00 → 3:12
▸ Claude leu 42 imagens + transcript

 Em 0:30 aparece o menu de config,
   e a narração explica o passo 2…
O que é

Um input de vídeo para o seu agente

O agente lê página, roda script, navega repo. O que ele não faz de fábrica é assistir um vídeo. Esta skill dá esse sentido — Python puro-stdlib orquestrando yt-dlp + ffmpeg + uma API Whisper opcional.

👁️ Vê e ouve

Frames extraídos como JPEG + transcript com timestamps. O agente dá Read em cada frame — a imagem entra direto no contexto e alinha com o que foi dito.

🌐 Qualquer fonte

URL de YouTube, TikTok, Loom, X, Vimeo, Twitch e algumas centenas de sites via yt-dlp — ou um arquivo local .mp4 .mov .mkv .webm.

🧩 Multi-host

Uma pasta de skill self-contained instala em Claude Code, Codex, Cursor, Copilot, Gemini CLI e +50 hosts de Agent Skills. Zero config pra começar.

Como funciona

Legenda primeiro, download só do necessário

A prioridade é gastar o mínimo: no modo transcript, uma URL legendada volta sem baixar vídeo nenhum. Quando precisa de frames, baixa e extrai só o que o run pede.

URL / arquivo + pergunta yt-dlp · legendas ffmpeg · frames dedup transcript Claude Read resposta + timestamps cleanup

1 · Download

yt-dlp checa legendas antes de tudo. Se existirem (e no modo transcript), nada de vídeo é baixado.

2 · Frames

ffmpeg extrai keyframes rápidos (efficient) ou frames por corte de cena (balanced), 512px, 2 fps máx. Em efficient, só puxa os keyframes que o próprio vídeo já guarda a cada ~1s (-skip_frame nokey) — sem redecodificar e comparar quadro a quadro, por isso é bem mais rápido que a varredura de cena completa.

3 · Dedup

Cada frame vira uma miniatura e é comparado com a última mantida; diferença de pixel abaixo do limiar descarta o quadro (slide parado, tela estática) antes de contar o orçamento — só paga por frame que muda de verdade.

4 · Transcript

Legendas nativas (grátis) primeiro; se faltarem, extrai um áudio mono 16 kHz e manda pro Whisper (Groq ou OpenAI).

Pré-requisitos

Duas dependências — e uma chave opcional

As legendas cobrem a maioria dos vídeos públicos de graça. A chave Whisper só entra quando o vídeo genuinamente não tem legenda (arquivos locais, alguns TikToks/Vimeos).

⚙️ yt-dlp + ffmpeg

Instalam no primeiro run. No macOS auto via brew; Linux/Windows imprimem o comando exato. O preflight é um lookup <100 ms nas próximas vezes.

# preflight + instalador (idempotente)
python3 scripts/setup.py

🔑 Chave Whisper (opcional)

Groq (preferido — mais barato e rápido, whisper-large-v3) ou OpenAI (whisper-1). Sem chave, vídeos sem legenda voltam só com frames.

# ~/.config/watch/.env  (modo 0600)
GROQ_API_KEY=...
# ou
OPENAI_API_KEY=...
Guia de uso · passo a passo

Do install à primeira resposta

Instale na sua ferramenta, cole uma URL e pergunte. O resto — legenda, download, frames, transcript — o script resolve.

1

Instalar no Claude Code

Adiciona a marketplace local e instala o plugin. Atualiza depois com /plugin update watch@claude-video.

/plugin marketplace add inematds/claude-video
/plugin install watch@claude-video
2

…ou em Codex, Cursor, Copilot, Gemini CLI (+50)

A CLI de Agent Skills detecta os hosts e copia a skill inteira. -g instala global; tire pra escopo do projeto.

npx skills add inematds/claude-video -g  # global no seu usuário
3

Assistir

Fonte (URL ou caminho) + a pergunta. Sem pergunta, ele resume. Se não perguntar nada, vem um resumo com estrutura e momentos-chave.

/watch https://youtu.be/dQw4w9WgXcQ o que acontece no minuto 0:30?
/watch ~/Movies/screen-recording.mp4 quando a UI quebra?
/watch https://www.tiktok.com/@user/video/123 resume isso
4

Focar um trecho (mais frames, menos tokens)

Quando a pergunta é sobre um momento, passe --start/--end (aceita SS, MM:SS, HH:MM:SS). O orçamento de frames fica mais denso e o transcript é filtrado pro mesmo intervalo.

/watch $URL --start 2:15 --end 2:45   # zoom em 30 s a 2 fps
/watch video.mp4 --start 50 --end 60   # últimos 10 s
/watch $URL --start 1:12:00           # de 1h12m até o fim
5

Ajustar o detalhe (um dial)

Troca fidelidade por velocidade e custo de token. Default balanced. Fixe o padrão com WATCH_DETAIL= no ~/.config/watch/.env.

ModoFramesUso
transcript0Só transcript; pula o download quando há legenda.
efficientaté 50Keyframes rápidos (~0,5 s de extração).
balancedaté 100Frames por corte de cena. Padrão.
token-burnersem tetoCena, sem cap — cobertura máxima em vídeo longo.
/watch $URL --detail efficient          # passe rápido de 50 keyframes
/watch $URL --resolution 1024           # ler texto na tela (slides, terminal)
6

Pegar o frame que a fala aponta ("olha aqui")

Seleção por cena/keyframe pode passar batido quando alguém aponta pra tela sem cortar de cena — "olha aqui", "como vocês estão vendo", "repara nisso". O agente lê o transcript primeiro, identifica esses momentos e roda de novo com --timestamps pra forçar um frame exatamente ali. É julgamento do agente, não regex — e os frames de pista entram somados ao que o --detail já tinha escolhido, sem serem descartados pelo corte de orçamento.

/watch $URL --detail transcript         # 1. transcript com timestamps primeiro
/watch $URL --timestamps 4:32,7:10,9:55 # 2. re-roda nos momentos em que a fala aponta pra tela
Exemplos

Pra que as pessoas realmente usam

O ganho aparece quando o como importa tanto quanto o o quê — hooks de vídeo, bugs em gravação de tela, resumo de coisa longa.

🎯 Analisar conteúdo alheio

Olha os primeiros frames + a abertura do transcript e destrincha a estrutura de um viral, criativo de anúncio ou intro de podcast.

/watch $URL qual foi o hook de abertura?

🐞 Diagnosticar um bug

Recebeu uma gravação de tela de algo quebrado? Ele acha o frame onde o problema aparece e descreve — muitas vezes pega a causa.

/watch bug-repro.mov o que está dando errado?

📝 Resumir um vídeo

Puxa estrutura, momentos-chave e o que foi de fato dito e mostrado. Mais rápido que assistir em 2×.

/watch $URL resume isso

✂️ Cortar o hype de um update

Reduz um "game-changer" às poucas coisas que importam — substância sem dez minutos de intro e overselling.

/watch $URL o que é NOVO de verdade — pula o hype
Recursos · v0.2.0

O que já está no ar

Skill self-contained, pura-stdlib. Cada linha abaixo é comportamento que existe hoje — não roadmap futuro.

Legendas
Transcript grátis primeiroyt-dlp puxa legendas manuais ou automáticas da própria fonte. No modo transcript, URL legendada nem baixa vídeo.
Whisper
Fallback com auto-chunkingSem legenda, extrai áudio mono 16 kHz e transcreve no Groq (preferido) ou OpenAI. Áudio acima de 25 MB é fatiado e remontado automaticamente.
Frames
Dial de 4 modos + 2 fps máxtranscript, efficient (keyframes), balanced (cena) e token-burner (sem cap). Orçamento de frames por duração pra não estourar o contexto.
Dedup
Colapsa quadros quase-idênticosPasse de diferença de brilho contra o último frame mantido; slide parado ou tela estática não gasta o orçamento. --no-dedup desliga.
Foco
Janela com --start/--endOrçamento mais denso no trecho pedido; transcript filtrado pro mesmo intervalo; timestamps sempre em tempo absoluto do vídeo.
Pistas
Frames por pista dedítica com --timestampsO agente lê o transcript, identifica onde a fala aponta pra tela ("olha aqui", "como vocês veem") e força um frame ali — somado ao que a seleção por cena já pegou, sem ser descartado pelo corte de orçamento.
Multi-host
Uma skill, +50 hostsClaude Code (plugin/marketplace), Codex, Cursor, Copilot, Gemini CLI via npx skills, e claude.ai por bundle .skill.