| Pengembangan proyek ini sepenuhnya didanai oleh masyarakat. Pertimbangkan untuk menyumbang untuk mendukung! |

YouTubeExplode adalah perpustakaan yang menyediakan antarmuka untuk meminta metadata video, daftar putar dan saluran YouTube, serta untuk menyelesaikan dan mengunduh aliran video dan trek teks tertutup. Di belakang lapisan abstraksi, perpustakaan ini bekerja dengan mengikis data halaman mentah dan mengeksploitasi titik akhir internal yang direkayasa terbalik.
Tertarik dengan cara kerja perpustakaan ini? Lihat artikel YouTube yang direkayasa terbalik.
Paket ekstensi :
Dengan menggunakan proyek ini atau kode sumbernya, untuk tujuan apa pun dan dalam bentuk atau bentuk apa pun, Anda memberikan perjanjian implisit Anda untuk semua pernyataan berikut:
Untuk mempelajari lebih lanjut tentang perang dan bagaimana Anda dapat membantu, klik di sini. Kemuliaan untuk Ukraina! ??
dotnet add package YoutubeExplode 
YouTubeExplode memperlihatkan fungsinya melalui satu titik masuk - kelas YoutubeClient . Buat contoh kelas ini dan gunakan operasi yang disediakan di Videos , Playlists , Channels , dan properti Search untuk mengirim permintaan.
Untuk mengambil metadata yang terkait dengan video YouTube, hubungi 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 Setiap video YouTube memiliki sejumlah aliran yang tersedia, berbeda dalam wadah, kualitas video, bitrate, framerate, dan parameter lainnya. Selain itu, aliran selanjutnya dibagi menjadi 3 kategori berdasarkan kontennya:
Peringatan : Aliran muxed berisi audio dan video, tetapi aliran ini terbatas dalam kualitas (hingga 720p30). Untuk mengunduh video dalam kualitas tertinggi yang tersedia, Anda perlu menyelesaikan aliran audio-only dan video-only terbaik secara terpisah dan kemudian mux bersama-sama. Proses Muxing dapat dilakukan dengan menggunakan FFMPEG dengan bantuan paket YouTubeExplode.converter .
PERINGATAN : Aliran muxed sudah usang oleh YouTube dan tidak dijamin akan tersedia untuk setiap video. Jika memungkinkan, hindari mengandalkan mereka terlalu banyak dan sebaliknya melakukan muxing secara manual menggunakan aliran audio-only dan khusus video yang disediakan.
Anda dapat meminta manifes yang mencantumkan semua aliran yang tersedia untuk video tertentu dengan menelepon 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 ) ;Setelah manifes diperoleh, Anda dapat memfilter melalui aliran dan mengidentifikasi yang Anda minati:
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 ( ) Akhirnya, Anda dapat menyelesaikan aliran aktual yang diwakili oleh metadata yang ditentukan menggunakan Videos.Streams.GetAsync(...) atau mengunduhnya langsung ke file dengan 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 } " ) ;PERINGATAN : Sementara properti
Urldi metadata aliran dapat digunakan untuk mengakses konten yang mendasarinya, Anda memerlukan serangkaian permintaan HTTP yang dibuat dengan cermat untuk melakukannya. Sangat disarankan untuk menggunakanVideos.Streams.GetAsync(...)atauVideos.Streams.DownloadAsync(...)sebagai gantinya, karena mereka akan melakukan semua pengangkatan berat untuk Anda.
Keterangan tertutup dapat diunduh dengan cara yang mirip dengan aliran media. Untuk mendapatkan daftar trek teks tertutup yang tersedia, hubungi 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 ) ;Kemudian ambil metadata untuk trek tertentu:
// ...
// Find closed caption track in English
var trackInfo = trackManifest . GetByLanguage ( "en" ) ; Akhirnya, gunakan Videos.ClosedCaptions.GetAsync(...) untuk mendapatkan konten sebenarnya dari trek:
// ...
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" Anda juga dapat mengunduh trek teks tertutup dalam format file srt dengan Videos.ClosedCaptions.DownloadAsync(...) :
// ...
await youtube . Videos . ClosedCaptions . DownloadAsync ( trackInfo , "cc_track.srt" ) ; Anda bisa mendapatkan metadata yang terkait dengan daftar putar YouTube dengan memanggil Playlists.GetAsync(...) metode:
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" Untuk memasukkan video yang disertakan dalam daftar putar, hubungi 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 ) ;Anda juga dapat menyebutkan video secara iteratif tanpa menunggu seluruh daftar memuat:
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 ;
} Jika Anda memerlukan kontrol yang tepat atas berapa banyak permintaan yang Anda kirim ke YouTube, gunakan Playlists.GetVideoBatchesAsync(...) yang mengembalikan video yang dibungkus batch:
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 ;
}
}Catatan : Anda dapat membuat daftar putar untuk mengambil daftar putar khusus yang dihasilkan otomatis, seperti campuran musik, unggahan saluran populer, video menyukai, dan banyak lagi. Lihat referensi ini untuk informasi lebih lanjut.
Anda bisa mendapatkan metadata yang terkait dengan saluran YouTube dengan memanggil Channels.GetAsync(...) Metode:
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" Anda juga bisa mendapatkan metadata saluran dengan nama pengguna atau URL profil dengan 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" Untuk mendapatkan metadata saluran dengan URL khusus slug atau warisan, gunakan 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" Untuk mendapatkan metadata saluran dengan pegangan atau url khusus, gunakan 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" Untuk mendapatkan daftar video yang diunggah oleh saluran, hubungi 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 ) ; Anda dapat menjalankan kueri pencarian dengan memanggil metode Search.GetResultsAsync(...) . Setiap hasil pencarian dapat mewakili video, daftar putar, atau saluran, jadi Anda perlu menerapkan pencocokan pola untuk menangani kasus yang sesuai:
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 ;
}
}
} Untuk membatasi hasil ke jenis tertentu, gunakan Search.GetVideosAsync(...) , Search.GetPlaylistsAsync(...) , atau 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" ) ; Demikian pula dengan daftar putar, Anda juga dapat menyebutkan hasil dalam batch dengan menelepon 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 :
{
// ...
}
}
}
} Anda dapat mengakses video dan daftar putar pribadi dengan menyediakan cookie yang sesuai dengan akun YouTube yang telah diautentikasi. Untuk melakukan itu, buat contoh YoutubeClient menggunakan konstruktor yang menerima 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 ) ;Untuk benar -benar melakukan otentikasi, Anda dapat menggunakan browser tertanam seperti WebView untuk menavigasi pengguna ke halaman login YouTube, diizinkan masuk, dan kemudian mengekstrak cookie dari browser.
"Explode" di YouTubeExplode berasal dari nama fungsi PHP yang membagi string, explode(...) . Ketika saya memulai pengembangan perpustakaan ini, sebagian besar kode sumber referensi yang saya baca ditulis dalam PHP, maka inspirasi untuk namanya.