| 该项目的开发完全由社区资助。考虑捐款以支持! |

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视频都有许多可用的流,在容器,视频质量,比特率,帧速率和其他参数方面有所不同。此外,根据其内容将流进一步分为三类:
警告:Muxed Streams既包含音频和视频,但是这些流的质量限制(高达720p30)。要以最高可用质量下载视频,您将需要分别解决最佳的仅音频和仅视频流的流程,然后将它们一起介绍。可以在youtubeexplode.converter软件包的帮助下使用FFMPEG执行Muxing过程。
警告:YouTube弃用Muxed Streams,并且不能保证每个视频可用。如果可能的话,请避免过多地依靠它们,而是使用提供的只有音频和仅视频的流手动执行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.GetAsync(...)解决指定元数据表示的实际流,或直接下载到带有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 } " ) ;警告:尽管可以使用流元数据中的
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"您还可以使用Videos.ClosedCaptions.DownloadAsync(...)以SRT文件格式下载封闭的字幕曲目:
// ...
await youtube . Videos . ClosedCaptions . DownloadAsync ( trackInfo , "cc_track.srt" ) ;您可以通过调用Playlists.GetAsync(...)方法来获取与YouTube播放列表相关联的元数据:
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 ;
}
}注意:您可以制作播放列表ID来获取特殊的自动生成的播放列表,例如音乐混音,流行的频道上传,喜欢的视频等。有关更多信息,请参见此参考。
您可以通过调用Channels.GetAsync(...)方法来获取与YouTube频道关联的元数据:
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"您还可以使用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"要通过Slug或Legacy自定义URL获取频道元数据,请使用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 :
{
// ...
}
}
}
}您可以通过提供对应于预先介绍的YouTube帐户的cookie来访问私人视频和播放列表。为此,请使用接受IReadOnlyList<Cookie>构造函数创建YoutubeClient的实例:
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编写的,因此是该名称的灵感。