ytdl-org/youtube-dl · error · ExtractorError

%s said: %s

Error message

%s said: %s

What it means

Raised by VimeoIE._real_extract when the legacy vimeo_config blob contains seed_status.state == 'failed'; the video's transcode/processing pipeline failed on Vimeo's side and its own title for the failure is propagated. expected=True — the site reports the video is unplayable, no formats exist.

Source

Thrown at youtube_dl/extractor/vimeo.py:695

                r'\b(?:playerC|c)onfig\s*=', webpage, 'info section', video_id)
            if config.get('view') == 4:
                config = self._verify_player_video_password(
                    redirect_url, video_id, headers)
            info = self._parse_config(config, video_id)
            self._vimeo_sort_formats(info['formats'])
            return info

        if re.search(r'<form[^>]+?id="pw_form"', webpage):
            video_password = self._get_video_password()
            token, vuid = self._extract_xsrft_and_vuid(webpage)
            webpage = self._verify_video_password(
                redirect_url, video_id, video_password, token, vuid)

        vimeo_config = self._extract_vimeo_config(webpage, video_id, default=None)
        if vimeo_config:
            seed_status = vimeo_config.get('seed_status') or {}
            if seed_status.get('state') == 'failed':
                raise ExtractorError(
                    '%s said: %s' % (self.IE_NAME, seed_status['title']),
                    expected=True)

        cc_license = None
        timestamp = None
        video_description = None
        info_dict = {}

        channel_id = self._search_regex(
            r'vimeo\.com/channels/([^/]+)', url, 'channel id', default=None)
        if channel_id:
            config_url = self._html_search_regex(
                r'\bdata-config-url="([^"]+)"', webpage, 'config URL')
            video_description = clean_html(get_element_by_class('description', webpage))
            info_dict.update({
                'channel_id': channel_id,
                'channel_url': 'https://vimeo.com/channels/' + channel_id,
            })

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Open the video on vimeo.com in a browser — if it also will not play, the asset is broken site-wide; only the uploader can fix it (re-upload).
  2. If you are the owner, re-upload or trigger a re-transcode from the video settings.
  3. Read the propagated title text — Vimeo states the specific failure (e.g. processing error).
  4. Handle as terminal in download queues; retrying yields the same state.
Defensive patterns

Strategy: try-catch

Validate before calling

config = extract_vimeo_config(fetch(url))
state = ((config or {}).get('seed_status') or {}).get('state')
if state == 'failed':
    skip(url, 'vimeo reports failed processing')

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if e.expected and 'said:' in str(e) and 'failed' in getattr(e, 'orig_msg', ''):
        log_skip(url, str(e))  # Vimeo-side transcode failure: permanent for viewers
    else:
        raise

Prevention

When it happens

Trigger: Extracting a Vimeo URL whose embedded config JSON has seed_status = {'state': 'failed', 'title': ...} — typically a video stuck in failed processing after upload, or a retroactively broken transcode.

Common situations: Uploader's video stuck at 'Processing' then failed; Vimeo re-encoding breaking old assets; rare vs the API path — this only triggers on pages still serving the legacy vimeo_config markup.

Related errors


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