| O desenvolvimento deste projeto é totalmente financiado pela comunidade. Considere doar para apoiar! |

YouTubeexplode é uma biblioteca que fornece uma interface para consultar metadados de vídeos, listas de reprodução e canais do YouTube, bem como para resolver e baixar fluxos de vídeo e faixas de legenda fechadas. Por trás de uma camada de abstração, essa biblioteca funciona raspando dados de página bruta e explorando pontos internos de engenharia reversa.
Interessado no funcionamento interno desta biblioteca? Veja o artigo do YouTube de engenharia reversa.
Pacotes de extensão :
Ao usar este projeto ou seu código -fonte, para qualquer finalidade e de qualquer forma ou forma, você concede seu acordo implícito a todas as seguintes declarações:
Para saber mais sobre a guerra e como você pode ajudar, clique aqui. Glória para a Ucrânia! ?
dotnet add package YoutubeExplode 
YouTubeexplode expõe sua funcionalidade através de um único ponto de entrada - a classe YoutubeClient . Crie uma instância desta classe e use as operações fornecidas em Videos , Playlists , Channels e propriedades Search para enviar solicitações.
Para recuperar os metadados associados a um vídeo do YouTube, ligue para 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 Todo vídeo do YouTube possui vários fluxos disponíveis, diferentes em contêineres, qualidade de vídeo, taxa de bits, quadros e outros parâmetros. Além disso, os fluxos são divididos em 3 categorias com base em seu conteúdo:
AVISO : Os fluxos MUXED contêm áudio e vídeo, mas esses fluxos são limitados em qualidade (até 720p30). Para baixar o vídeo com a maior qualidade disponível, você precisará resolver os melhores fluxos somente de áudio e apenas em vídeo separadamente e depois os junte. O processo de muxing pode ser executado usando o FFMPEG com a ajuda do pacote YouTubeexplode.Converter .
AVISO : Os fluxos MUXED são descontinuados pelo YouTube e não estão garantidos para estar disponível para cada vídeo. Se possível, evite confiar muito neles e execute o Muxing manualmente usando os fluxos apenas de áudio e apenas em vídeo fornecidos.
Você pode solicitar o manifesto que lista todos os fluxos disponíveis para um vídeo específico chamando 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 ) ;Depois que o manifesto é obtido, você pode filtrar os fluxos e identificar os que está interessado:
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 ( ) Por fim, você pode resolver o fluxo real representado pelos metadados especificados usando Videos.Streams.GetAsync(...) ou baixá -lo diretamente em um arquivo com 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 } " ) ;Aviso : Embora a propriedade
Urlnos metadados do fluxo possa ser usada para acessar o conteúdo subjacente, você precisa de uma série de solicitações HTTP cuidadosamente criadas para fazê -lo. É altamente recomendável usarVideos.Streams.GetAsync(...)ouVideos.Streams.DownloadAsync(...), pois eles executarão todo o levantamento pesado para você.
As legendas fechadas podem ser baixadas de maneira semelhante aos fluxos de mídia. Para obter a lista de faixas de legenda fechada disponíveis, ligue para 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 ) ;Em seguida, recupere os metadados para uma faixa específica:
// ...
// Find closed caption track in English
var trackInfo = trackManifest . GetByLanguage ( "en" ) ; Por fim, use Videos.ClosedCaptions.GetAsync(...) para obter o conteúdo real da faixa:
// ...
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" Você também pode baixar a faixa de legenda fechada no formato de arquivo SRT com Videos.ClosedCaptions.DownloadAsync(...) :
// ...
await youtube . Videos . ClosedCaptions . DownloadAsync ( trackInfo , "cc_track.srt" ) ; Você pode obter os metadados associados a uma lista de reprodução do YouTube chamando as Playlists.GetAsync(...) Método:
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" Para incluir os vídeos em uma lista de reprodução, ligue para 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 ) ;Você também pode enumerar os vídeos iterativamente sem esperar que toda a lista carregue:
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 ;
} Se você precisar de controle preciso sobre quantas solicitações envia ao YouTube, use Playlists.GetVideoBatchesAsync(...) que retorna vídeos embrulhados em lotes:
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 ;
}
}Nota : Você pode criar IDs de lista de reprodução para buscar listas de reprodução especiais geradas por automóveis, como mixagens de música, uploads de canais populares, vídeos curtidos e muito mais. Veja esta referência para obter mais informações.
Você pode obter os metadados associados a um canal do YouTube chamando o método Channels.GetAsync(...) :
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" Você também pode obter os metadados do canal por nome de usuário ou URL de perfil com 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" Para obter os metadados do canal por slug ou URL personalizado legado, use 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" Para obter os metadados do canal por alça ou URL personalizado, use 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" Para obter a lista de vídeos enviados por um canal, ligue para 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 ) ; Você pode executar uma consulta de pesquisa ligando para o método Search.GetResultsAsync(...) . Cada resultado de pesquisa pode representar um vídeo, uma lista de reprodução ou um canal, então você precisa aplicar a correspondência de padrões para lidar com os casos correspondentes:
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 ;
}
}
} Para limitar os resultados a um tipo específico, use 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" ) ; Da mesma forma às listas de reprodução, você também pode enumerar os resultados em lotes chamando 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 :
{
// ...
}
}
}
} Você pode acessar vídeos privados e listas de reprodução, fornecendo cookies que correspondem a uma conta do YouTube pré-autenticada. Para fazer isso, crie uma instância do YoutubeClient usando um construtor que aceite 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 ) ;Para realmente executar a autenticação, você pode usar um navegador incorporado, como o WebView para navegar no usuário até a página de login do YouTube, deixe -os fazer login e extrair os cookies do navegador.
O "Explode" em YouTubeexplode vem do nome de uma função PHP que divide as cordas, explode(...) . Quando eu estava iniciando o desenvolvimento dessa biblioteca, a maior parte do código -fonte de referência que li foi escrita no PHP, daí a inspiração para o nome.