yt-dlp Rumble JSON 403 hatası: oynatıcı verileriyle çözüm
Yayın tarihi
Düzeltme eklentisini indir rumble_player.py
yt-dlp ile Rumble videosu indirirken Unable to download JSON metadata: HTTP Error 403: Forbidden hatası alıyorsanız bu yazıdaki uyumluluk eklentisini yükleyebilirsiniz. Rumble’ın embedJS/u3 JSON API’si 403 döndürdüğünde eklenti, aynı videonun resmi gömülü oynatıcı sayfasını (/embed/) otomatik olarak alır. Sayfaya gömülü medya verilerini çıkarır ve indirmeye devam eder.
Yerel eklenti ayarlamak veya bağlantıları elle dönüştürmek istemiyorsanız bu düzeltmenin zaten yerleşik olduğu Rumble video indiricimizi kullanabilirsiniz.
Önce 403 hatasının hangi aşamada oluştuğunu belirleyin
Rumble indirmelerinde 403 hatası üç farklı aşamada ortaya çıkabilir. Bu eklenti özellikle ikinci durumu çözer:
| Hata mesajı | Engellenen istek | Yapılacak işlem |
|---|---|---|
Unable to download webpage: HTTP Error 403 |
İzleme sayfasının HTML içeriği engellenir (bkz. issue #15089) | Resmi oEmbed API’siyle /embed/ adresini alın ve --impersonate firefox kullanın |
Unable to download JSON metadata: HTTP Error 403 |
embedJS/u3 meta veri API’si engellenir (bkz. issue #17496) |
Bu eklentiyi kullanın: /embed/ sayfasına gömülü veriler otomatik olarak alınır |
| Formatlar listelenir, ancak parça veya MP4 indirilirken 403 oluşur | CDN, medya akışı isteğini reddeder | Proxy’yi ve istek başlıklarını kontrol edin veya başka bir çözünürlükteki formatı seçin |
Hızlı çözüm adımları
1. Eklenti dosyasını kaydedin
Çalışma dizininizde aşağıdaki klasör yapısını oluşturun ve yazının sonundaki tam eklenti kodunu rumble_player.py adıyla kaydedin. yt-dlp kaynak kodunu değiştirmeniz gerekmez:
plugins/
└── rumble/
└── yt_dlp_plugins/
└── extractor/
└── rumble_player.py
2. Videonun resmi /embed/ adresini alın
Rumble izleme sayfasının URL’sindeki kimlik, örneğin v6xxxx, gömülü oynatıcının kimliğiyle, örneğin vb0ofn, aynı değildir. Bu nedenle oynatıcı adresini elle birleştirerek oluşturamazsınız. Elinizde yalnızca normal izleme bağlantısı varsa gerçek /embed/ adresini Rumble’ın herkese açık resmi oEmbed API’sinden alın:
curl -fsSG --data-urlencode "url=https://rumble.com/your-video.html" "https://rumble.com/api/Media/oembed.json"
JSON yanıtının html alanında <iframe src="https://rumble.com/embed/xxxx/..." bölümünü bulun ve içindeki https://rumble.com/embed/xxxx/ adresini alın.
oEmbed 403 hatası döndürürse curl_cffi paketini kurup Firefox parmak iziyle tekrar deneyin. Aşağıdaki örnek URL’yi video sayfasının tam URL’siyle değiştirin.
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"
Yeniden deneme başarısız olursa bağlantıyı otomatik dönüştürmek için çevrimiçi indirme aracını kullanın.
3. Formatları listeleyin ve alternatif yöntemi kontrol edin
Aşağıdaki komutu plugins klasörünü içeren dizinde çalıştırın. Örnek URL’yi hedef videonun /embed/ adresiyle değiştirin:
yt-dlp --ignore-config --plugin-dirs ./plugins --no-cache-dir -v -F "https://rumble.com/embed/vb0ofn/"
Günlükte [RumbleEmbed+PlayerFallback] görünmesi eklentinin yüklendiğini gösterir:
- JSON API’si 403 döndürürse ardından
Downloading player webpagemesajı görünür. Bu mesaj yalnızca alternatif veri alma yönteminin devreye girdiğini gösterir. Verilerin başarıyla ayrıştırıldığı ancak sonrasında format listesinin görüntülenmesiyle doğrulanır. - JSON API’si mevcut ağınızdan doğrudan 200 döndürürse normal işlem akışı kullanılır. Oynatıcı sayfasına ek bir istek gönderilmez.
4. Videoyu indirin ve kod çözmeyi doğrulayın
-F çıktısından mp4-360p gibi bir format kimliği seçerek indirmeyi başlatın:
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/"
Alternatif yöntemin devreye girdiği testte kaydedilen tam terminal günlüğü:
[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
İndirilen MP4 kapsayıcısının ve ses ile video akışlarının eksiksiz ve hatasız olduğunu kontrol etmek için ffprobe ve ffmpeg kullanabilirsiniz:
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 -
Teknik açıklama: oynatıcı sayfası JSON 403 hatasını nasıl aşar?
1. Aynı kaynaktaki gömülü verileri yeniden kullanma
RumbleEmbedIE, varsayılan olarak JSON meta verilerini doğrudan https://rumble.com/embedJS/u3/?request=video&ver=2&v=... adresinden ister. Cloudflare veya sitenin koruma mekanizmaları özellikle bu API’yi engelleyip HTTP 403 döndürürse veri çıkarma işlemi durur.
Ancak resmi oynatıcı sayfasının (https://rumble.com/embed/<video_id>/) betiğinde aynı yapıya sahip bir video yapılandırma nesnesi zaten gömülüdür. Bu nesne, farklı çözünürlüklerdeki akış adreslerini içeren ua alanını, başlığı, süreyi ve diğer alanları barındırır. Nesne çıkarılıp _download_json metoduna döndürüldüğünde yt-dlp’nin sonraki format ayrıştırma kodu değiştirilmeden çalışmaya devam eder.
2. Standart JSON’a uymayan loaded: h() alanını kaldırma
Sayfaya gömülü nesne geçerli bir JSON sabiti değildir. Sonunda loaded: h() işlev çağrısı bulunur; örneğin:
u.f["vb0ofn"] = {"ua": {"mp4": {"360": {"url": "https://..."}}}, "title": "...", loaded: h()};
Nesne doğrudan JSON ayrıştırıcısına verilirse h() nedeniyle sözdizimi hatası oluşur. Eklenti bu yüzden _search_json içindeki transform_source kancasını kullanarak ayrıştırmadan önce yalnızca sondaki , loaded: xxx() kısmını düzenli ifadeyle kaldırır. İşlem tamamen bellekteki metin üzerinde yapılır; sayfanın JavaScript kodu çalıştırılmaz:
- Tam eşleşme: yalnızca anahtarı mevcut
video_idile tam olarak eşleşen nesne çıkarılır (\b[\w$]+\.f\[\s*["']{video_id}["']\s*\]\s*=). Sonucun bir sözlük olduğu ve boş olmayan biruamedya akışı alanı içerdiği doğrulanır. - Sınırlı müdahale: alternatif yöntem yalnızca
_download_json, durum kodu403olan birHTTPErroryakaladığında çalışır. 401, 404, 429, 500 ve diğer hatalarda veya sayfada geçerli bir nesne bulunmadığında özgün istisna değiştirilmeden yeniden yükseltilir. - Çevrimiçi hizmetimizdeki kullanım: hizmetimiz, eklentiyi yüklemenin yanı sıra girilen izleme sayfası URL’lerini oEmbed üzerinden otomatik olarak
/embed/adreslerine dönüştürür.--impersonatebelirtilmediğinde varsayılan olarakfirefox-135parmak izini kullanır.
Tam eklenti kodu
Aşağıdaki kodu plugins/rumble/yt_dlp_plugins/extractor/rumble_player.py dosyasına kaydedin. Kod, Python 3.12+ ve yt-dlp 2026.10.10+ ile doğrulanmıştır:
"""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