مهم
تم إيقاف التطوير النشط في هذا المستودع مؤقتًا منذ 14-07-2023. على الرغم من أنه قد يستمر في العمل في بعض السيناريوهات، يرجى العلم أن الدعم يتم التعامل معه الآن من خلال المجتمع فقط، ولا يتم دمج العلاقات العامة حاليًا في الريبو. للحصول على التحديثات المستمرة، نشجعك على استكشاف تشعبات مثل @distube/ytdl-core. وربما نعيد النظر في التطوير في المستقبل. شكرًا لك على اهتمامك ودعمك طويل الأمد!
مع أطيب التحيات TFAN، 2024-08-13
وحدة تنزيل أخرى من YouTube. مكتوب باستخدام Javascript فقط وواجهة بث سهلة الاستخدام.
يمكنك الاتصال بنا للحصول على الدعم على خادم الدردشة لدينا
const fs = require('fs');const ytdl = require('ytdl-core');// TypeScript: استيراد ytdl من 'ytdl-core'; مع --esModuleInterop// TypeScript: import * as ytdl from 'ytdl-core'; with --allowSyntheticDefaultImports// TypeScript: import ytdl = require('ytdl-core'); بدون أي مما سبق ytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ') .pipe(fs.createWriteStream('video.mp4'));
محاولات لتنزيل مقطع فيديو من عنوان URL المحدد. إرجاع دفق قابل للقراءة. يمكن أن تحتوي options
على ما يلي، بالإضافة إلى أي خيار getInfo()
وخيار chooseFormat()
.
range
- نطاق بايت بالشكل {start: INT, end: INT}
الذي يحدد جزءًا من الملف المراد تنزيله، أي {start: 10355705, end: 12452856}. غير مدعوم في التنسيقات المجزأة (DASH MPD، m3u8).
يؤدي هذا إلى تنزيل جزء من الملف، وليس مقطع فيديو منفصلاً.
begin
- ما هو الوقت الذي سيبدأ فيه الفيديو. يدعم التنسيقات 00:00:00.000
أو 0ms, 0s, 0m, 0h
أو عدد المللي ثانية. مثال: 1:30
، 05:10.123
، 10 10m30s
.
بالنسبة لمقاطع الفيديو المباشرة، يقبل هذا أيضًا طابعًا زمنيًا لنظام التشغيل Unix أو كائن Date، ويكون الإعداد الافتراضي هو Date.now()
.
لا يعد هذا الخيار موثوقًا جدًا بالنسبة لمقاطع الفيديو غير المباشرة، راجع رقم 129 ورقم 219.
liveBuffer
- مقدار المخزن المؤقت للوقت الذي سيتم استخدامه لمقاطع الفيديو المباشرة بالمللي ثانية. الافتراضي هو 20000
.
highWaterMark
- مقدار تنزيل الفيديو الذي سيتم تخزينه مؤقتًا في الذاكرة. راجع مستندات العقدة للمزيد. الافتراضي هو 512 كيلو بايت.
dlChunkSize
- عندما يكون التنسيق المختار هو الفيديو فقط أو الصوت فقط، يتم فصل التنزيل إلى أجزاء متعددة لتجنب الاختناق. يحدد هذا الخيار حجم كل قطعة بالبايت. يؤدي تعيينه إلى 0 إلى تعطيل التقطيع. الافتراضي هو 10 ميغابايت.
IPv6Block
- كتلة IPv6 للتدوير، وهي بديل لاستخدام الوكيل. اقرأ المزيد. الإعدادات الافتراضية إلى undefined
.
ytdl.videoInfo
- معلومات.
ytdl.videoFormat
- تنسيق الفيديو.
ينبعث عند جلب info
الفيديو، بالإضافة إلى التنسيق المختار للتنزيل.
number
- طول القطعة بالبايت أو رقم القطعة.
number
- إجمالي وحدات البايت أو المقاطع التي تم تنزيلها.
number
- إجمالي البايتات أو المقاطع.
تنبعث عند استلام قطعة جديدة. يمرر القيم التي تصف تقدم التنزيل.
تتم إعادة توجيه كافة أحداث miniget ويمكن الاستماع إليها من الدفق الذي تم إرجاعه.
دعوة للإجهاض والتوقف عن تنزيل الفيديو.
استخدم هذا إذا كنت تريد فقط الحصول على معلومات تعريفية من مقطع فيديو.
يحصل على معلومات التعريف من الفيديو. يتضمن تنسيقات إضافية وجاهزة لتنزيل عنوان URL الذي تم فك شفرته. هذا ما تستخدمه الدالة ytdl()
داخليًا.
يمكن أن تحتوي options
على ما يلي
requestOptions
- أي شيء يمكن دمجه في خيارات الطلب التي يتم استدعاء miniget بها، مثل headers
.
requestCallback
- توفير وظيفة رد اتصال تستقبل كائنات دفق طلب miniget المستخدمة أثناء جلب معلومات التعريف.
lang
- الرمز المكون من حرفين للغة. الافتراضي هو en
.
بمجرد تلقي البيانات الوصفية من مقطع فيديو باستخدام وظيفة ytdl.getInfo
، يمكنك تمرير هذه المعلومات مع خيارات أخرى إلى هذه الوظيفة.
يمكن استخدامه إذا كنت ترغب في اختيار التنسيق بنفسك. يلقي خطأ إذا فشل في العثور على أي تنسيق مطابق.
يمكن أن تحتوي options
على ما يلي
quality
- جودة الفيديو للتحميل. يمكن أن تكون قيمة itag، أو قائمة قيم itag، أو إحدى هذه السلاسل: highest
/ lowest
/ highestaudio
/ lowestaudio
/ highestvideo
/ lowestvideo
. يحاول highestaudio
/ lowestaudio
تقليل معدل البت للفيديو لتنسيقات الصوت الجيدة بنفس القدر بينما يحاول highestvideo
/ lowestvideo
تقليل الصوت على التوالي. الإعدادات الافتراضية هي highest
، والتي تفضل التنسيقات مع كل من الفيديو والصوت.
سيتم فرز تنسيقات الفيديو النموذجية بالطريقة التالية باستخدام quality: 'highest'
itag container quality codecs bitrate audio bitrate 18 mp4 360p avc1.42001E, mp4a.40.2 696.66KB 96KB 137 mp4 1080p avc1.640028 4.53MB 248 webm 1080p vp9 2.52MB 136 mp4 720p avc1.4d4016 2.2MB 247 webm 720p vp9 1.44MB 135 mp4 480p avc1.4d4014 1.1MB 134 mp4 360p avc1.4d401e 593.26KB 140 mp4 mp4a.40.2 128KB
سيتم اختيار التنسيق 18 بدقة 360 بكسل أولاً لأنه التنسيق الأعلى جودة مع كل من الفيديو والصوت. إذا كنت تريد تنسيقًا عالي الجودة لكل من الفيديو والصوت، فراجع القسم الخاص بالتعامل مع عمليات البث المنفصلة.
filter
- يستخدم لتصفية قائمة التنسيقات للاختيار من بينها. يمكن أن يكون audioandvideo
أو videoandaudio
لتصفية التنسيقات التي تحتوي على الفيديو والصوت، video
لتصفية التنسيقات التي تحتوي على فيديو، أو videoonly
للتنسيقات التي تحتوي على فيديو ولا يوجد مسار صوتي إضافي. يمكن أيضًا أن يكون audio
أو audioonly
. يمكنك إعطاء وظيفة تصفية يتم استدعاؤها بكل تنسيق متاح. تُعطى هذه الدالة كائن format
كوسيطة أولى لها، ويجب أن تُرجع صحيحًا إذا كان التنسيق مفضلاً.
// مثال مع وظيفة مخصصة.ytdl(url, { filter: format => format.container === 'mp4' })
format
- يستخدم بشكل أساسي لتنزيل تدفقات فيديو أو صوت معينة. يمكن أن يكون هذا كائن format
محدد تم إرجاعه من getInfo
.
سيؤدي توفير هذا الخيار إلى تجاهل خيارات filter
quality
حيث يتم توفير التنسيق بشكل صريح.
// مثال لاختيار تنسيق فيديو.let info = انتظار ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, {quality: '134' });console.log('تم العثور على التنسيق!', شكل)؛
إذا كنت ترغب في العمل مع بعض التنسيقات فقط، فيمكنك استخدام خيار filter
أعلاه.
// مثال لتصفية التنسيقات إلى الصوت فقط.let info = انتظار ytdl.getInfo(videoID);let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');console.log('تنسيقات مع الصوت فقط: ' + audioFormats.length);
يُرجع صحيحًا إذا كانت السلسلة المحددة تتوافق مع تنسيق معرف YouTube.
يُرجع صحيحًا إذا كان قادرًا على تحليل معرف فيديو صالح.
إرجاع معرف الفيديو من عنوان URL على YouTube. يلقي خطأ إذا فشل في تحليل معرف.
تمامًا مثل ytdl.getURLVideoID()
أعلاه، ولكن يمكن استدعاؤه باستخدام معرف الفيديو مباشرةً، وفي هذه الحالة يُرجعه. هذا ما يستخدمه ytdl داخليًا. يلقي خطأ إذا فشل في تحليل معرف.
سلسلة الإصدار مأخوذة مباشرة من package.json.
لا يمكن لـ ytdl تنزيل مقاطع الفيديو التي تندرج ضمن ما يلي
مقيد إقليميا (يتطلب وكيلا)
خاص (إذا كان لديك حق الوصول، يتطلب ملفات تعريف الارتباط)
الإيجارات (إذا كان لديك حق الوصول، يتطلب ملفات تعريف الارتباط)
محتوى YouTube Premium (إذا كان بإمكانك الوصول إليه، فإنه يتطلب ملفات تعريف الارتباط)
يتم حاليًا دعم خدمات HLS Livestreams فقط. سيتم تصفية التنسيقات الأخرى في ytdl.chooseFormats
روابط التنزيل التي تم إنشاؤها صالحة لمدة 6 ساعات، ولا يمكن تنزيلها إلا من نفس عنوان IP.
عند تنفيذ عدد كبير جدًا من الطلبات، قد يتم حظر YouTube. سيؤدي هذا إلى رفض طلباتك باستخدام رمز حالة HTTP 429. وقد تساعدك الخطوات التالية:
قم بتحديث ytdl-core إلى أحدث إصدار
استخدم الوكلاء (يمكنك العثور على مثال هنا)
قم بالتوسيع على فكرة الوكيل عن طريق تدوير العناوين (IPv6-).
اقرأ هذا لمزيد من المعلومات حول هذا
استخدم ملفات تعريف الارتباط (يمكنك العثور على مثال هنا)
لكي يصبح هذا ساري المفعول، عليك أولاً الانتظار حتى تنتهي صلاحية حد السعر الحالي
انتظر (عادةً ما يختفي خلال بضعة أيام)
بالنسبة للمهام كثيفة الطلب، قد يكون من المفيد نشر طلباتك عبر عناوين IP متعددة المصادر. إن تغيير عنوان IP المصدر الذي تستخدمه يشبه استخدام الوكيل، باستثناء عدم تجاوز القيود مثل قفل المنطقة. يؤدي المزيد من عناوين IP إلى تقليل الطلبات لكل عنوان IP وبالتالي زيادة الحد الأقصى للمعدل الخاص بك. نظرًا لأن عناوين IPv4 تعد موردًا محدودًا، فإننا ننصح باستخدام IPv6.
إن استخدام كتلة IPv6 يعني في الأساس وجود ملايين من عناوين IPv6 بناءً على طلبك. في كتلة /64 IPv6 (والتي عادة ما تكون الكتلة الممنوحة لأسرة واحدة)، يوجد 18,446,744,073,709,551,616 عنوان IPv6 فريد. سيسمح لك هذا بتقديم كل طلب بعنوان IPv6 مختلف.
على الرغم من أن استخدام حظر IP يساعد في مواجهة حدود المعدل، إلا أنه يتطلب منك إعداد نظامك المضيف لقبول حركة مرور http من كل رسالة في كتلة IP. لا يمكننا مساعدتك في الإعداد لأي مضيف/موفر استضافة محدد ولكن البحث في الإنترنت على الأرجح يمكنه ذلك.
عادةً لا تحتوي مقاطع الفيديو بدقة 1080 بكسل أو أفضل منها على صوت مشفر بها. يجب تنزيل الصوت بشكل منفصل ودمجه عبر مكتبة التشفير. ffmpeg
هي الأداة الأكثر استخدامًا على نطاق واسع، مع توفر العديد من وحدات Node.js. استخدم كائنات format
التي تم إرجاعها من ytdl.getInfo
لتنزيل تدفقات محددة لدمجها لتناسب احتياجاتك. انظر إلى example/ffmpeg.js للحصول على مثال حول القيام بذلك.
يقوم YouTube بتحديث موقعه على الويب طوال الوقت، وليس من النادر أن يتوقف هذا عن العمل. إذا لم ينجح الأمر معك وكنت تستخدم الإصدار الأحدث، فلا تتردد في فتح مشكلة. تأكد من التحقق من عدم وجود واحد بالفعل بنفس الخطأ.
قم بإجراء الاختبارات على test/irl-test.js
للتأكد من أن هذه مشكلة بالفعل في ytdl-core.
npm run test:irl
لا يتم الاستهزاء بهذه الاختبارات، بل يحاولون البدء بتنزيل بعض مقاطع الفيديو. إذا فشلت هذه، فقد حان الوقت لتصحيح الأخطاء. إذا كان الخطأ الذي تحصل عليه هو فك تشفير التوقيع، فتحقق من lib/sig.js
. وإلا فمن المحتمل أن يكون الخطأ داخل lib/info.js
.
تثبيت npm ytdl-core@latest
أو لمستخدمي الغزل:
أضف الغزل ytdl-core@latest
تأكد من تثبيت أحدث إصدار من ytdl-core لمواكبة أحدث الإصلاحات.
إذا كنت تستخدم برنامجًا آليًا أو تطبيقًا يستخدم ytdl-core، مثل ytdl-core-discord أو discord-player، فقد يعتمد على إصدار أقدم. لتحديث إصدار ytdl-core الخاص بها، يتعين على تلك المكتبة تحديث ملف package.json
الخاص بها، ولا يمكنك ببساطة تغيير الإصدار الموجود على package.json
الخاص بمشروعك، وسيظل التطبيق يستخدم الإصدار الأقدم الخاص به من ytdl-core.
ابحث في الريبو الخاص بهم لمعرفة ما إذا كان لديهم بالفعل طلب سحب نشط يقوم بتحديث ytdl-core. إذا لم يفعلوا ذلك، فافتح مشكلة تطلب منهم تحديث ytdl-core، أو الأفضل من ذلك، افصل المشروع وأرسل طلب سحب بالإصدار المحدث.
أثناء انتظارك لدمج طلبات السحب، يمكنك الإشارة إلى فرعها في package.json
الخاص بك
"ytdl-core-discord": "amishshah/ytdl-core-discord#dependabot/npm_and_yarn/ytdl-core-2.0.1"
أصبحت مشكلة استخدام إصدار قديم من ytdl-core منتشرة جدًا، لدرجة أن ytdl-core يتحقق الآن من التحديثات في وقت التشغيل، وكل 12 ساعة. إذا عثر على تحديث، فسوف يطبع تحذيرًا إلى وحدة التحكم ينصحك بالتحديث. نظرًا لطبيعة هذه المكتبة، من المهم دائمًا استخدام أحدث إصدار مع استمرار YouTube في التحديث.
إذا كنت ترغب في تعطيل التحقق من التحديث، فيمكنك القيام بذلك عن طريق توفير متغير البيئة YTDL_NO_UPDATE
.
env YTDL_NO_UPDATE=1 node myapp.js
ytdl - غلاف cli لهذا.
pully - غلاف CLI آخر يهدف إلى تنسيقات عالية الجودة.
ytsr - نتائج بحث فيديو يوتيوب.
ytpl - قائمة تشغيل YouTube ومحلل القنوات.
تتم كتابة الاختبارات مع المخاوي
اختبار npm