yt-dlp میں Rumble کا 403 ایرر: پلیئر کے ڈیٹا سے حل
اشاعت کی تاریخ
اصلاحی پلگ ان ڈاؤن لوڈ کریں rumble_player.py
اگر yt-dlp سے Rumble کی ویڈیو ڈاؤن لوڈ کرتے وقت Unable to download JSON metadata: HTTP Error 403: Forbidden آئے، تو اس مضمون میں دیا گیا مطابقت کا پلگ ان لوڈ کریں۔ جب Rumble کی JSON API، embedJS/u3، 403 لوٹاتی ہے تو پلگ ان اسی ویڈیو کے سرکاری ایمبیڈ پلیئر کا صفحہ (/embed/) خودکار طور پر حاصل کرتا ہے۔ پھر اس میں موجود میڈیا ڈیٹا نکال کر ڈاؤن لوڈ جاری رکھتا ہے۔
اگر آپ اپنے کمپیوٹر پر پلگ ان ترتیب نہیں دینا چاہتے یا لنکس کو دستی طور پر تبدیل نہیں کرنا چاہتے، تو ہمارا Rumble ویڈیو ڈاؤن لوڈر استعمال کریں۔ یہ حل اس میں پہلے سے شامل ہے۔
پہلے دیکھیں کہ 403 کس مرحلے پر آتا ہے
Rumble سے ڈاؤن لوڈ کے دوران 403 تین الگ مراحل پر آ سکتا ہے۔ یہ پلگ ان خاص طور پر دوسری صورت کے لیے ہے:
| ایرر کا پیغام | درخواست کہاں رکتی ہے | کیا کریں |
|---|---|---|
Unable to download webpage: HTTP Error 403 |
ویڈیو دیکھنے والے صفحے کا HTML بلاک ہوتا ہے؛ ایشو #15089 دیکھیں | سرکاری oEmbed API سے /embed/ کا پتہ حاصل کریں اور ساتھ --impersonate firefox استعمال کریں |
Unable to download JSON metadata: HTTP Error 403 |
میٹاڈیٹا کی embedJS/u3 API بلاک ہوتی ہے؛ ایشو #17496 دیکھیں |
اس مضمون کا پلگ ان استعمال کریں: یہ خودکار طور پر /embed/ صفحے میں موجود ڈیٹا پڑھتا ہے |
| فارمیٹس کی فہرست آ جاتی ہے، لیکن ویڈیو کے حصے یا MP4 ڈاؤن لوڈ کرتے وقت 403 آتا ہے | CDN میڈیا اسٹریم کی درخواست مسترد کرتی ہے | پراکسی اور درخواست کے ہیڈرز دیکھیں، یا دوسری کوالٹی کا فارمیٹ منتخب کریں |
مسئلہ حل کرنے کے مراحل
1. پلگ ان کی فائل محفوظ کریں
اپنی ورکنگ ڈائریکٹری میں نیچے دی گئی ترتیب سے فولڈرز بنائیں اور پلگ ان کا مکمل کوڈ rumble_player.py کے نام سے محفوظ کریں۔ yt-dlp کے سورس کوڈ میں تبدیلی ضروری نہیں:
plugins/
└── rumble/
└── yt_dlp_plugins/
└── extractor/
└── rumble_player.py
2. ویڈیو کا سرکاری /embed/ پتہ حاصل کریں
Rumble کے ویڈیو صفحے کے URL میں موجود آئی ڈی، مثلاً v6xxxx، اور ایمبیڈ پلیئر کی آئی ڈی، مثلاً vb0ofn، ایک جیسی نہیں ہوتیں۔ اسی لیے ایک ہی آئی ڈی سے پتہ خود بنانا درست نہیں۔ اگر آپ کے پاس صرف عام ویڈیو صفحے کا لنک ہے، تو اصل /embed/ پتہ حاصل کرنے کے لیے Rumble کی سرکاری، عوامی oEmbed API استعمال کریں:
curl -fsSG --data-urlencode "url=https://rumble.com/your-video.html" "https://rumble.com/api/Media/oembed.json"
واپس آنے والے JSON کے html فیلڈ میں <iframe src="https://rumble.com/embed/xxxx/..." تلاش کریں اور اس میں سے https://rumble.com/embed/xxxx/ لے لیں۔
اگر oEmbed سے 403 کی خرابی آئے تو curl_cffi انسٹال کریں اور Firefox کے فنگر پرنٹ کے ساتھ دوبارہ کوشش کریں۔ نیچے دیے گئے نمونے میں ویڈیو کے صفحے کا پورا URL درج کریں۔
python -m pip install curl_cffi
python -c "import sys; from curl_cffi import requests; r = requests.get('https://rumble.com/api/Media/oembed.json', params=dict(url=sys.argv[1]), impersonate='firefox', timeout=15); r.raise_for_status(); print(r.text)" "https://rumble.com/your-video.html"
اگر دوبارہ کوشش بھی ناکام رہے تو لنک خودکار طور پر تبدیل کرنے کے لیے آن لائن ڈاؤن لوڈر استعمال کریں۔
3. فارمیٹس کی فہرست اور متبادل راستہ چیک کریں
اس ڈائریکٹری میں کمانڈ چلائیں جس کے اندر plugins فولڈر ہے۔ مثال کے پتے کو اپنی مطلوبہ ویڈیو کے /embed/ پتے سے بدل دیں:
yt-dlp --ignore-config --plugin-dirs ./plugins --no-cache-dir -v -F "https://rumble.com/embed/vb0ofn/"
لاگ میں [RumbleEmbed+PlayerFallback] آنے کا مطلب ہے کہ پلگ ان لوڈ ہو گیا ہے:
- اگر JSON API سے 403 ملے، تو اس کے بعد
Downloading player webpageنظر آئے گا۔ یہ صرف بتاتا ہے کہ متبادل راستہ شروع ہو گیا ہے۔ اس کے بعد فارمیٹس کی فہرست ظاہر ہونے پر ہی ڈیٹا کی کامیاب پارسنگ کی تصدیق ہوتی ہے۔ - اگر آپ کے موجودہ نیٹ ورک پر JSON API خود 200 لوٹائے، تو اصل طریقہ ہی استعمال ہوتا ہے اور پلیئر کے صفحے کی اضافی درخواست نہیں بھیجی جاتی۔
4. ویڈیو ڈاؤن لوڈ کریں اور ڈی کوڈنگ چیک کریں
-F کی فہرست میں سے کوئی فارمیٹ آئی ڈی، مثلاً mp4-360p، منتخب کر کے ڈاؤن لوڈ کریں:
yt-dlp --ignore-config --plugin-dirs ./plugins --no-cache-dir -v --no-playlist -f mp4-360p -o "rumble-test.%(ext)s" "https://rumble.com/embed/vb0ofn/"
جس ٹیسٹ میں متبادل راستہ چلا، اس کے ٹرمینل لاگ میں یہ نتیجہ آیا:
[RumbleEmbed+PlayerFallback] vb0ofn: Downloading JSON metadata
[RumbleEmbed+PlayerFallback] vb0ofn: Downloading player webpage
[info] vb0ofn: Downloading 1 format(s): mp4-360p
[download] 100% of 7.85MiB in 00:01:20 at 99.48KiB/s
ڈاؤن لوڈ شدہ MP4 کنٹینر اور آڈیو و ویڈیو اسٹریمز کی درستگی اور مکمل ہونے کو چیک کرنے کے لیے ffprobe اور ffmpeg استعمال کریں:
ffprobe -v error -show_entries stream=codec_name,codec_type,width,height:format=duration,size -of json "rumble-test.mp4"
ffmpeg -nostdin -v error -xerror -i "rumble-test.mp4" -map 0:v:0 -map "0:a:0?" -f null -
پلیئر کا صفحہ JSON کے 403 کے بعد ڈاؤن لوڈ کیسے جاری رکھتا ہے؟
1. سرکاری صفحے میں موجود ڈیٹا دوبارہ استعمال کرنا
RumbleEmbedIE عام طور پر JSON میٹاڈیٹا لینے کے لیے براہ راست https://rumble.com/embedJS/u3/?request=video&ver=2&v=... پر درخواست بھیجتا ہے۔ اگر Cloudflare یا سائٹ کا حفاظتی نظام خاص طور پر اس API کو بلاک کر کے HTTP 403 لوٹائے، تو ڈیٹا نکالنے کا عمل رک جاتا ہے۔
لیکن سرکاری ایمبیڈ صفحے https://rumble.com/embed/<video_id>/ کے اسکرپٹس میں ویڈیو کی ترتیب کا ایک آبجیکٹ پہلے سے موجود ہوتا ہے جس کی ساخت بالکل وہی ہے۔ اس میں مختلف کوالٹی کی اسٹریمز کے پتے رکھنے والا ua فیلڈ، عنوان، دورانیہ اور دیگر فیلڈز شامل ہیں۔ اس آبجیکٹ کو نکال کر _download_json سے واپس کر دیا جائے تو yt-dlp کا اگلا فارمیٹ پارسنگ کوڈ بغیر کسی تبدیلی کے کام جاری رکھ سکتا ہے۔
2. JSON کے لیے ناموزوں فیلڈ ہٹانا (loaded: h())
صفحے میں شامل ڈیٹا آبجیکٹ مکمل طور پر درست JSON لٹرل نہیں ہے۔ اس کے آخر میں رن ٹائم فنکشن کال loaded: h() موجود ہے، جیسا کہ اس مثال میں:
u.f["vb0ofn"] = {"ua": {"mp4": {"360": {"url": "https://..."}}}, "title": "...", loaded: h()};
اسے براہ راست JSON پارسر کو دینے سے h() کی وجہ سے سنٹیکس ایرر آتا ہے۔ اس لیے پلگ ان _search_json کے transform_source آپشن کے ذریعے پارسنگ سے ذرا پہلے صرف آخر کا , loaded: xxx() حصہ ریگولر ایکسپریشن سے ہٹاتا ہے۔ یہ پورا عمل میموری میں متن پر ہوتا ہے؛ صفحے کا کوئی JavaScript نہیں چلایا جاتا:
- درست میچ: صرف وہ آبجیکٹ نکالا جاتا ہے جس کی کلید موجودہ
video_idکے عین برابر ہو (\b[\w$]+\.f\[\s*["']{video_id}["']\s*\]\s*=)۔ پھر چیک ہوتا ہے کہ نتیجہ ایک ڈکشنری ہے اور اس میں میڈیا کاuaفیلڈ خالی نہیں۔ - محدود مداخلت: متبادل راستہ صرف اس وقت چلتا ہے جب
_download_jsonکوHTTPErrorملے جس کا اسٹیٹس403ہو۔ 401، 404، 429، 500 جیسے دوسرے ایررز، یا صفحے میں درست آبجیکٹ نہ ملنے پر، اصل استثنا جوں کا توں دوبارہ اٹھایا جاتا ہے۔ - ہماری سروس میں استعمال: پلگ ان لوڈ کرنے کے ساتھ ہماری آن لائن سروس oEmbed API سے عام ویڈیو صفحے کے لنک کو
/embed/پتے میں بدلتی ہے۔ اگر--impersonateنہ دیا گیا ہو، تو وہ بطور ڈیفالٹfirefox-135کا براؤزر فنگرپرنٹ استعمال کرتی ہے۔
پلگ ان کا مکمل کوڈ
یہ کوڈ plugins/rumble/yt_dlp_plugins/extractor/rumble_player.py میں محفوظ کریں۔ اسے Python 3.12+ اور yt-dlp 2026.10.10+ کے ساتھ کامیابی سے جانچا گیا ہے:
"""Reuse official player media data when Rumble's JSON endpoint is blocked."""
import re
from yt_dlp.extractor.rumble import RumbleEmbedIE as BaseRumbleEmbedIE
from yt_dlp.networking.exceptions import HTTPError
from yt_dlp.utils import ExtractorError
class RumbleEmbedIE(BaseRumbleEmbedIE, plugin_name='PlayerFallback'):
def _real_extract(self, url):
self._player_url = url
return super()._real_extract(url)
def _download_json(self, url_or_request, video_id, *args, **kwargs):
try:
return super()._download_json(url_or_request, video_id, *args, **kwargs)
except ExtractorError as error:
if not isinstance(error.cause, HTTPError) or error.cause.status != 403:
raise
webpage = self._download_webpage(self._player_url, video_id, note='Downloading player webpage')
# Parse this video's object and strip the runtime call without executing page scripts.
data = self._search_json(
rf'''\b[\w$]+\.f\[\s*["']{re.escape(video_id)}["']\s*\]\s*=\s*''',
webpage, 'player data', video_id,
fatal=False,
transform_source=lambda source: re.sub(r',\s*loaded\s*:\s*[\w$]+\(\s*\)\s*(?=})', '', source))
if not isinstance(data, dict) or not data.get('ua'):
raise error
return data