| Die Entwicklung dieses Projekts wird vollständig von der Community finanziert. Überlegen Sie, um zu spenden, um sie zu unterstützen! |

YouTubeExplode ist eine Bibliothek, die eine Schnittstelle zum Abfragen von Metadaten von YouTube -Videos, Wiedergabelisten und Kanälen sowie zum Auflösen und Herunterladen von Video -Streams und Untertiteltracks bietet. Nach einer Abstraktionsebene funktioniert diese Bibliothek, indem sie Rohseitendaten abkratzen und die internen Endpunkte mit reverendem Engagement ausnutzen.
Interessiert an den inneren Funktionen dieser Bibliothek? Siehe den youTube-Artikel umgekehrter Engineering.
Erweiterungspakete :
Durch die Verwendung dieses Projekts oder seines Quellcode, zu jedem Zweck und in irgendeiner Form oder Form, gewähren Sie Ihre implizite Vereinbarung allen folgenden Aussagen:
Klicken Sie hier, um mehr über den Krieg und wie Sie helfen können. Ruhm der Ukraine! ?
dotnet add package YoutubeExplode 
YouTubeExplode enthält seine Funktionalität durch einen einzelnen Einstiegspunkt - die YoutubeClient -Klasse. Erstellen Sie eine Instanz dieser Klasse und verwenden Sie die bereitgestellten Vorgänge für Videos , Playlists , Channels und Search , um Anfragen zu senden.
Um die Metadaten abzurufen, die mit einem YouTube -Video zugeordnet sind, rufen Sie Videos.GetAsync(...) an:
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 Jedes YouTube -Video verfügt über eine Reihe von Streams, die sich in Containern, Videoqualität, Bitrate, Framerate und anderen Parametern unterscheiden. Darüber hinaus werden die Streams basierend auf ihrem Inhalt weiter in 3 Kategorien unterteilt:
WARNUNG : Muxed -Streams enthalten sowohl Audio als auch Video, diese Streams sind jedoch begrenzt (bis zu 720p30). Um das Video in der höchsten verfügbaren Qualität herunterzuladen, müssen Sie die besten Audio- und Video-Streams separat lösen und dann zusammen ausführen. Der Muxing -Prozess kann mithilfe des youtubeexplode.converter -Pakets mithilfe von FFMPEG durchgeführt werden.
WARNUNG : Muxed -Streams sind von YouTube veraltet und sind für jedes Video nicht garantiert. Wenn möglich, vermeiden Sie es zu viel auf sie und führen Sie stattdessen manuell mit den bereitgestellten Audio- und Video-Streams aus.
Sie können das Manifest anfordern, das alle verfügbaren Streams für ein bestimmtes Video auflistet, indem Sie Videos.Streams.GetManifestAsync(...) aufrufen:
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var videoUrl = "https://youtube.com/watch?v=u_yIGGhubZs" ;
var streamManifest = await youtube . Videos . Streams . GetManifestAsync ( videoUrl ) ;Sobald das Manifest erhalten ist, können Sie durch die Streams filtern und diejenigen identifizieren, an denen Sie interessiert sind:
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 ( ) Schließlich können Sie den tatsächlichen Stream, der von den angegebenen Metadaten mithilfe von Videos.Streams.GetAsync(...) dargestellt wird, auflösen oder direkt in eine Datei mit Videos.Streams.DownloadAsync(...) herunterladen:
// ...
// 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 } " ) ;WARNUNG : Während die
Url-Eigenschaft in den Stream -Metadaten zum Zugriff auf den zugrunde liegenden Inhalt verwendet werden kann, benötigen Sie eine Reihe sorgfältig gefertigter HTTP -Anfragen, um dies zu tun. Es wird dringend empfohlenVideos.Streams.GetAsync(...)oderVideos.Streams.DownloadAsync(...)zu verwenden, da sie das ganze schwere Heben für Sie ausführen.
Abschlussunterschriften können auf ähnliche Weise wie Medienströme heruntergeladen werden. Um die Liste der verfügbaren Untertitel -Tracks zu erhalten, rufen Sie Videos.ClosedCaptions.GetManifestAsync(...) auf.
using YoutubeExplode ;
var youtube = new YoutubeClient ( ) ;
var videoUrl = "https://youtube.com/watch?v=u_yIGGhubZs" ;
var trackManifest = await youtube . Videos . ClosedCaptions . GetManifestAsync ( videoUrl ) ;Rufen Sie dann die Metadaten für eine bestimmte Spur ab:
// ...
// Find closed caption track in English
var trackInfo = trackManifest . GetByLanguage ( "en" ) ; Verwenden Sie schließlich Videos.ClosedCaptions.GetAsync(...) .
// ...
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" Sie können den Abschluss -Titel -Track auch im SRT -Dateiformat mit Videos.ClosedCaptions.DownloadAsync(...) herunterladen.
// ...
await youtube . Videos . ClosedCaptions . DownloadAsync ( trackInfo , "cc_track.srt" ) ; Sie können die Metadaten mit einer YouTube -Playlist zugeordnet lassen, indem Sie die Playlists.GetAsync(...) aufrufen.
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" Um die Videos in einer Wiedergabeliste aufzunehmen, rufen Sie Playlists.GetVideosAsync(...) an:
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 ) ;Sie können die Videos auch iterativ aufzählen, ohne auf das Laden der gesamten Liste zu warten:
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 ;
} Wenn Sie eine genaue Kontrolle darüber benötigen, wie viele Anfragen Sie an YouTube senden, verwenden Sie Playlists.GetVideoBatchesAsync(...) , die in Stapeln eingewickelte Videos zurückgeben:
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 ;
}
}Hinweis : Sie können Playlist-IDs erstellen, um spezielle automatisch generierte Wiedergabelisten wie Musikmixe, beliebte Sender-Uploads, Lop-Videos und mehr zu erfassen. Weitere Informationen finden Sie in dieser Referenz.
Sie können die Metadaten, die einem YouTube -Kanal zugeordnet sind, durch Aufrufen der Channels.GetAsync(...) -Methode:
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" Sie können auch die Kanalmetadaten per Benutzername oder Profil -URL mit 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" Um die Kanalmetadaten per Slug oder Legacy Custom URL zu erhalten, verwenden Sie 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" Verwenden Sie Channels.GetByHandleAsync(...) Kanalmetadaten per Hand oder benutzerdefinierte URL.
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" Um die Liste der von einem Kanal hochgeladenen Videos hochzuladen, rufen Sie Channels.GetUploadsAsync(...) auf.
using YoutubeExplode ;
using YoutubeExplode . Common ;
var youtube = new YoutubeClient ( ) ;
var channelUrl = "https://youtube.com/channel/UCSMOQeBJ2RAnuFungnQOxLg" ;
var videos = await youtube . Channels . GetUploadsAsync ( channelUrl ) ; Sie können eine Suchabfrage ausführen, indem Sie die Methode von Search.GetResultsAsync(...) aufrufen. Jedes Suchergebnis kann entweder ein Video, eine Wiedergabeliste oder einen Kanal darstellen. Daher müssen Sie Musteranpassungen anwenden, um die entsprechenden Fälle zu verarbeiten:
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 ;
}
}
} Um die Ergebnisse auf einen bestimmten Typ zu beschränken, verwenden Sie Search.GetVideosAsync(...) , Search.GetPlaylistsAsync(...) oder 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" ) ; Ähnlich wie bei Wiedergabelisten können Sie auch Ergebnisse in Stapeln aufzählen, indem Sie Search.GetResultBatchesAsync(...) aufrufen:
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 :
{
// ...
}
}
}
} Sie können auf private Videos und Wiedergabelisten zugreifen, indem Sie Cookies bereitstellen, die einem vorautorisierten YouTube-Konto entsprechen. Erstellen Sie dazu eine Instanz von YoutubeClient mit einem Konstruktor, der IReadOnlyList<Cookie> akzeptiert:
using YoutubeExplode ;
// Perform authentication and extract cookies
var cookies = .. . ;
// Cookie collection must be of type IReadOnlyList<System.Net.Cookie>
var youtube = new YoutubeClient ( cookies ) ;Um die Authentifizierung tatsächlich durchzuführen, können Sie einen eingebetteten Browser wie WebView verwenden, um den Benutzer zur YouTube -Anmeldeseite zu navigieren, sich anzumelden und dann die Cookies aus dem Browser zu extrahieren.
Der "Explode" in YouTubeExPlods erfolgt aus dem Namen einer PHP -Funktion, die Strings aufteilt, explode(...) . Als ich mit der Entwicklung dieser Bibliothek begann, wurde der größte Teil des von mir gelesenen Referenzquellencode in PHP geschrieben, daher die Inspiration für den Namen.