ytdlp.online

Tüm çözümler

Bu sayfada

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 webpage mesajı 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_id ile 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 bir ua medya akışı alanı içerdiği doğrulanır.
  • Sınırlı müdahale: alternatif yöntem yalnızca _download_json, durum kodu 403 olan bir HTTPError yakaladığı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. --impersonate belirtilmediğinde varsayılan olarak firefox-135 parmak 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
yt-dlp Araçları
Tüm yt-dlp araçlarını görüntüleyin
yt-dlp Yardım ve Belgeler