تخطَّ إلى المحتوى الرئيسي
خصم ٥٠٪ جميع الخطط، لفترة محدودة. تبدأ من $2.48/mo
11 min left
الألعاب والوسائط

تشغيل yt-dlp على VPS للأرشفة الشخصية بلا واجهة رسومية

S بواسطة Sajjad 11 دقيقة قراءة
yt-dlp running headless on a VPS, feeding scheduled downloads into an organized video library that a media server can scan

تشغيل yt-dlp على VPS يمنح التنزيلات الطويلة جهازًا يبقى متصلًا بعد أن تغلق حاسوبك المحمول. كما يرسم مسارًا واضحًا من سحب مجدول لقناة إلى مكتبة وسائط يستطيع Jellyfin فحصها.

يغيّر الخادم ثلاثة أجزاء من سير العمل: التثبيت يحتاج اعتماديات YouTube الحالية، والمقاطع المقيّدة بحساب تحتاج نقلًا آمنًا لملفات تعريف الارتباط، والأتمتة تحتاج ضبطًا متعمّدًا لوتيرة الطلبات. والإعداد أدناه يعالج الثلاثة دون افتراض أن كل تنزيل يحتاج ملفات تعريف ارتباط أو واجهة ويب أو مزوّد PO Token.

الخلاصة السريعة

  • ثبّت yt-dlp داخل بيئة Python افتراضية مع ffmpeg وffprobe وyt-dlp-ejs وبيئة تشغيل JavaScript مدعومة. وDeno هي البيئة التي يوصي بها المشروع حاليًا.
  • ابدأ من دون ملفات تعريف ارتباط الحساب. ولا تضفها إلا لقوائم التشغيل الخاصة أو المقاطع المقيّدة بالعمر أو المحتوى المخصّص للأعضاء أو أي حالة أخرى تتطلب حسابًا.
  • أبقِ سلوك yt-dlp الافتراضي بجزء واحد إلى أن يكون لديك سبب مقيس لتغييره. واستخدم خيارات الانتظار والجداول المتباعدة لتقليل ضغط الطلبات.
  • واجهة سطر الأوامر وحدها مع systemd هي أبسط إعداد يُعتمد عليه. اختر Pinchflat لقواعد القنوات التي تعمل من دون تدخل، أو MeTube لطابور تنزيل عبر المتصفح، أو Tube Archivist لواجهة مشاهدة قابلة للبحث.
  • تعامل مع التخزين بوصفه المتغير الأساسي في تحديد الحجم. واختبر عيّنة تمثيلية قبل شراء سعة قرص لأرشيف كامل.

استخدم yt-dlp بمسؤولية

لا تؤرشف الوسائط إلا حين يكون لديك إذن ويكون استخدامك متوافقًا مع شروط المنصة والقانون المعمول به.

  • من الأمثلة الجيدة: مقاطعك التي رفعتها بنفسك، والوسائط في الملك العام، والمواد التي أذن صاحب الحقوق بتنزيلها.
  • لا يمنحك اشتراك YouTube Premium بحد ذاته إذنًا بنسخ المقاطع خارج الميزات التي يوفرها YouTube.
  • أذونات YouTube وقيوده تقيّد التنزيل والوصول الآلي ما لم تأذن به الخدمة أو أصحاب الحقوق المعنيون.
  • لا يتناول هذا الدليل الالتفاف على أنظمة DRM ولا إعادة التوزيع التجاري ولا سبل التهرب من إجراءات المنصة.

ما تحتاجه قبل البدء

التثبيت الأساسي صغير، أما ملفات الوسائط فلا. جهّز الخادم ومسار التخزين قبل تنزيل قناة كاملة.

  • خادم VPS بنظام Ubuntu 22.04 أو أحدث، أو إصدار حديث من Debian، مع وصول عبر SSH
  • Python 3.10 أو أحدث
  • مساحة تخزين كافية لعيّنة تمثيلية، مع هامش للملفات الجزئية والمعالجة اللاحقة
  • متصفح محلي منفصل، فقط إذا كنت تحتاج ملفات تعريف ارتباط الحساب
  • اختياري: Jellyfin أو Emby أو أي خادم وسائط آخر يستطيع قراءة مجلد الأرشيف

لماذا تضع yt-dlp على VPS؟

يفيد الـ VPS حين يجب أن تستمر المهمة بمعزل عن حاسوبك اليومي. فهو يمنح أداة التنزيل عملية دائمة، ونظام ملفات يمكن التنبؤ به، ومجدولًا لا يتوقف حين ينام الحاسوب المحمول أو يغيّر الشبكة.

المفاضلات مهمة. فحصة النقل الشهرية لخادمك قد تصبح قيدًا حين تبثّ الأرشيف إلى الخارج، وقد يصطدم عنوان IP الخاص بالـ VPS بحدود الطلبات أسرع من اتصالك المنزلي. كما تتولى أنت التحديثات وإدارة بيانات الاعتماد والنسخ الاحتياطية وتنظيف التخزين وأمن خادم الوسائط. ولتنزيل لمرة واحدة، الحاسوب المحمول أبسط. أما للسحوبات المتكررة أو مكتبة وسائط مشتركة، فتشغيل الـ VPS أيسر.

احسب حجم الـ VPS انطلاقًا من التخزين والتشغيل

yt-dlp VPS sizing guide: starting allocations of 2 vCPU and 2 GB RAM for raw yt-dlp with systemd, 2 vCPU and 4 GB RAM for MeTube or Pinchflat, and 4 vCPU and 8 GB RAM for Tube Archivist, beside a method for projecting storage from a sample download

ينزّل yt-dlp الوسائط ويعيد تغليفها؛ وهو لا يعيد ترميز كل ملف في العادة. وهذا يبقي احتياجات المعالج والذاكرة المستمرة متواضعة، بينما يتفاوت استهلاك القرص بحسب مدة الفيديو ودقته وترميزه والصيغة المختارة.

استخدم هذه المخصصات كنقاط انطلاق متحفظة، لا كحدود دنيا رسمية:

الإعدادالمخصصات المبدئيةنهج التخزينالأنسب
yt-dlp وحده مع systemd2 vCPU, 2 GB RAMاحسب الحجم من عيّنةتنزيلات مجدولة بلا واجهة
MeTube أو Pinchflat2 vCPU, 4 GB RAMاحسب الحجم من عيّنةطابور عبر المتصفح أو اشتراكات في القنوات
Tube Archivist4 vCPU, 8 GB RAMقرص محلي مع هامش للنموأرشيف قابل للبحث مع تشغيل مدمج

يحتاج الاختبار الصغير نحو 2 غيغابايت من الذاكرة المتاحة، والتثبيت المتوسط إلى الكبير نحو 4 غيغابايت، وذلك بحسب دليل نشر Tube Archivist. والبدء فوق هذا الحد يترك مجالًا لنظام التشغيل وDocker ونشاط Elasticsearch ولخدمة أخرى مثل Jellyfin.

قبل تقدير حجم أرشيف كامل، حاكِ أو نزّل مجموعة تمثيلية بالدقة التي اخترتها. ثم افحص المجلد الناتج بأداة du، واقسم على عدد المقاطع المكتملة، وضع في حسابك المقاطع الطويلة بشكل غير معتاد.

du -sh ~/archive
find ~/archive -type f \( -name '*.mp4' -o -name '*.mkv' \) | wc -l
df -h ~/archive

العيّنة أنفع من تقدير عام بالغيغابايت لكل مقطع، لأنها تعكس المدة الفعلية ومزيج الصيغ الحقيقي للقناة.

ثبّت yt-dlp واعتمادياته الحالية

يدعم مشروع yt-dlp إصدار Python 3.10 وما بعده. وتوصي قائمة اعتماديات yt-dlp بشدة باستخدام ffmpeg وffprobe وyt-dlp-ejs وبيئة تشغيل JavaScript مدعومة، للحصول على دعم كامل لـ YouTube.

ابدأ بحزم النظام وبيئة Python معزولة:

sudo apt update
sudo apt install -y python3 python3-venv ffmpeg curl nano
python3 -m venv ~/yt-dlp-venv
source ~/yt-dlp-venv/bin/activate
python -m pip install -U --pre "yt-dlp[default]"

يأتي Deno مفعّلًا افتراضيًا في yt-dlp، وهو بيئة التشغيل التي يوصي بها حاليًا دليل EJS المشروع. ثبّته، وأضِفه إلى مسار الصدفة لديك، وتحقق من كل مكوّن:

curl -fsSL https://deno.land/install.sh | sh
export PATH="$HOME/.deno/bin:$PATH"
echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.profile
yt-dlp --version
ffmpeg -version | head -1
deno --version
yt-dlp --simulate --verbose "https://www.youtube.com/watch?v=VIDEO_ID"

يعرض الإخراج المفصّل الاعتماديات التي يراها yt-dlp. وإذا كان ffmpeg غائبًا، فسينبّهك yt-dlp ولن يستطيع دمج مسارَي الفيديو والصوت المنفصلين بأفضل جودة، ولا تنفيذ عدة خطوات من المعالجة اللاحقة.

في التثبيت عبر pip، حدّث بإعادة تشغيل pip داخل البيئة الافتراضية. أما الأمر المدمج yt-dlp -U فهو للملفات التنفيذية للإصدارات، لا لحزم pip.

source ~/yt-dlp-venv/bin/activate
python -m pip install -U --pre "yt-dlp[default]"

قنوات التحديث موضّحة في ملاحظات تحديث yt-dlp. القنوات stable وnightly وmaster متاحة جميعًا، ويوصي المشروع المستخدمين العاديين بقناة nightly لأن إصلاحات المستخرِجات تصل إليها قبل الإصدار المستقر التالي.

لا تضف ملفات تعريف الارتباط إلا للمحتوى الذي يتطلب حسابًا

جرّب الرابط المستهدف من دون ملفات تعريف ارتباط أولًا. فدليل yt-dlp الخاص بـ YouTube يقول إن ملفات تعريف الارتباط ضرورية فقط للمحتوى الذي يتطلب حسابًا، بما في ذلك قوائم التشغيل الخاصة والمقاطع المقيّدة بالعمر والمحتوى المخصّص للأعضاء. ولم يعد تسجيل الدخول عبر OAuth يعمل مع yt-dlp.

حين تكون ملفات تعريف الارتباط ضرورية، صدّر جلسة YouTube مخصّصة من حاسوبك المحلي. فـ إجراء تصدير ملفات تعريف الارتباط الخاص بالمشروع يستخدم نافذة تصفح خاصة كي لا يبدّل YouTube الجلسة المصدَّرة في تبويب عادي مفتوح:

  1. افتح نافذة خاصة أو نافذة تصفح متخفٍّ واحدة وسجّل الدخول إلى YouTube.
  2. في التبويب نفسه، افتح ملف robots.txt الخاص بـ YouTube.
  3. صدّر ملفات تعريف الارتباط الخاصة بـ youtube.com فقط بصيغة Netscape، باستخدام إحدى الإضافات المذكورة في الأسئلة الشائعة لـ yt-dlp.
  4. أغلق النافذة الخاصة ولا تعد فتح تلك الجلسة.
  5. انسخ الملف إلى الـ VPS وقيّد أذوناته.
scp cookies.txt your-user@your-vps-ip:~/cookies.txt
ssh your-user@your-vps-ip 'chmod 600 ~/cookies.txt'

اختبر الملف برابط يتطلب حسابًا:

~/yt-dlp-venv/bin/yt-dlp \
  --cookies ~/cookies.txt \
  --simulate \
  "https://www.youtube.com/watch?v=VIDEO_ID"

ملفات تعريف الارتباط هي بيانات اعتماد للجلسة، واختيار إضافات المتصفح يحتاج تدقيقًا، وفق الأسئلة الشائعة لـ yt-dlp حول ملفات تعريف الارتباط. كما يحذّر دليل مستخرِج YouTube من أن استخدام حساب مع yt-dlp قد يؤدي إلى حظر مؤقت أو دائم. فلا تستخدم ملفات تعريف الارتباط إلا حين يتطلبها الهدف، واحتفظ بالملف خاصًا، واستخدم حسابًا منفصلًا بدل حساب Google الأساسي لديك.

لا تضع ‎--cookies في الإعدادات العامة حين تكون معظم الأهداف عامة. استخدم ملف إعدادات ثانيًا، أو أضف الخيار فقط إلى المهام التي تحتاجه.

تعامل مع PO Tokens كإجراء استكشاف أعطال مشروط

yt-dlp access troubleshooting flow: simulate the URL first, then branch to no cookies needed for a working public video, a cookie export for account-gated content, or a dependency update and PO Token check when failures continue

ليس Proof of Origin Token شرطًا عامًا للتثبيت. فـ YouTube يفرض هذه الرموز حاليًا على بعض تركيبات العميل والطلب، والمصفوفة الدقيقة تتغيّر.

يُوصى بإضافة مزوّد لعميل mweb حين تفشل العملاء الافتراضية، وذلك بحسب دليل PO Token الخاص بـ yt-dlp. وهو يذكر bgutil-ytdlp-pot-provider ضمن الخيارات البارزة، لكن هذه الإضافة تتطلب مزوّد رموز وإضافة لـ yt-dlp معًا. وتثبيت حزمة Python وحدها ليس إعدادًا كاملًا.

اتبع هذا الترتيب حين يفشل تنزيل من YouTube:

  1. حدّث yt-dlp وyt-dlp-ejs وبيئة تشغيل JavaScript.
  2. أعد إنتاج العطل باستخدام ‎--verbose ومن دون فرض عميل إضافي.
  3. لا تضف ملفات تعريف الارتباط إلا إذا كان المقطع يتطلب حسابًا.
  4. إذا كان الخطأ يشير إلى فرض PO Token، فاتبع تعليمات المزوّد الحالية المرتبطة من الدليل الرسمي.

بهذا تُبقي حلًا ملتويًا ومتقلبًا خارج تثبيت أساسي مستقر في ما عدا ذلك.

اختر الواجهة بحسب سير العمل

القرار الأساسي ليس أيّ واجهة تملك أطول قائمة ميزات. بل حدّد إن كنت تحتاج طابورًا عبر المتصفح، أو اشتراكات تقوم على قواعد، أو مكتبة محلية كاملة على غرار YouTube.

الخيارطريقة النشريبرع فيالمفاضلة الأساسية
سطر أوامر خامبلا واجهةالسكربتات، وملفات الإعداد، وsystemd، والتحكم الدقيق في الخياراتلا واجهة عبر المتصفح
MeTubeحاوية Docker واحدةتنزيلات عبر المتصفح، إضافة إلى اشتراكات في القنوات وقوائم التشغيلإدارة محدودة للمكتبة بعد التنزيل
Pinchflatحاوية Docker واحدةقواعد للقنوات وقوائم التشغيل، وRSS، وسياسات الاحتفاظ، ومخرجات ملائمة لمراكز الوسائطمصمَّم لإدارة التنزيلات، لا للمشاهدة داخل التطبيق
Tube Archivistحاويات للتطبيق وRedis وElasticsearchبحث، وبيانات وصفية، وطوابير، وصفحات للقنوات، وتشغيلأعلى استهلاك للذاكرة وأكبر عبء تشغيلي

لسير عمل خفيف عبر المتصفح، يدعم MeTube اشتراكات في القنوات وقوائم التشغيل تتحقق دوريًا من العناصر الجديدة وتضيفها إلى الطابور تلقائيًا. ويظل الخيار الأبسط حين يكون كل ما تريده نموذجًا على الويب وطابور تنزيل.

Pinchflat هو الأنسب للأرشفة المستمرة للقنوات التي ستُشاهد عبر Jellyfin أو Plex أو Kodi أو عميل RSS. فهو قائم بذاته، ويتحقق من المصادر دوريًا، ويدعم قواعد الاحتفاظ، ويترك التشغيل عمدًا لتطبيق آخر.

يستحق Tube Archivist خدماته الإضافية حين تريد أن يتصرف الأرشيف نفسه كموقع فيديو قابل للبحث. وإذا كان Jellyfin يوفّر لك واجهة التشغيل أصلًا، فابدأ بسطر الأوامر الخام أو بـ Pinchflat، ولا تضف Tube Archivist إلا حين يحلّ نموذج البحث والبيانات الوصفية لديه مشكلة تعاني منها فعلًا.

ابنِ إعدادًا للأرشفة قابلًا للتكرار

احتفظ بالخيارات الثابتة في ملف واحد، ومرّر رابط القناة من سطر الأوامر أو من المجدول. هذا المثال يقصر الإخراج على 1080p، ويسجّل معرّفات المقاطع المكتملة، ويضيف تباطؤًا خفيفًا بين الطلبات، ويكتب بيانات وصفية تظل مفيدة خارج yt-dlp.

أنشئ المجلدات وملف الإعداد:

mkdir -p ~/.config/yt-dlp ~/archive
nano ~/.config/yt-dlp/archive.conf

أضف هذه الخيارات:

-P "~/archive"
-o "%(channel)s/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s"
-f "bv*[height<=1080]+ba/b[height<=1080]"
--merge-output-format mp4
--download-archive ~/archive/downloaded.txt
--sleep-requests 1
--sleep-interval 5
--max-sleep-interval 10
--write-info-json
--write-thumbnail
--write-subs
--write-auto-subs
--sub-langs en.*
--embed-subs
--embed-thumbnail
--embed-metadata
--sponsorblock-mark all

نفّذ اختبارًا على مقطع واحد قبل أن تعطي yt-dlp قناة كاملة:

~/yt-dlp-venv/bin/yt-dlp \
  --config-location ~/.config/yt-dlp/archive.conf \
  "https://www.youtube.com/watch?v=VIDEO_ID"

ثم شغّل رابط قناة أو قائمة تشغيل بالإعداد نفسه:

~/yt-dlp-venv/bin/yt-dlp \
  --config-location ~/.config/yt-dlp/archive.conf \
  "https://www.youtube.com/@CHANNEL/videos"

يسجّل ملف ‎--download-archive معرّفات المقاطع التي نُزّلت بنجاح، فتتخطاها التشغيلات اللاحقة. وأبقِ في البداية القيمة الافتراضية ‎--concurrent-fragments 1. ويوصي دليل yt-dlp الخاص بـ YouTube بترك فواصل زمنية بين المقاطع حين تبلغ الجلسة حدود الطلبات؛ وهو لا ينشر سقفًا عامًا وآمنًا لتزامن الأجزاء لعناوين IP الخاصة بالـ VPS.

جدولة التنزيلات باستخدام systemd

يمنح مؤقّت systemd على مستوى المستخدم المهمةَ جدولةً دائمة وسجلات، من دون وضع أمر طويل في cron. كما يمنع التأخير العشوائي انطلاق كل المصادر المجدولة في الثانية نفسها. ولتفادي الاعتماد على متغير PATH لمدير المستخدم، توجّه الخدمة yt-dlp مباشرةً إلى مسار تثبيت Deno الافتراضي.

أنشئ الخدمة:

mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/yt-dlp-archive.service
[Unit]
Description=Archive a YouTube channel with yt-dlp

[Service]
Type=oneshot
ExecStart=%h/yt-dlp-venv/bin/yt-dlp --js-runtimes deno:%h/.deno/bin/deno --config-location %h/.config/yt-dlp/archive.conf https://www.youtube.com/@CHANNEL/videos

أنشئ المؤقّت:

nano ~/.config/systemd/user/yt-dlp-archive.timer
[Unit]
Description=Run the yt-dlp archive daily

[Timer]
OnCalendar=*-*-* 04:00:00
RandomizedDelaySec=30m
Persistent=true

[Install]
WantedBy=timers.target

فعّل المؤقّت واسمح لخدمة المستخدم بالعمل حتى حين لا تكون مسجّل الدخول:

systemctl --user daemon-reload
systemctl --user enable --now yt-dlp-archive.timer
sudo loginctl enable-linger "$USER"
systemctl --user list-timers
journalctl --user -u yt-dlp-archive.service -n 100 --no-pager

إن كان لديك عدة قنوات، فأنشئ نسخة خدمة لكل قناة أو استخدم مؤقّتات منفصلة. وباعِد بينها زمنيًا بدل إطلاق عدة عمليات سحب كبيرة معًا.

اربط الأرشيف بـ Jellyfin

ركّب المجلد ~/archive نفسه أو أتِحه لـ Jellyfin، ثم أضِفه كمكتبة. وللبنية الخام من قناة/تاريخ، فإن مكتبة Music Videos في Jellyfin تقبل مجلدات متداخلة وأسماء ملفات اعتباطية من دون مطابقة بيانات وصفية عبر الإنترنت. والتسمية ليست مثالية لأرشيف غير موسيقي، لكن ملاءمتها لبنية الملفات أفضل من نوع "Shows" الذي يتوقع مجلدات مسلسلات ومواسم بأسماء حلقات على هيئة SxxEyy. وتجنّب Mixed Content إلا إذا قبلت تحذير Jellyfin من أن نتائج البيانات الوصفية قد تكون غير موثوقة.

تحتفظ خيارات البيانات الوصفية والصورة المصغّرة والترجمات في إعداد yt-dlp بمعلومات مفيدة بجوار كل ملف أو داخله. ومع ذلك قد يحتاج Jellyfin إلى تعديلات يدوية للبيانات الوصفية، لأن قناة YouTube لا تنطبق بسلاسة على قاعدة بيانات للمسلسلات التلفزيونية.

إن أردت أسماء ملفات وبيانات وصفية مهيّأة لـ Jellyfin بجهد يدوي أقل، فلدى Pinchflat إعدادات جاهزة لمراكز الوسائط تناسب هذا السير. أما الاختيار الأوسع بين خوادم الوسائط فتغطيه مقارنتنا بين Jellyfin وPlex التي تتناول المفاضلات في التشغيل والوصول عن بُعد وإعادة الترميز.

ضع المنظومة على خادم دائم

بمجرد أن ينجح سير العمل على مجموعة اختبار صغيرة، انقله إلى Linux VPS من Cloudzy ، كي تبقى التنزيلات المجدولة ومكتبة الوسائط لديك متصلة من دون أن تشغل حاسوبك اليومي. ويمكنك أيضًا نشر Jellyfin كتطبيق بنقرة واحدة وتوجيه مكتبته إلى مجلد إخراج yt-dlp.

عرض باقات Linux

ابنِ على خادم Linux VPS بوصول root وتخزين NVMe وقوة AMD EPYC.

عرض باقات Linux

الأسئلة الشائعة

هل يحتاج yt-dlp إلى معالج رسوميات على الـ VPS؟

لا. يستطيع yt-dlp تنزيل الوسائط وإعادة تغليفها من دون معالج رسوميات. ويصبح المعالج الرسومي مهمًا حين يضطر Jellyfin أو خادم وسائط آخر إلى إعادة ترميز الفيديو لعملاء غير متوافقين أو لاتصالات ذات نطاق أضيق؛ أما التشغيل المباشر فلا يتطلب ذلك التحويل.

هل يستطيع yt-dlp استئناف تنزيل متوقف؟

نعم. يفعّل yt-dlp افتراضيًا الملفات الجزئية والاستئناف، فتستأنف التشغيلات اللاحقة عادةً الأجزاء المنزَّلة بدل تنزيلها من جديد. ولا تضف ‎--no-continue أو ‎--no-part أو ‎--force-overwrites إن كنت تريد هذا السلوك.

هل ينبغي أن يتشارك yt-dlp وJellyfin خادم VPS واحدًا؟

يمكنهما تقاسم خادم VPS واحد حين تكفي مساحة التخزين والمعالج وحركة الخروج للمهمتين معًا. وافصلهما حين ينافس تشغيل الوسائط أو إعادة الترميز عملياتِ التنزيل الكبيرة، أو حين تحتاج نوافذ صيانة مستقلة، أو حين يكون مكان الأرشيف الأنسب تخزينًا أرخص من خادم البث.

مشاركة

المزيد من المدونة

تابع القراءة.

جاهز للنشر؟ تبدأ من 2.48 $/شهر.

سحابة مستقلة منذ 2008. AMD EPYC، NVMe، 40 Gbps. استرداد خلال 14 يومًا.