watch — Claude ve un vídeo de principio a fin
Divide un vídeo en lo que Claude lee de forma nativa: imágenes de fotogramas (vistas con la herramienta Read) + una transcripción (texto). El resultado es entender no solo las palabras, sino lo que sucede en pantalla.
Bilingüe. Esta es la versión en español. El espejo en ruso es
SKILL.ru.md. Trabaja en el idioma que use el usuario; el flujo de trabajo y los comandos son idénticos.
Dependencias (instaladas una vez mediante install.sh)
Compruébalo con: command -v yt-dlp ffmpeg whisper node.
yt-dlp→~/.local/bin/yt-dlp(bajo Python 3.12 en~/.local/python312— el Python del sistema suele ser demasiado antiguo; las versiones recientes de yt-dlp necesitan 3.10+);ffmpeg→ desdeimageio-ffmpeg, enlazado simbólicamente a~/.local/bin/ffmpeg;whisper→openai-whisper(bajo el Python del sistema; el modelo se descarga en el primer uso);node→~/.local/node(v24) — necesario para sortear las defensas de YouTube.
Para YouTube específicamente, install.sh también configura:
- un proveedor de PO-token (
bgutil), compilado en modo script bajo~/.local/bgutil-pot/server/build/; - un runtime Node.js + un componente EJS, para resolver el n-challenge de YouTube;
- cookies de una cuenta de YouTube con sesión iniciada, en
~/.config/watch/cookies.txt.
Si las cookies caducan (YouTube vuelve a pedir "confirma que no eres un robot"), pide al
usuario que vuelva a exportar cookies.txt con una extensión del navegador como "Get cookies.txt
LOCALLY" y la coloque en ~/.config/watch/cookies.txt.
Descarga siempre a través del envoltorio bash ~/.claude/skills/watch/yt.sh … — que añade
las banderas correctas de YouTube automáticamente. Para URLs de mp4 directo/Loom/Zoom las banderas
adicionales son inofensivas.
Flujo de trabajo
1. Preparación
- Crea una carpeta de trabajo:
mkdir -p /tmp/watch/<slug>(slug = nombre corto a partir de la URL/tema). - Analiza la URL (YouTube / Loom / enlace de compartición de Zoom / archivo de vídeo directo). Un archivo local omite los pasos de descarga — trabaja con él directamente.
2. Transcripción — subtítulos primero (gratis, cuando están disponibles)
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>"
Si aparece un .srt, esa es una transcripción lista con marcas de tiempo — úsala.
3. Descargar el vídeo (necesario tanto para fotogramas como para el respaldo de 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>"
Obtendrás un .mp4 o .webm — usa el nombre de archivo real de ahora en adelante (video.*).
Si no hubo subtítulos, transcribe el audio con Whisper (modelo small; base es más
rápido para una prueba breve):
whisper "/tmp/watch/<slug>/video.webm" --model small --language en \
--output_format srt --output_dir "/tmp/watch/<slug>/"
La primera ejecución descarga el modelo (~460 MB para small) — es normal, una sola vez.
Omite --language en para audio no inglés, o establece el código de idioma correcto. Whisper es
lento: un clip de 34 minutos tarda varios minutos — ejecútalo en segundo plano.
4. Fotogramas POR CAMBIO DE ESCENA (el paso clave — no por temporizador)
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"
- Umbral
0.3— ajústalo entre0.2–0.4para la densidad de escenas (un umbral más bajo = más fotogramas). - Obtén la marca de tiempo de cada fotograma desde el registro showinfo (
pts_time) enscenes.log. - Si hay demasiados fotogramas (un vídeo largo), conserva entre 60 y 150 de los más informativos, eliminando los que estén muy juntos en el tiempo. Decodificar un vídeo largo lleva tiempo — ejecútalo en segundo plano.
RESPALDO — si hay muy pocas escenas (0–2 fotogramas). El metraje suave y sin cortes (una sola toma continua, un dron, una cabeza parlante) produce pocos cambios de escena. En ese caso, muestrea a un intervalo fijo:
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"
Ajusta el intervalo (1/5 = un fotograma cada 5 s) a la duración del vídeo para mantenerte en
~150 fotogramas. La marca de tiempo del i-ésimo fotograma = i × intervalo.
4a. YouTube: por qué todo pasa por yt.sh
YouTube (2025+) requiere estos tres elementos a la vez, o recibirás HTTP 403 / "no eres un
robot" / "solo imágenes":
- cookies de una cuenta con sesión iniciada (
~/.config/watch/cookies.txt); - un PO-token (prueba de origen) — generado localmente por
bgutil(modo script, Node); - resolver el n-challenge — un runtime Node + un componente EJS
(
--remote-components ejs:github). Todo esto ya está integrado enyt.sh— solo llámalo. Las fuentes mp4/Loom/Zoom directas no tienen estas defensas. Si vuelve a pedir "confirma que no eres un robot", las cookies caducaron — pide uncookies.txtnuevo.
5. Análisis
- Lee la transcripción (
.srt). - Mira los fotogramas extraídos (visión, mediante la herramienta Read): diapositivas, código, demos, gráficos.
- Vincula lo visual con la transcripción usando las marcas de tiempo.
6. Informe
Entrega:
- un TL;DR (3–5 líneas);
- conceptos clave con marcas de tiempo;
- lo que se muestra EN PANTALLA que no está en el texto (gráficos, interfaces, demos);
- momentos destacados / citas con marcas de tiempo.
7. Guardar en una base de conocimiento (pregunta primero)
Pregunta: "¿Guardar este análisis en tu base de conocimiento (Obsidian)?" Si es afirmativo, escribe una nota en markdown en la carpeta correspondiente con enlaces a notas relacionadas. No guardes sin confirmación.
Reglas
- Los archivos de trabajo van a una carpeta temporal
/tmp/watch/<slug>— no ensucies el proyecto. - No publiques ni envíes nada externamente sin una solicitud explícita.
- No eludas un vídeo privado que requiera inicio de sesión — informa al usuario en su lugar.