watch — Claude regarde une vidéo de bout en bout
Divise une vidéo en ce que Claude lit nativement : images (frames) (vues avec l'outil Read) + transcription (texte). Le résultat est une compréhension non seulement des mots, mais aussi de ce qui se passe à l'écran.
Bilingue. Ceci est la version anglaise. Un miroir russe complet est
SKILL.ru.md. Travaillez dans la langue que l'utilisateur utilise ; le flux de travail et les commandes sont identiques.
Dépendances (installées une fois via install.sh)
Vérifiez avec : command -v yt-dlp ffmpeg whisper node.
yt-dlp→~/.local/bin/yt-dlp(sous Python 3.12 dans~/.local/python312— le Python système est généralement trop vieux ; les versions récentes de yt-dlp nécessitent 3.10+) ;ffmpeg→ depuisimageio-ffmpeg, lié symboliquement vers~/.local/bin/ffmpeg;whisper→openai-whisper(sous le Python système ; le modèle se télécharge à la première utilisation) ;node→~/.local/node(v24) — nécessaire pour contourner les défenses de YouTube.
Pour YouTube spécifiquement, install.sh configure également :
- un fournisseur de PO-token (
bgutil), construit en mode script sous~/.local/bgutil-pot/server/build/; - un runtime Node.js + un composant EJS, pour résoudre le n-challenge de YouTube ;
- des cookies provenant d'un compte YouTube connecté, à
~/.config/watch/cookies.txt.
Si les cookies deviennent obsolètes (YouTube demande à nouveau de « confirmer que vous n'êtes pas un robot »),
demandez à l'utilisateur de ré-exporter cookies.txt avec une extension de navigateur comme "Get cookies.txt
LOCALLY" et de le placer dans ~/.config/watch/cookies.txt.
Téléchargez toujours via le wrapper bash ~/.claude/skills/watch/yt.sh … — il ajoute
automatiquement les bons indicateurs YouTube. Pour les URLs mp4/Loom/Zoom directes, les indicateurs
supplémentaires sont inoffensifs.
Flux de travail
1. Configuration
- Créez un dossier de travail :
mkdir -p /tmp/watch/<slug>(slug = un nom court provenant de l'URL/du sujet). - Analysez l'URL (YouTube / Loom / un lien de partage Zoom / un fichier vidéo direct). Un fichier local ignore les étapes de téléchargement — travaillez directement avec.
2. Transcription — sous-titres d'abord (gratuits, quand 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 un fichier .srt apparaît, c'est une transcription prête avec horodatages — utilisez-la.
3. Téléchargement de la vidéo (nécessaire à la fois pour les images et comme secours 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>"
Vous obtiendrez un fichier .mp4 ou .webm — utilisez le vrai nom de fichier à partir de maintenant (video.*).
S'il n'y avait pas de sous-titres, transcrivez l'audio avec Whisper (modèle small ; base est
plus rapide pour un test rapide) :
whisper "/tmp/watch/<slug>/video.webm" --model small --language en \
--output_format srt --output_dir "/tmp/watch/<slug>/"
La première exécution télécharge le modèle (~460 Mo pour small) — c'est normal, une seule fois.
Supprimez --language en pour un audio non anglais, ou définissez le code de langue approprié. Whisper est
lent : un clip de 34 minutes prend plusieurs minutes — exécutez-le en arrière-plan.
4. Images PAR CHANGEMENT DE SCÈNE (l'étape clé — pas sur une minuterie)
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"
- Seuil
0.3— ajustez0.2–0.4pour la densité des scènes (un seuil plus bas = plus d'images). - Obtenez l'horodatage de chaque image à partir du journal showinfo (
pts_time) dansscenes.log. - S'il y a trop d'images (une vidéo longue), conservez environ 60–150 des plus informatives, en éliminant les images trop rapprochées dans le temps. Décoder une vidéo longue prend du temps — exécutez-le en arrière-plan.
SECOURS — s'il y a trop peu de scènes (0–2 images). Un métrage lisse et non coupé (un seul plan continu, un drone, une tête parlante) produit peu de changements de scène. Dans ce cas, échantillonnez à intervalle fixe à la place :
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"
Ajustez l'intervalle (1/5 = une image toutes les 5 s) à la longueur de la vidéo pour rester
à environ ~150 images. L'horodatage de la i-ème image = i × intervalle.
4a. YouTube : pourquoi tout passe par yt.sh
YouTube (2025+) nécessite ces trois éléments à la fois, sinon vous obtenez HTTP 403 / « pas un
robot » / « seulement des images » :
- cookies d'un compte connecté (
~/.config/watch/cookies.txt) ; - un PO-token (proof-of-origin) — généré localement par
bgutil(mode script, Node) ; - résoudre le n-challenge — un runtime Node + un composant EJS
(
--remote-components ejs:github). Tout ceci est déjà intégré dansyt.sh— appelez-le simplement. Les sources mp4/Loom/Zoom directes n'ont pas ces défenses. Si cela demande à nouveau de « confirmer que vous n'êtes pas un robot », les cookies ont expiré — demandez un nouveaucookies.txt.
5. Analyse
- Lisez la transcription (
.srt). - Regardez les images extraites (vision, via l'outil Read) : diapositives, code, démos, graphiques.
- Liez les visuels à la transcription à l'aide des horodatages.
6. Rapport
Fournissez :
- un TL;DR (3–5 lignes) ;
- les concepts clés avec horodatages ;
- ce qui est affiché À L'ÉCRAN qui n'est pas dans le texte (graphiques, interfaces, démos) ;
- moments / citations notables avec horodatages.
7. Sauvegarde dans une base de connaissances (demandez d'abord)
Demandez : « Enregistrer cette analyse dans votre base de connaissances (Obsidian) ? » Si oui, écrivez une note markdown dans le dossier approprié avec des liens vers des notes connexes. Ne sauvegardez pas sans confirmation.
Règles
- Les fichiers de travail vont dans un dossier temporaire
/tmp/watch/<slug>— ne encombrez pas le projet. - Ne publiez ni n'envoyez quoi que ce soit à l'extérieur sans une demande explicite.
- Ne contournez pas une vidéo privée derrière une connexion — informez-en l'utilisateur.