| يتم تمويل هذا المشروع بالكامل من قبل المجتمع. النظر في التبرع لدعم! |

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 فئات بناءً على محتواها:
تحذير : تحتوي التدفقات المقطوعة على كل من الصوت والفيديو ، ولكن هذه التدفقات محدودة في الجودة (حتى 720p30). لتنزيل الفيديو بأعلى جودة متاحة ، ستحتاج إلى حل أفضل تدفقات الصوت والفيديو فقط بشكل منفصل ثم قم بزيادةها معًا. يمكن تنفيذ عملية muxing باستخدام FFMPEG بمساعدة حزمة youtubeexplode.converter .
تحذير : يتم إهمال التدفقات المقطوعة من قبل 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 أو 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" للحصول على قائمة مقاطع الفيديو التي تم تحميلها بواسطة قناة ، Call 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 ، وبالتالي مصدر إلهام للاسم.