Comment j’ai automatisé la récupération de vidéos Youtube avec un script Python et de l’IA
Vous le savez peut-être, je fais des vidéos sur Youtube pour compléter ce blog.
Et pour faire ces vidéos, j'ai régulièrement besoin de télécharger d'autres vidéos, toujours de Youtube afin d'illustrer ce que je raconte.
Et c'est pénible...
Parce que, Youtube ne permet pas le download donc il faut passer par des applications externes.
C'est pas trop compliqué à en trouver, mais régulièrement ces sites changent leurs conditions de fonctionnement.
Parfois ça devient payant.
Parfois, on peut récupérer la vidéo, mais sans le son.
Parfois, c'est limité en nombre de vidéos par jour.
Parfois, le site se remplit de publicités du jour au lendemain.
Parfois, ça plante.
J'avoue que j'en ai eu marre. Et si je le codais ?
Tentative solo
J'ai ouvert Youtube et j'ai regardé rapidement la console de développement.
Et là, j'ai compris que ça sentait pas bon.
Il n'y a pas un flux vidéo, genre un mp4 qui serait envoyé au navigateur et lu progressivement
Ca ressemble plutôt à de multiples calls d'api qui renverraient chacun un morceau de vidéo. Et je comprends un peu en lisant sur internet que Youtube va faire varier la qualité de la vidéo en fonction de la bande passante à disposition (sauf si je force dans les settings que je veux une version en particulier).
C'est exactement le cas de figure où un(e) dev sait qu'il ne veut pas résoudre un problème qui lui coûte quelques minutes de temps en temps par un dev qui va lui coûter quelques jours/semaines, sans même être sûr de réussir.
C'est frustrant pour un développeur parce que, ça paraît simple à faire soit-même.
Mais en fait ça l'est pas et évidemment le coder à partir de zéro serait une très mauvaise idée.
C'est vrai qu'à ce moment-là, c'est un problème pénible. Mais pas vital. Est-ce que j'ai envie de passer des heures à comprendre l'api de Youtube et trouver une façon élégante de résoudre ce problème ?
Absolument pas.
Il y a 5 ans j'aurais sans doute laissé tomber, par flemme.
Mais une chose à changé depuis. Et si je demandais à ChatGPT ?
Coder avec une IA c'est comme utiliser un moteur de recherche
Dans le cas présent, j'avais aucune idée de comment commencer ce script. Je ne sais pas comment fonctionne Youtube.
Est-ce qu'il y a une API officielle pour faire ce que je voulais faire ?
Est-ce qu'il existe des librairies externes pour ça ?
La recherche sur Google est possible. Mais en fonction de la formulation de la recherche, en fonction de qui a réussi à faire indexer son résultat dans les premiers résultats, je sais que je peux perdre un temps fou.
Combien de fois avez-vous eu la certitude d'être enfin tombé sur le bon blog post et finalement comprendre qu'il avait été écrit il y a 5 ans et qu'il se terminait sur une impasse ?
C'est là où une IA est intéressante parce qu'elle a déjà fait ce boulot d'indexer le web et donc elle a des pistes.
Alors on y va :
La première solution proposée par ChatGPT est la suivante :
import ssl
import urllib.request
from pytube import YouTube
# Désactiver la vérification SSL (pas recommandé pour la production)
ssl._create_default_https_context = ssl._create_unverified_context
def download_youtube_video(video_url):
yt = YouTube(video_url)
stream = yt.streams.get_highest_resolution()
stream.download()
print(f"La vidéo '{yt.title}' a été téléchargée avec succès.")
video_url = input("Veuillez entrer l'URL complète de la vidéo YouTube : ")
download_youtube_video(video_url)
Intéressant, je découvre donc la librairie pytube.
Je teste le code, et... ça plante.
urllib.error.HTTPError: HTTP Error 400: Bad Request
Une IA sait proposer des alternatives
Malgré plusieurs itérations avec ChatGPT, rien n'y fait.
A ce moment là, chatGPT, peut être désespéré par son élève, moi, a pris l'initiative de me dire :
Si tu continues à avoir des problèmes avec pytube, tu pourrais envisager d'utiliser une autre bibliothèque comme youtube-dl ou yt-dlp, qui sont également très populaires et stables pour télécharger des vidéos YouTube.
Ok... Ben essayons.
Et j'ai donc essayé un second script avec une autre librairie, toujours proposé par ChatGPT :
import yt_dlp
def download_youtube_video(video_url):
ydl_opts = {
'format': 'best', # Choisit le meilleur format disponible
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([video_url])
# Demander l'URL de la vidéo à l'utilisateur
video_url = input("Veuillez entrer l'URL complète de la vidéo YouTube : ")
try:
print(f"Téléchargement de '{video_url}'")
download_youtube_video(video_url)
print("Téléchargement terminé avec succès.")
except Exception as e:
print(f"Une erreur est survenue : {e}")
J'ai été vérifié sur la doc officielle de yt-dlp, c'est littéralement leur première page de documentation. J'aurais pu le faire moi-même.
Si j'avais connu yt-dlp.
Si j'avais su que c'était mieux que d'autres librairies qui existent sur internet.
Si j'avais été moins feignant peut-être aussi ?
Par contre, mince, ça marche toujours pas :
yt_dlp.utils.DownloadError: ERROR: [youtube] Yu0B903O_CA: Requested format is not available. Use \--list-formats for a list of available formats
Et là pour le coup, je sors de la première page de la doc officielle, la réponse est sans doute perdue dans le reste la doc. Mais j'ai pas envie de la lire, désormais, j'ai quelqu'un qui sait le faire pour moi.
Stp, ChatGPT, dis-moi ce que je dois faire 🙂
Ok ChatGPT a compris qu'il fallait d'abord lister les formats de vidéo disponibles. C'était littéralement marqué dans le message d'erreur précédent. Mais je vous l'ai dit. Je suis feignant.
Donc cette fois, il propose de lister les formats, de me faire sélectionner celui que je veux et de lancer le téléchargement.
La réponse :
import yt_dlp
def list_formats(video_url):
ydl_opts = {
'listformats': True, # Liste tous les formats disponibles
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.extract_info(video_url, download=False)
def download_youtube_video(video_url, format_code):
ydl_opts = {
'format': format_code, # Utilise le format spécifié
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([video_url])
# Demander l'URL de la vidéo à l'utilisateur
video_url = input("Veuillez entrer l'URL complète de la vidéo YouTube : ")
# Lister les formats disponibles
list_formats(video_url)
# Demander le code du format souhaité
format_code = input("Veuillez entrer le code du format à télécharger (ex: 137+140) : ")
try:
print(f"Téléchargement de la vidéo dans le format {format_code}...")
download_youtube_video(video_url, format_code)
print("Téléchargement terminé avec succès.")
except ValueError as e:
print(e)
Et cette fois... ça marche :)
J'ai peut-être passé 20 minutes au total, dev inclus et j'ai résolu un petit truc insignifiant qui me faisait perdre régulièrement du temps.
Sans être expert Python.
Sans être expert du fonctionnement de Youtube.
Est-ce que le code produit n'est pas terrible ?
Peut-être.
Si je voulais industrialiser cette solution et proposer une énième alternative aux sites de download youtube qu'on trouve sur internet, bien sûr que je vérifierais avec la doc officielle. Je relirai attentivement chaque ligne. Peut-être que je rajouterai des tests. Je vérifierais quand même qu'il n'y avait pas une meilleure approche avec une autre lib.
Mais pour ce cas précis, je ne ferais rien de tout ça.
Est-ce que c'est le moment pour moi de créer ma version à moi des sites qui proposent de télécharger depuis Youtube.
Est-ce que ce n'est pas l'opportunité de devenir riche avec un nouveau SAAS codé en 20 minutes ?
Eh bien, c'est la limite de l'exercice. Dans la création d'un SAAS, coder c'est peut-être, 10% du temps ? Les 20 minutes que j'ai passées m'ont donné juste une base technologique, mais il manque tout le paquet cadeau pour en faire un produit qui tient la route.
Mais c'est pas le sujet, revenons à l'IA.
Alors pour quelqu'un de peu expérimenté il y a des risques parce que le code produit est parfois pas fou, parfois même faux. Parce qu'une personne peu expérimentée n'aura pas forcément le recul pour savoir que la solution proposée est trop complexe, pas la meilleure possible.
A l'inverse, je sais que des développeurs expérimentés m'ont dit qu'ils n'en voyaient pas l'intérêt, que ça les ralentissait, que de toute façon ce n'était rien de plus que des modèles statistiques et que, statistiquement, il y a plein de bugs qui trainent dans les bases de code publiques alors forcément, ça se ressent dans le code fourni.
Et en plus parfois les IA hallucinent des réponses avec l'assurance d'un jeune diplômé d'école de commerce qui fait son premier call en ESN.
Moi, je pense surtout que c'est un outil et qu'un outil, il faut apprendre à l'utiliser.
J'ai commencé à développer à une époque où les IDE n'étaient pas encore très utilisés. Avec les IDE sont arrivés les débogueurs dans les IDE.
J'ai commencé à développer en C et il fallait que je gère les allocations mémoire. J'ai arrêté de le faire en apprenant Java.
Pour tout ça, IDE, débogueur, allocation mémoire automatique, à chaque fois, j'ai entendu les mêmes remarques. Ca ne rend pas plus rapide, c'est source d'erreur, ça crée des bugs et ça fausse le raisonnement.
Et finalement ces outils ont intégré nos quotidiens.
Ce que je sais, c'est que je suis plus productif qu'avant, plus rapide qu'avant.
Au contraire, la question qui pourrait venir naturellement, c'est : Est-ce que l'IA va me remplacer ? Pas encore. Mais l'IA a changé ma façon de travailler.
Ça remplace avantageusement une recherche Google simple. Ça donne des pistes. Ça ne veut pas dire que derrière, je ne dois pas creuser, mais au moins, je sais dans quelle direction creuser.
Je suis capable d'être fluide dans la pratique d'un langage que je maîtrise peu, ce qui me permet d'apprendre au passage.
Ça ne veut pas dire que l'IA fait du code parfait, pas encore. Mais elle débloque des impasses.
L'IA me permet aussi de plus me soucier des portions de code répétitives (boilerplate, validation de formulaire etc...)
Encore une fois, ça a changé ma façon de bosser.
Et désormais, je peux mettre plus facilement des B-Roll sur mes vidéos.
Et ça franchement, ça n'a pas de prix :)