ytdl-org/youtube-dl · error · ExtractorError

%s said: %s

Error message

%s said: %s

What it means

Raised by the Laola1TvBaseIE when the config API (conf['configUrl'] queried with videoid/partnerid/language/portal) returns a JSON payload containing an 'error' key. The message embeds the extractor name and the API's error text. It is expected=True and typically indicates geo-blocking or expired/unavailable videos.

Source

Thrown at youtube_dl/extractor/laola1tv.py:146

        if 'Dieser Livestream ist bereits beendet.' in webpage:
            raise ExtractorError('This live stream has already finished.', expected=True)

        conf = self._parse_json(self._search_regex(
            r'(?s)conf\s*=\s*({.+?});', webpage, 'conf'),
            display_id,
            transform_source=lambda s: js_to_json(re.sub(r'shareurl:.+,', '', s)))
        video_id = conf['videoid']

        config = self._download_json(conf['configUrl'], video_id, query={
            'videoid': video_id,
            'partnerid': conf['partnerid'],
            'language': conf.get('language', ''),
            'portal': conf.get('portalid', ''),
        })
        error = config.get('error')
        if error:
            raise ExtractorError('%s said: %s' % (self.IE_NAME, error), expected=True)

        video_data = config['video']
        title = video_data['title']
        is_live = video_data.get('isLivestream') and video_data.get('isLive')
        meta = video_data.get('metaInformation')
        sports = meta.get('sports')
        categories = sports.split(',') if sports else []

        token_url = self._extract_token_url(
            video_data['streamAccess'], video_id,
            video_data['abo']['required'])

        formats = self._extract_formats(token_url, video_id)

        return {
            'id': video_id,
            'display_id': display_id,
            'title': self._live_title(title) if is_live else title,

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Read the embedded API message: if region-related, use a proxy in the licensed country
  2. If the video is expired, look for the VOD or highlight version on the same portal
  3. Pass cookies of an authenticated/entitled account if the error is subscription-related
  4. Update youtube-dl/yt-dlp in case the config API contract changed
Defensive patterns

Strategy: try-catch

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if ' said: ' in str(e):
        handle_by_api_message(str(e))  # geo -> proxy; expired -> find VOD
    else:
        raise

Prevention

When it happens

Trigger: Any laola1.tv page whose config endpoint response includes a non-empty 'error' field — commonly 'Video is not available in your country' style messages, or video ids removed/expired after the live window.

Common situations: Region-locked sports content accessed from the wrong country; expired broadcasts whose config entries error out; partner/portal id mismatches when the site updates its conf blob; stale video ids from old links.

Related errors


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