ytdl-org/youtube-dl · error · ExtractorError

%s said: %s

Error message

%s said: %s

What it means

Raised by the RUTV (Russian TV) extractor when the player JSON from player.rutv.ru/iframe/data.../id/<id> has a non-empty top-level 'errors' list. Message: 'RUTV said: <errors payload>'. Expected=True. This is the first of two error checks - the outer API call itself failed before any playlist data is read.

Source

Thrown at youtube_dl/extractor/rutv.py:147

        video_path = mobj.group('path')

        if re.match(r'flash\d+v', video_path):
            video_type = 'video'
        elif video_path.startswith('iframe'):
            video_type = mobj.group('type')
            if video_type == 'swf':
                video_type = 'video'
        elif video_path.startswith('index/iframe/cast_id'):
            video_type = 'live'

        is_live = video_type == 'live'

        json_data = self._download_json(
            'http://player.rutv.ru/iframe/data%s/id/%s' % ('live' if is_live else 'video', video_id),
            video_id, 'Downloading JSON')

        if json_data['errors']:
            raise ExtractorError('%s said: %s' % (self.IE_NAME, json_data['errors']), expected=True)

        playlist = json_data['data']['playlist']
        medialist = playlist['medialist']
        media = medialist[0]

        if media['errors']:
            raise ExtractorError('%s said: %s' % (self.IE_NAME, media['errors']), expected=True)

        view_count = playlist.get('count_views')
        priority_transport = playlist['priority_transport']

        thumbnail = media['picture']
        width = int_or_none(media['width'])
        height = int_or_none(media['height'])
        description = media['anons']
        title = media['title']
        duration = int_or_none(media.get('duration'))

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Read the interpolated errors payload - it names the exact server-side reason.
  2. Verify the id against the current site; RUTV content largely moved to vgtrk/smotrim players - find the new URL.
  3. Drop dead ids from playlists.
  4. If content plays in a browser, the endpoint/JSON shape changed - update youtube-dl.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if str(e).startswith('RUTV said:'):
        log(e)  # outer API errors: invalid id / geo / ended stream
    else:
        raise

Prevention

When it happens

Trigger: Extracting a rutv.ru (or rtr-vesti.ru) video/live id for which the iframe data endpoint returns errors: invalid id, expired live stream, geo-blocked content.

Common situations: Following old rutv.ru links after the service was reorganized into smotrim.ru; catching a live stream outside its broadcast window; regional restrictions.

Related errors


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