| การพัฒนาโครงการนี้ได้รับทุนสนับสนุนจากชุมชนทั้งหมด พิจารณาบริจาคเพื่อสนับสนุน! |

YouTubeExPlode เป็นไลบรารีที่ให้อินเทอร์เฟซเพื่อสอบถามข้อมูลเมตาของวิดีโอ YouTube เพลย์ลิสต์และช่องรวมทั้งแก้ไขและดาวน์โหลดสตรีมวิดีโอและแทร็กคำบรรยายภาพปิด ด้านหลังเลเยอร์ของนามธรรมห้องสมุดนี้ทำงานได้โดยการขูดข้อมูลหน้าดิบและใช้ประโยชน์จากจุดสิ้นสุดภายในที่ได้รับการออกแบบทางวิศวกรรมแบบย้อนกลับ
สนใจงานภายในของห้องสมุดนี้หรือไม่? ดูบทความ YouTube ด้านวิศวกรรมย้อนกลับ
แพ็คเกจส่วนขยาย :
โดยการใช้โครงการนี้หรือซอร์สโค้ดสำหรับวัตถุประสงค์ใด ๆ และในรูปแบบหรือรูปแบบใด ๆ คุณให้ ข้อตกลงโดยนัย ของคุณกับข้อความทั้งหมดต่อไปนี้:
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับสงครามและวิธีที่คุณสามารถช่วยได้คลิกที่นี่ Glory to Ukraine! -
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) ในการดาวน์โหลดวิดีโอในคุณภาพสูงสุดที่มีอยู่คุณจะต้องแก้ไขสตรีมเสียงที่ดีที่สุดเท่านั้นและวิดีโอเท่านั้นแยกต่างหากจากนั้น mux พวกเขาเข้าด้วยกัน กระบวนการ 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.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" นอกจากนี้คุณยังสามารถดาวน์โหลดแทร็กคำบรรยายภาพปิดในรูปแบบไฟล์ 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" ในการรับข้อมูลเมตาของช่องทางโดย Slug หรือ 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 ที่ได้รับการตรวจสอบล่วงหน้า ในการทำเช่นนั้นให้สร้างอินสแตนซ์ของ 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 ให้พวกเขาเข้าสู่ระบบจากนั้นแยกคุกกี้ออกจากเบราว์เซอร์
"ระเบิด" ใน YouTubeExPlode มาจากชื่อของฟังก์ชั่น PHP ที่แยกสตริง, explode(...) เมื่อฉันเริ่มการพัฒนาของห้องสมุดนี้ซอร์สโค้ดอ้างอิงส่วนใหญ่ที่ฉันอ่านถูกเขียนใน PHP ดังนั้นแรงบันดาลใจสำหรับชื่อ