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 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.
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.
URL de YouTube, TikTok, Loom, X, Vimeo, Twitch e algumas centenas de sites via yt-dlp — ou um arquivo local .mp4 .mov .mkv .webm.
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.
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.
yt-dlp checa legendas antes de tudo. Se existirem (e no modo transcript), nada de vídeo é baixado.
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.
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.
Legendas nativas (grátis) primeiro; se faltarem, extrai um áudio mono 16 kHz e manda pro Whisper (Groq ou OpenAI).
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).
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
Instale na sua ferramenta, cole uma URL e pergunte. O resto — legenda, download, frames, transcript — o script resolve.
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
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
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
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
Troca fidelidade por velocidade e custo de token. Default balanced. Fixe o padrão com WATCH_DETAIL= no ~/.config/watch/.env.
| Modo | Frames | Uso |
|---|---|---|
transcript | 0 | Só transcript; pula o download quando há legenda. |
efficient | até 50 | Keyframes rápidos (~0,5 s de extração). |
balanced | até 100 | Frames por corte de cena. Padrão. |
token-burner | sem teto | Cena, 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)
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
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.
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?
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?Puxa estrutura, momentos-chave e o que foi de fato dito e mostrado. Mais rápido que assistir em 2×.
/watch $URL resume isso
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
Skill self-contained, pura-stdlib. Cada linha abaixo é comportamento que existe hoje — não roadmap futuro.
transcript, URL legendada nem baixa vídeo.transcript, efficient (keyframes), balanced (cena) e token-burner (sem cap). Orçamento de frames por duração pra não estourar o contexto.--no-dedup desliga.--start/--endOrçamento mais denso no trecho pedido; transcript filtrado pro mesmo intervalo; timestamps sempre em tempo absoluto do vídeo.--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.npx skills, e claude.ai por bundle .skill.