ytdlp.online
होम Tampermonkey

सभी समाधान

इस पृष्ठ पर

yt-dlp Rumble JSON 403 त्रुटि: प्लेयर के डेटा से समाधान

प्रकाशन की तारीख

सुधार प्लगइन डाउनलोड करें rumble_player.py

अगर yt-dlp से Rumble वीडियो डाउनलोड करते समय Unable to download JSON metadata: HTTP Error 403: Forbidden दिखाई देता है, तो इस लेख का संगतता प्लगइन लोड कर सकते हैं। जब Rumble का embedJS/u3 JSON API 403 लौटाता है, तो प्लगइन उसी वीडियो के आधिकारिक एम्बेडेड प्लेयर का पेज (/embed/) अपने आप प्राप्त करता है। वह पेज में मौजूद मीडिया डेटा निकालकर डाउनलोड जारी रखता है।

अगर आप अपने कंप्यूटर पर प्लगइन सेट नहीं करना चाहते या लिंक को हाथ से बदलना नहीं चाहते, तो हमारा Rumble वीडियो डाउनलोडर इस्तेमाल कर सकते हैं। यह समाधान उसमें पहले से शामिल है।

पहले पहचानें कि 403 किस चरण में आ रहा है

Rumble से डाउनलोड करते समय 403 त्रुटि तीन अलग-अलग चरणों में आ सकती है। यह प्लगइन खास तौर पर दूसरी स्थिति को ठीक करता है:

त्रुटि संदेश कहाँ अनुरोध रोका गया क्या करें
Unable to download webpage: HTTP Error 403 वीडियो देखने वाले पेज का HTML रोका गया (देखें issue #15089) आधिकारिक oEmbed API से /embed/ पता प्राप्त करें और --impersonate firefox इस्तेमाल करें
Unable to download JSON metadata: HTTP Error 403 embedJS/u3 मेटाडेटा API रोका गया (देखें issue #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, से अलग होती है। इसलिए सामान्य URL के हिस्से जोड़कर सीधे प्लेयर का पता नहीं बना सकते। अगर आपके पास केवल सामान्य वीडियो लिंक है, तो Rumble के सार्वजनिक आधिकारिक oEmbed API से सही /embed/ पता प्राप्त करें:

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 की जगह वीडियो पेज का पूरा 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 फ़ोल्डर है। उदाहरण वाले URL को अपने वीडियो के /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 को 403 स्टेटस वाला HTTPError मिलता है। 401, 404, 429, 500 या अन्य त्रुटियों पर, और पेज में मान्य ऑब्जेक्ट न मिलने पर, मूल अपवाद बिना बदलाव के फिर उठाया जाता है।
  • हमारी ऑनलाइन सेवा में उपयोग: प्लगइन लोड करने के साथ-साथ हमारी सेवा वीडियो देखने वाले URL को oEmbed के ज़रिए अपने आप /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
yt-dlp उपकरण
सभी yt-dlp टूल देखें
yt-dlp सहायता और दस्तावेज़