| Разработка этого проекта полностью финансируется сообществом. Подумайте о пожертвовании на поддержку! |

YouTubeExplode - это библиотека, которая предоставляет интерфейс для запросов метаданных видео, списков воспроизведения и каналов на YouTube, а также для разрешения и загрузки видеопотоков и закрытых заголовков. За слоем абстракции эта библиотека работает, соскребая необработанные данные страницы и используя обратно инженерные внутренние конечные точки.
Заинтересованы в внутренней работе этой библиотеки? Смотрите статью на YouTube с обратной инженерией.
Пакеты расширения :
Используя этот проект или его исходный код, для любой цели и в любой форме или форме, вы предоставляете свое неявное соглашение всем следующим операторам:
Чтобы узнать больше о войне и о том, как вы можете помочь, нажмите здесь. Слава Украине! ??
dotnet add package YoutubeExplode 
YouTubeExplode раскрывает свою функциональность через одну точку входа - класс YoutubeClient . Создайте экземпляр этого класса и используйте предоставленные операции на Videos , Playlists , Channels и свойствах Search для отправки запросов.
Чтобы получить метаданные, связанные с видео на YouTube, позвоните 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 Каждое видео на YouTube имеет несколько доступных потоков, различающихся по контейнерам, качество видео, битрейт, кадров и другие параметры. Кроме того, потоки дополнительно разделены на 3 категории на основе их содержания:
ПРЕДУПРЕЖДЕНИЕ : MUXED -потоки содержат как аудио, так и видео, но эти потоки ограничены по качеству (до 720P30). Чтобы загрузить видео в самом высоком доступном качестве, вам нужно будет разрешить лучшие потоки только для аудио и только видео отдельно, а затем смириться с ними вместе. Процесс MUXING может быть выполнен с использованием FFMPEG с помощью пакета YouTubeExPlode.Converter .
ПРЕДУПРЕЖДЕНИЕ : MUXED -потоки устарели от YouTube и не гарантированно будут доступны для каждого видео. Если возможно, не полагайтесь на них слишком сильно и вместо этого выполняйте Muxing вручную, используя предоставленные потоки только для аудио и видео только для видео.
Вы можете запросить манифест, в котором перечислены все доступные потоки для конкретного видео, позвонив 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 ) ;Как только манифест будет
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 ( ) Наконец, вы можете разрешить фактический поток Videos.Streams.DownloadAsync(...) представленный указанными метаданными с использованием Videos.Streams.GetAsync(...)
// ...
// 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 } " ) ;Предупреждение : Хотя свойство
Urlв метаданных потока может использоваться для доступа к базовому контенту, вам нужна серия тщательно продуманных HTTP -запросов для этого. Настоятельно рекомендуется использоватьVideos.Streams.GetAsync(...)илиVideos.Streams.DownloadAsync(...)вместо этого, так как они будут выполнять все тяжелые работы для вас.
Закрытые подписи могут быть загружены аналогично медиа -потокам. Чтобы получить список доступных закрытых заголовков, позвоните в 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 ) ;Затем возьмите метаданные для определенного трека:
// ...
// Find closed caption track in English
var trackInfo = trackManifest . GetByLanguage ( "en" ) ; Наконец, используйте 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" Вы также можете загрузить закрытый трек подписи в формате файла SRT с помощью Videos.ClosedCaptions.DownloadAsync(...) .
// ...
await youtube . Videos . ClosedCaptions . DownloadAsync ( trackInfo , "cc_track.srt" ) ; Вы можете получить метаданные, связанные с плейлистом YouTube, позвонив в метод 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" Чтобы получить видео, включенные в список воспроизведения, позвоните 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 ) ;Вы также можете перечислить видео итеративно, не ожидая загрузки всего списка:
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 ;
} Если вам нужен точный контроль над тем, сколько запросов вы отправляете на YouTube, используйте Playlists.GetVideoBatchesAsync(...) , что возвращает видео, обернутые пакетами:
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 ;
}
}Примечание . Вы можете создать идентификаторы плейлиста, чтобы принести специальные автоматические плейлисты, такие как музыкальные миксы, популярные загрузки канала, любимые видео и многое другое. Смотрите эту ссылку для получения дополнительной информации.
Вы можете получить метаданные, связанные с каналом YouTube, вызывая метод 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" Вы также можете получить метаданные канала по имени пользователя или URL -адреса профиля с 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" Чтобы получить метаданные канала с помощью пользовательского URL -адреса Slug или Legacy, используйте 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" Чтобы получить метаданные канала с помощью ручки или пользовательского URL, используйте 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" Чтобы получить список видео, загруженных каналом, звоните 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 ) ; Вы можете выполнить поисковый запрос, вызвав метод Search.GetResultsAsync(...) . Каждый результат поиска может представлять либо видео, плейлист или канал, поэтому вам необходимо применить соответствие шаблонов для обработки соответствующих случаев:
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 ;
}
}
} Чтобы ограничить результаты определенным типом, используйте Search.GetVideosAsync(...) , Search.GetPlaylistsAsync(...) или 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" ) ; Подобно плейлистам, вы также можете перечислить результаты партии, позвонив по 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 :
{
// ...
}
}
}
} Вы можете получить доступ к частным видео и спискам воспроизведения, предоставляя файлы cookie, которые соответствуют предварительно аутифицированной учетной записи YouTube. Для этого создайте экземпляр YoutubeClient , используя конструктор, который принимает 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 ) ;Чтобы фактически выполнить аутентификацию, вы можете использовать встроенный браузер, такой как WebView, чтобы перемещаться по пользователю на страницу входа в систему YouTube, позволить им войти в систему, а затем извлечь файлы cookie из браузера.
«Взрыв» в YouTubeExPlode происходит от имени функции PHP, которая расщепляет строки, explode(...) . Когда я начинал разработку этой библиотеки, большая часть справочного исходного кода, которую я прочитал, была написана в PHP, отсюда и вдохновение для названия.