| このプロジェクトの開発は、コミュニティによって完全に資金提供されています。サポートに寄付することを検討してください! |

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つのカテゴリにさらに分割されます。
警告:マックスされたストリームにはオーディオとビデオの両方が含まれていますが、これらのストリームの品質は限られています(最大720pp30)。利用可能な最高品質でビデオをダウンロードするには、最高のオーディオのみのオーディオのみのストリームとビデオのみのストリームを個別に解決し、それらを一緒にMuxする必要があります。マクシングプロセスは、 YouTubexPlode.Converterパッケージの助けを借りてFFMPEGを使用して実行できます。
警告:MuxedストリームはYouTubeによって非推奨されており、すべてのビデオで利用できることは保証されていません。可能であれば、それらに頼りすぎないようにし、代わりに提供されたオーディオのみおよびビデオのみのストリームを使用して手動でマイニングを実行します。
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に送信するリクエストの数を正確に制御する必要がある場合は、Batchesでラップされたビデオを返している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"また、チャンネルを使用してUsernameまたはプロファイル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" SlugまたはLegacy Custom 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の「爆発」は、文字列を分割してexplode(...) 。私がこのライブラリの開発を開始したとき、私が読んだ参照ソースコードのほとんどはPHPで書かれていたため、名前のインスピレーションがありました。