Rumble 403 sa yt-dlp: fallback gamit ang datos ng player
Petsa ng paglalathala
I-download ang plugin na pang-ayos rumble_player.py
Kung lumalabas ang Unable to download JSON metadata: HTTP Error 403: Forbidden kapag nagda-download ka ng Rumble video gamit ang yt-dlp, maaari mong i-load ang compatibility plugin sa artikulong ito. Kapag nagbalik ng 403 ang JSON API na embedJS/u3 ng Rumble, awtomatikong kukunin ng plugin ang opisyal na embed player page (/embed/) ng parehong video. Babasahin nito ang datos ng media na nasa pahina at itutuloy ang download.
Kung ayaw mong mag-configure ng plugin sa iyong computer o manu-manong mag-convert ng mga link, gamitin ang aming Rumble video downloader, na may kasama nang solusyong ito.
Alamin muna kung saang hakbang lumalabas ang 403
Maaaring lumabas ang 403 sa tatlong magkakaibang yugto ng pag-download mula sa Rumble. Para mismo sa ikalawang kaso ang plugin na ito:
| Mensahe ng error | Saan nahaharang ang request | Ano ang gagawin |
|---|---|---|
Unable to download webpage: HTTP Error 403 |
Nahaharang ang HTML ng pahina kung saan pinapanood ang video; tingnan ang issue #15089 | Kunin ang /embed/ address gamit ang opisyal na oEmbed API at gamitin ang --impersonate firefox |
Unable to download JSON metadata: HTTP Error 403 |
Nahaharang ang metadata API na embedJS/u3; tingnan ang issue #17496 |
Gamitin ang plugin sa artikulong ito para awtomatikong bumasa ng datos mula sa pahinang /embed/ |
| Nakalista na ang mga format, pero may 403 kapag dina-download ang mga segment o MP4 | Tinatanggihan ng CDN ang request para sa media stream | Suriin ang proxy at mga request header, o pumili ng ibang quality format |
Mga hakbang para ayusin ang problema
1. I-save ang file ng plugin
Gawin ang sumusunod na mga folder sa iyong working directory, at i-save ang kumpletong code ng plugin bilang rumble_player.py. Hindi kailangang baguhin ang source code ng yt-dlp:
plugins/
└── rumble/
└── yt_dlp_plugins/
└── extractor/
└── rumble_player.py
2. Kunin ang opisyal na /embed/ address ng video
Magkaiba ang ID sa URL ng Rumble watch page, gaya ng v6xxxx, at ang ID ng embed player, gaya ng vb0ofn. Hindi puwedeng basta buuin nang manu-mano ang address gamit ang parehong ID. Kung karaniwang watch-page link lang ang hawak mo, tawagan ang opisyal at pampublikong oEmbed API ng Rumble para makuha ang tamang /embed/ address:
curl -fsSG --data-urlencode "url=https://rumble.com/your-video.html" "https://rumble.com/api/Media/oembed.json"
Sa html field ng ibinalik na JSON, hanapin ang <iframe src="https://rumble.com/embed/xxxx/..." at kunin ang bahaging https://rumble.com/embed/xxxx/.
Kung 403 ang ibinalik ng oEmbed, i-install ang curl_cffi at subukan ulit gamit ang Firefox fingerprint. Palitan ang halimbawang URL sa ibaba ng buong URL ng page ng video.
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"
Kung hindi pa rin gumana, gamitin ang online downloader para awtomatikong i-convert ang link.
3. Ilista ang mga format at tingnan kung gumagana ang fallback
Patakbuhin ang command sa directory na naglalaman ng folder na plugins. Palitan ang halimbawa ng /embed/ address ng video na gusto mong kunin:
yt-dlp --ignore-config --plugin-dirs ./plugins --no-cache-dir -v -F "https://rumble.com/embed/vb0ofn/"
Kapag may [RumbleEmbed+PlayerFallback] sa log, naka-load na ang plugin:
- Kung nagbalik ng 403 ang JSON API, susunod na makikita ang
Downloading player webpage. Ipinapakita nito na nagsimula na ang fallback. Kailangang lumabas pagkatapos nito ang listahan ng mga format para makumpirmang matagumpay ang pag-parse ng datos. - Kung nagbalik naman ng 200 ang JSON API sa kasalukuyan mong koneksyon, gagamitin ang orihinal na proseso nang walang karagdagang request sa player page.
4. I-download ang video at suriin ang decoding
Pumili ng format ID mula sa listahang ibinalik ng -F, gaya ng mp4-360p, at simulan ang download:
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/"
Ito ang terminal log mula sa test kung saan gumana ang fallback:
[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
Para suriin kung buo at walang sira ang na-download na MP4 container at mga audio at video stream, gamitin ang ffprobe at 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 -
Bakit nakapagpapatuloy ang player page kapag may JSON 403?
1. Paggamit muli sa datos na kasama sa opisyal na pahina
Karaniwang direktang humihingi ng JSON metadata ang RumbleEmbedIE mula sa https://rumble.com/embedJS/u3/?request=video&ver=2&v=.... Kapag partikular na hinarang ng Cloudflare o ng mga panuntunan sa seguridad ng site ang API na ito at nagbalik ng HTTP 403, hihinto ang extraction.
Pero ang mga script sa opisyal na embed page na https://rumble.com/embed/<video_id>/ ay mayroon nang video configuration object na kapareho ang istruktura. Kasama rito ang ua field na may mga stream address para sa iba't ibang kalidad, pati ang pamagat, haba ng video, at iba pang field. Kapag kinuha ang object na ito at ibinalik mula sa _download_json, makapagpapatuloy ang susunod na code ng yt-dlp para sa pag-parse ng mga format nang walang kailangang baguhin.
2. Pag-alis ng field na hindi valid sa JSON (loaded: h())
Hindi ganap na valid JSON ang data object na nasa pahina. May tawag ito sa isang runtime function sa dulo, ang loaded: h(), gaya nito:
u.f["vb0ofn"] = {"ua": {"mp4": {"360": {"url": "https://..."}}}, "title": "...", loaded: h()};
Kung direktang ipapasa ito sa JSON parser, magdudulot ng syntax error ang h(). Kaya ginagamit ng plugin ang transform_source sa _search_json upang alisin gamit ang regular expression ang dulong , loaded: xxx() lamang bago mag-parse. Sa text na nasa memory ginagawa ang lahat ng ito; walang JavaScript ng pahina na pinapatakbo:
- Eksaktong pagtutugma: ang kinukuha lang ay ang object na ang key ay eksaktong katumbas ng kasalukuyang
video_id(\b[\w$]+\.f\[\s*["']{video_id}["']\s*\]\s*=). Tinitiyak din na dictionary ang resulta at may hindi bakanteng media field naua. - Limitadong pagbabago sa proseso: gumagana lang ang fallback kapag nakahuli ang
_download_jsonngHTTPErrorna may status na403. Para sa 401, 404, 429, 500, o kapag walang valid na object sa pahina, muling ibinabato ang orihinal na exception nang walang pagbabago. - Paggamit sa aming serbisyo: bukod sa pag-load ng plugin, awtomatikong tinatawag ng aming online service ang oEmbed API para gawing
/embed/address ang karaniwang watch-page URL. Kapag walang ibinigay na--impersonate, ginagamit nito bilang default ang browser fingerprint nafirefox-135.
Kumpletong code ng plugin
I-save ang sumusunod na code bilang plugins/rumble/yt_dlp_plugins/extractor/rumble_player.py. Nasubukan na ito sa Python 3.12+ at 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