| Le développement de ce projet est entièrement financé par la communauté. Envisagez de faire un don au soutien! |

YouTubeExPlode est une bibliothèque qui fournit une interface pour interroger les métadonnées des vidéos, des listes de lecture et des chaînes YouTube, ainsi que pour résoudre et télécharger des flux vidéo et des pistes de légendes fermées. Derrière une couche d'abstraction, cette bibliothèque fonctionne en grattant les données de page brutes et en exploitant des critères de terminaison internes ingérés inversés.
Intéressé par le fonctionnement interne de cette bibliothèque? Voir l'article YouTube de l'ingénierie inverse.
Packages d'extension :
En utilisant ce projet ou son code source, à quelque fin que ce soit et sous quelque forme que ce soit, vous accordez votre accord implicite à toutes les affirmations suivantes:
Pour en savoir plus sur la guerre et comment vous pouvez aider, cliquez ici. Gloire à l'Ukraine! ??
dotnet add package YoutubeExplode 
YouTubeExPlode expose sa fonctionnalité via un seul point d'entrée - la classe YoutubeClient . Créez une instance de cette classe et utilisez les opérations fournies sur Videos , Playlists , Channels et des propriétés Search pour envoyer des demandes.
Pour récupérer les métadonnées associées à une vidéo YouTube, appelez Videos.GetAsync(...) :
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
// You can specify either the video URL or its ID
var videoUrl = "https://youtube.com/watch?v=u_yIGGhubZs" ;
var video = await youtube . Videos . GetAsync ( videoUrl ) ;
var title = video . Title ; // "Collections - Blender 2.80 Fundamentals"
var author = video . Author . ChannelTitle ; // "Blender"
var duration = video . Duration ; // 00:07:20 Chaque vidéo YouTube dispose d'un certain nombre de flux disponibles, différents dans les conteneurs, la qualité vidéo, le débit, le catégorie et les autres paramètres. De plus, les flux sont divisés en 3 catégories en fonction de leur contenu:
AVERTISSEMENT : Les flux muxés contiennent à la fois l'audio et la vidéo, mais ces flux sont limités en qualité (jusqu'à 720p30). Pour télécharger la vidéo dans la qualité la plus élevée disponible, vous devrez résoudre les meilleurs flux audio et vidéo uniquement en vidéo, puis les faire mux. Le processus de muxe peut être effectué à l'aide de FFMPEG à l'aide du package YouTubeExplode.Converter .
AVERTISSEMENT : Les flux muxés sont obsolètes par YouTube et ne sont pas garantis pour être disponibles pour chaque vidéo. Si possible, évitez de trop compter sur eux et effectuez à la place des muxlles à l'aide des flux audio uniquement et vidéo uniquement.
Vous pouvez demander le manifeste qui répertorie tous les flux disponibles pour une vidéo particulière en appelant Videos.Streams.GetManifestAsync(...) :
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var videoUrl = "https://youtube.com/watch?v=u_yIGGhubZs" ;
var streamManifest = await youtube . Videos . Streams . GetManifestAsync ( videoUrl ) ;Une fois le manifeste obtenu, vous pouvez filtrer à travers les flux et identifier ceux qui vous intéressent:
using YoutubeExplode ;
using YoutubeExplode . Videos . Streams ;
// ...
// Get the highest bitrate audio-only stream
var streamInfo = streamManifest . GetAudioOnlyStreams ( ) . GetWithHighestBitrate ( ) ;
// ...or the highest quality MP4 video-only stream
var streamInfo = streamManifest
. GetVideoOnlyStreams ( )
. Where ( s => s . Container == Container . Mp4 )
. GetWithHighestVideoQuality ( ) Enfin, vous pouvez résoudre le flux réel représenté par les métadonnées spécifiées à l'aide Videos.Streams.GetAsync(...) ou de le télécharger directement dans un fichier avec Videos.Streams.DownloadAsync(...) :
// ...
// Get the actual stream
var stream = await youtube . Videos . Streams . GetAsync ( streamInfo ) ;
// Download the stream to a file
await youtube . Videos . Streams . DownloadAsync ( streamInfo , $ "video. { streamInfo . Container } " ) ;AVERTISSEMENT : Bien que la propriété
Urldes métadonnées du flux puisse être utilisée pour accéder au contenu sous-jacent, vous avez besoin d'une série de demandes HTTP soigneusement conçues pour ce faire. Il est fortement recommandé d'utiliserVideos.Streams.GetAsync(...)ouVideos.Streams.DownloadAsync(...), car ils effectueront tout le travail lourd pour vous.
Les légendes fermées peuvent être téléchargées de la même manière que les flux multimédias. Pour obtenir la liste des pistes de légendes fermées disponibles, appelez Videos.ClosedCaptions.GetManifestAsync(...) :
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var videoUrl = "https://youtube.com/watch?v=u_yIGGhubZs" ;
var trackManifest = await youtube . Videos . ClosedCaptions . GetManifestAsync ( videoUrl ) ;Récupérez ensuite les métadonnées pour une piste particulière:
// ...
// Find closed caption track in English
var trackInfo = trackManifest . GetByLanguage ( "en" ) ; Enfin, utilisez Videos.ClosedCaptions.GetAsync(...) pour obtenir le contenu réel de la piste:
// ...
var track = await youtube . Videos . ClosedCaptions . GetAsync ( trackInfo ) ;
// Get the caption displayed at 0:35
var caption = track . GetByTime ( TimeSpan . FromSeconds ( 35 ) ) ;
var text = caption . Text ; // "collection acts as the parent collection" Vous pouvez également télécharger la piste de la légende fermée au format de fichier SRT avec Videos.ClosedCaptions.DownloadAsync(...) :
// ...
await youtube . Videos . ClosedCaptions . DownloadAsync ( trackInfo , "cc_track.srt" ) ; Vous pouvez obtenir les métadonnées associées à une liste de lecture YouTube en appelant la méthode Playlists.GetAsync(...) :
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var playlistUrl = "https://youtube.com/playlist?list=PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6" ;
var playlist = await youtube . Playlists . GetAsync ( playlistUrl ) ;
var title = playlist . Title ; // "First Steps - Blender 2.80 Fundamentals"
var author = playlist . Author . ChannelTitle ; // "Blender" Pour faire inclure les vidéos dans une liste de lecture, appelez Playlists.GetVideosAsync(...) :
using YoutubeExplode ;
using YoutubeExplode . Common ;
var youtube = new YoutubeClient ( ) ;
var playlistUrl = "https://youtube.com/playlist?list=PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6" ;
// Get all playlist videos
var videos = await youtube . Playlists . GetVideosAsync ( playlistUrl ) ;
// Get only the first 20 playlist videos
var videosSubset = await youtube . Playlists . GetVideosAsync ( playlistUrl ) . CollectAsync ( 20 ) ;Vous pouvez également énumérer les vidéos itérativement sans attendre que la liste entière se charge:
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var playlistUrl = "https://youtube.com/playlist?list=PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6" ;
await foreach ( var video in youtube . Playlists . GetVideosAsync ( playlistUrl ) )
{
var title = video . Title ;
var author = video . Author ;
} Si vous avez besoin d'un contrôle précis sur le nombre de demandes que vous envoyez à YouTube, utilisez Playlists.GetVideoBatchesAsync(...) qui renvoie des vidéos enveloppées dans des lots:
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var playlistUrl = "https://youtube.com/playlist?list=PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6" ;
// Each batch corresponds to one request
await foreach ( var batch in youtube . Playlists . GetVideoBatchesAsync ( playlistUrl ) )
{
foreach ( var video in batch . Items )
{
var title = video . Title ;
var author = video . Author ;
}
}Remarque : vous pouvez créer des identifiants de playlist pour récupérer des listes de lecture spéciales générées par les auto, telles que des mélanges musicaux, des téléchargements de chaînes populaires, des vidéos aimées, et plus encore. Voir cette référence pour plus d'informations.
Vous pouvez obtenir les métadonnées associées à une chaîne YouTube en appelant les Channels.GetAsync(...) Méthode:
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/channel/UCSMOQeBJ2RAnuFungnQOxLg" ;
var channel = await youtube . Channels . GetAsync ( channelUrl ) ;
var title = channel . Title ; // "Blender" Vous pouvez également obtenir les métadonnées des canaux par URL de nom d'utilisateur ou de profil avec Channels.GetByUserAsync(...) :
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/user/BlenderFoundation" ;
var channel = await youtube . Channels . GetByUserAsync ( channelUrl ) ;
var id = channel . Id ; // "UCSMOQeBJ2RAnuFungnQOxLg" Pour obtenir les métadonnées des canaux par SLUG ou URL personnalisée Legacy, utilisez Channels.GetBySlugAsync(...) :
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/c/BlenderFoundation" ;
var channel = await youtube . Channels . GetBySlugAsync ( channelUrl ) ;
var id = channel . Id ; // "UCSMOQeBJ2RAnuFungnQOxLg" Pour obtenir les métadonnées des canaux par poignée ou URL personnalisée, utilisez Channels.GetByHandleAsync(...) :
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/@BeauMiles" ;
var channel = await youtube . Channels . GetByHandleAsync ( channelUrl ) ;
var id = channel . Id ; // "UCm325cMiw9B15xl22_gr6Dw" Pour obtenir la liste des vidéos téléchargées par une chaîne, appelez Channels.GetUploadsAsync(...) :
using YoutubeExplode ;
using YoutubeExplode . Common ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/channel/UCSMOQeBJ2RAnuFungnQOxLg" ;
var videos = await youtube . Channels . GetUploadsAsync ( channelUrl ) ; Vous pouvez exécuter une requête de recherche en appelant la méthode Search.GetResultsAsync(...) . Chaque résultat de recherche peut représenter soit une vidéo, une liste de lecture ou une chaîne, vous devez donc appliquer la correspondance des modèles pour gérer les cas correspondants:
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
await foreach ( var result in youtube . Search . GetResultsAsync ( "blender tutorials" ) )
{
// Use pattern matching to handle different results (videos, playlists, channels)
switch ( result )
{
case VideoSearchResult video :
{
var id = video . Id ;
var title = video . Title ;
var duration = video . Duration ;
break ;
}
case PlaylistSearchResult playlist :
{
var id = playlist . Id ;
var title = playlist . Title ;
break ;
}
case ChannelSearchResult channel :
{
var id = channel . Id ;
var title = channel . Title ;
break ;
}
}
} Pour limiter les résultats à un type spécifique, utilisez Search.GetVideosAsync(...) , Search.GetPlaylistsAsync(...) ou Search.GetChannelsAsync(...) :
using YoutubeExplode ;
using YoutubeExplode . Common ;
var youtube = new YoutubeClient ( ) ;
var videos = await youtube . Search . GetVideosAsync ( "blender tutorials" ) ;
var playlists = await youtube . Search . GetPlaylistsAsync ( "blender tutorials" ) ;
var channels = await youtube . Search . GetChannelsAsync ( "blender tutorials" ) ; De façon similaire aux listes de lecture, vous pouvez également énumérer les résultats en lots en appelant Search.GetResultBatchesAsync(...) :
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
// Each batch corresponds to one request
await foreach ( var batch in youtube . Search . GetResultBatchesAsync ( "blender tutorials" ) )
{
foreach ( var result in batch . Items )
{
switch ( result )
{
case VideoSearchResult videoResult :
{
// ...
}
case PlaylistSearchResult playlistResult :
{
// ...
}
case ChannelSearchResult channelResult :
{
// ...
}
}
}
} Vous pouvez accéder aux vidéos et listes de lecture privées en fournissant des cookies qui correspondent à un compte YouTube pré-authentifié. Pour ce faire, créez une instance de YoutubeClient à l'aide d'un constructeur qui accepte IReadOnlyList<Cookie> :
using YoutubeExplode ;
// Perform authentication and extract cookies
var cookies = .. . ;
// Cookie collection must be of type IReadOnlyList<System.Net.Cookie>
var youtube = new YoutubeClient ( cookies ) ;Afin d'effectuer réellement l'authentification, vous pouvez utiliser un navigateur intégré tel que WebView pour naviguer à l'utilisateur vers la page de connexion YouTube, laissez-les se connecter, puis extraire les cookies du navigateur.
Le "Explose" dans YouTubeExPlode provient du nom d'une fonction PHP qui divise les chaînes, explode(...) . Lorsque je commençais le développement de cette bibliothèque, la majeure partie du code source de référence que j'ai lu a été écrite en PHP, d'où l'inspiration du nom.