ytdl-org/youtube-dl · error · ExtractorError

%s said: %s

Error message

%s said: %s

What it means

Raised by the RTBF (Belgian broadcaster) auvio extractor when the JSON embedded in the embed page's data-media attribute contains a non-empty 'error' key. The message is 'RTBF said: <error text as returned by the site>'. Expected=True - the site itself reported the failure.

Source

Thrown at youtube_dl/extractor/rtbf.py:80

        'VIMEO': 'Vimeo',
    }
    _QUALITIES = [
        ('mobile', 'SD'),
        ('web', 'MD'),
        ('high', 'HD'),
    ]

    def _real_extract(self, url):
        live, media_id = re.match(self._VALID_URL, url).groups()
        embed_page = self._download_webpage(
            'https://www.rtbf.be/auvio/embed/' + ('direct' if live else 'media'),
            media_id, query={'id': media_id})
        data = self._parse_json(self._html_search_regex(
            r'data-media="([^"]+)"', embed_page, 'media data'), media_id)

        error = data.get('error')
        if error:
            raise ExtractorError('%s said: %s' % (self.IE_NAME, error), expected=True)

        provider = data.get('provider')
        if provider in self._PROVIDERS:
            return self.url_result(data['url'], self._PROVIDERS[provider])

        title = data['title']
        is_live = data.get('isLive')
        if is_live:
            title = self._live_title(title)
        height_re = r'-(\d+)p\.'
        formats = []

        m3u8_url = data.get('urlHlsAes128') or data.get('urlHls')
        if m3u8_url:
            formats.extend(self._extract_m3u8_formats(
                m3u8_url, media_id, 'mp4', m3u8_id='hls', fatal=False))

        fix_url = lambda x: x.replace('//rtbf-vod.', '//rtbf.') if '/geo/drm/' in x else x

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Read the interpolated error text from RTBF - it names the exact cause (geo-block, removed, etc.).
  2. If geo-blocked, no client-side fix exists beyond accessing it from an allowed region.
  3. Verify the media id / URL is still valid on rtbf.be.
  4. If the page plays fine in a browser, the data-media JSON moved - update youtube-dl.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if str(e).startswith('RTBF said:'):
        log_site_error(url, str(e))  # message names geo-block/expired/invalid
    else:
        raise

Prevention

When it happens

Trigger: Extracting any rtbf.be/auvio/(media|direct)/<id> URL whose embed endpoint returns JSON with an 'error' field: geo-blocked content, removed media, expired live streams, or invalid ids.

Common situations: Requesting RTBF content from outside Belgium (geo-restriction), catching a live stream after it ended, or following dead links.

Related errors


AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14). Data as JSON: /api/errors/77731f8fa0826de5. Report an issue: GitHub.