Communitygithub.com

simply-Rahul8/youtube-summary

Transformez une vidéo YouTube (publique, non listée ou privée/réservée aux membres que votre propre compte connecté peut déjà regarder) ou un fichier audio/vidéo local en un document de synthèse détaillé, section par section, livré au format PDF. Permet également d'extraire la piste audio en mp3/m4a/wav. Utilise les sous-titres existants ou, à défaut, télécharge l'audio et le transcrit localement avec Whisper, fonctionnant ainsi sur les lives, cours, webinaires et enregistrements de plusieurs heures sans sous-titres.

Qu'est-ce que youtube-summary ?

Ce skill transforme une vidéo YouTube (publique, non listée, privée/membres) ou un fichier local en un résumé structuré en PDF, avec extraction audio possible. Il exploite d'abord les sous-titres (manuels ou automatiques) et, en leur absence, utilise Whisper pour transcrire localement l'audio téléchargé, ce qui le rend adapté aux vidéos sans sous-titres comme les lives, conférences et enregistrements. Son pipeline se compose de trois étapes : 1) obtention de la transcription via un script Python dédié, 2) rédaction d'un résumé markdown structuré, 3) génération du PDF final. Le skill prend en charge les cookies pour l'accès aux vidéos privées, gère les longs fichiers de manière asynchrone, et produit des documents détaillés avec frise chronologique, tableaux des faits clés et une section de notes sur les erreurs de transcription ou corrections. Il est conçu pour fonctionner avec Claude Code et tout agent utilisant ce pipeline, et nécessite Python 3, ffmpeg (via imageio-ffmpeg) et éventuellement Node 22+ pour yt-dlp.

Compatible avec✓Claude Code✓Codex CLI~Cursor
npx skills add simply-Rahul8/youtube-summary

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Résumé YouTube

Pipeline : obtenir la transcription → tout lire → rédiger un résumé structuré en Markdown → générer le PDF. scripts/fetch_transcript.py gère la première étape et scripts/md_to_pdf.py la dernière. Vous rédigez le résumé entre les deux.

1. Accès : uniquement ce que l'utilisateur peut déjà regarder

  • Les vidéos publiques et non listées ne nécessitent aucune connexion. Essayez toujours d'abord celles-ci sans cookies.
  • Une vidéo privée ou réservée aux membres fait que le script se termine avec NEEDS_SIGNIN. Vous ne pouvez continuer qu'en lisant les cookies d'un navigateur où le propre compte de l'utilisateur qui a obtenu l'accès est connecté.
    • Demandez quel navigateur (et profil, s'ils en utilisent plusieurs) avant de passer --browser. Les cookies sont leurs identifiants.
    • Dites-leur que la documentation de yt-dlp prévient que l'utilisation automatisée d'un compte connecté peut entraîner un limitation de débit ou un bannissement. Pour leurs propres téléversements, le téléchargement depuis YouTube Studio ou Google Takeout est l'alternative sans risque, et le script accepte le fichier local obtenu.
  • N'essayez jamais de contourner les paramètres de confidentialité, les restrictions géographiques, les DRM ou les paywalls, et n'utilisez jamais le compte d'une autre personne. Si le compte de l'utilisateur ne peut pas voir la vidéo, dites-le et arrêtez-vous.
  • « Cette vidéo est privée » même avec --browser signifie généralement que le compte ayant accès n'est pas le compte connecté par défaut du navigateur. Suggérez --browser chrome:"Profile 2", ou de se connecter avec ce compte dans un nouveau profil.

2. Obtenir la transcription (détachée : les longues vidéos prennent du temps)

Utilisez un dossier de travail durable, jamais un espace de travail temporaire de session qui pourrait être effacé en cours de travail : ~/youtube-resumes/<id-video-ou-nom-fichier>/. Lancez la tâche en mode détaché pour qu'elle survive à la fin de la session :

OUT=~/youtube-resumes/<id>; mkdir -p "$OUT"
nohup python3 -I ~/.claude/skills/youtube-summary/scripts/fetch_transcript.py "<url-ou-fichier>" \
  --out "$OUT" [--browser chrome] [--lang en|auto] [--force-audio] [--audio mp3|m4a|wav] \
  > "$OUT/run.log" 2>&1 &!

Attendez ensuite avec une boucle until en arrière-plan plutôt qu'en interrogeant, par ex. until grep -qE '^(DONE|FAILED|NEEDS_SIGNIN)' "$OUT/status"; do sleep 15; done; cat "$OUT/status".

Ce que fait le script :

  • analyse les métadonnées, puis utilise les sous-titres manuels, en se repliant sur les sous-titres automatiques ;
  • sans sous-titres, télécharge l'audio et le transcrit avec mlx-whisper large-v3-turbo sur Apple Silicon (openai-whisper ailleurs). Il obtient ffmpeg depuis imageio-ffmpeg si aucun n'est installé ;
  • supprime les hallucinations de silence de Whisper (« Merci. ») et les répétitions en boucle dans les sous-titres automatiques ;
  • écrit transcript.txt sous forme de paragraphes de 2 minutes [h:mm], ainsi que meta.json.

Temps : environ 4 à 5 minutes de transcription par heure d'audio sur un Mac M-series avec 8 Go de RAM, en plus du temps de téléchargement. Informez l'utilisateur du temps d'attente prévu, et s'il demande une progression, signalez le % de téléchargement ou le dernier horodatage dans run.log.

Utilisez --force-audio lorsque les sous-titres automatiques sont de mauvaise qualité (musique, accents prononcés, mauvaise langue). Utilisez --lang auto pour les vidéos non anglaises.

Extraction audio : passez --audio mp3 (ou m4a/wav) chaque fois que l'utilisateur souhaite l'audio lui-même : « donne-moi le mp3 », « extrais l'audio », une version podcast, ou une écoute hors ligne. Le fichier est enregistré sous <titre>.<format> dans $OUT, et son chemin est enregistré comme audio_file dans meta.json. Les sous-titres sont toujours utilisés pour la transcription lorsqu'ils sont disponibles, donc demander l'audio ne force pas une transcription lente. Si l'utilisateur ne veut que l'audio et aucun résumé, arrêtez-vous après cette étape et signalez le fichier.

3. Tout lire, puis résumer

Lisez l'intégralité du fichier transcript.txt ; l'utilisateur veut généralement tous les détails. Au-delà d'environ 60 000 mots, lisez-le par morceaux ordonnés et prenez des notes par morceau avant de rédiger.

Écrivez $OUT/resume.md avec vos propres mots : un résumé, pas une transcription. Les courtes citations sont acceptables ; les longs passages textuels ne le sont pas. Structure par défaut (adaptez les sections à la vidéo) :

# <Titre de la vidéo>

| | |
|---|---|
| Vidéo | <titre> |
| Chaîne | <chaîne> |
| Lien | <url> |
| Durée | <durée> |
| Intervenant(s) | <uniquement les noms effectivement mentionnés dans la vidéo> |
| Transcription | <sous-titres manuels / sous-titres automatiques / transcription Whisper locale> |

## 1. En un coup d'œil
- 5 à 8 puces : ce que couvre la vidéo et les principales conclusions

## Chronologie
| Temps | Sujet |
|---|---|
| 0:00 | ... |

## 2. <Section par chapitre/sujet, dans l'ordre de la vidéo>
### <Sous-sujet>
- chaque fait concret, chiffre, nom, définition, exemple, étape, avertissement et recommandation
- démos et procédures sous forme d'étapes numérotées ; comparaisons sous forme de tableaux

## Faits clés / points à retenir
| Élément | Valeur |

## Notes sur ce résumé
> Comment la transcription a été produite ; termes mal interprétés que vous avez corrigés ; affirmations que l'intervenant a mal formulées (avec la correction) ; tout ce qui est inaudible ou incertain.

Pourquoi cette forme : la chronologie permet au lecteur de sauter dans la vidéo ; les tableaux rassemblent les faits que les gens recherchent ensuite ; la section des notes vous permet d'être honnête sur les erreurs de transcription. La reconnaissance vocale déforme les noms de produits et le jargon, corrigez-les donc à partir du contexte et listez les corrections. Vérifiez les faits que l'intervenant énonce de manière erronée plutôt que de les répéter.

Gardez le corps sourcé : tout ce qui se trouve au-dessus de la section Notes doit provenir de la transcription ou de meta.json. Les lecteurs traitent le document comme un enregistrement de ce que dit la vidéo, donc les choses que vous savez sur la vidéo (qui est vraiment l'intervenant, où elle a été filmée, son histoire) n'ont pas leur place dans le corps, même si vous en êtes sûr. Si ce contexte aide vraiment, mettez-le dans les Notes et étiquetez-le « hors vidéo ». N'attribuez jamais de noms ou de pronoms que la vidéo ne donne pas. Si la description de la vidéo n'est pas liée au contenu (les descriptions réutilisées ou de spam sont courantes), ignorez-la et mentionnez-le dans les Notes.

Adaptez la taille du document à la vidéo. Utilisez <!-- pagebreak --> uniquement pour commencer une nouvelle partie majeure d'un long document (par ex. chaque chapitre d'un stream de plusieurs heures), jamais après le tableau de couverture. Un clip de 2 minutes devrait tenir sur une ou deux pages.

4. Générer et vérifier le PDF

uv run ~/.claude/skills/youtube-summary/scripts/md_to_pdf.py "$OUT/resume.md" "$OUT/<Titre>.pdf"

Générez la page 1 et une page dense en PNG, et examinez-les avant de faire votre rapport : uvx --with pypdfium2 --with pillow python -c "...". Donnez ensuite à l'utilisateur :

  • le chemin absolu du PDF et le nombre de pages ;
  • un aperçu de 3 à 5 lignes ;
  • toute mise en garde : transcription générée automatiquement, sections inaudibles.

Le fichier audio peut être volumineux. Mentionnez-le et laissez l'utilisateur décider de le supprimer.

Dépannage

  • Sign in to confirm you're not a bot / HTTP 403 sur une vidéo publique : attendez et réessayez. Si cela persiste, il s'agit d'un problème d'IP ou de limitation de débit. Ne bouclez pas.
  • Avertissements sur l'environnement d'exécution JS de yt-dlp : le script passe --js-runtimes node lorsque Deno est absent. Node 22+ est nécessaire.
  • Aucun mot dans la transcription, ou une transcription remplie de déchets : vérifiez la langue (--lang auto), ou relancez avec --force-audio.

Skills associés