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
- 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).
- If you are the owner, re-upload or trigger a re-transcode from the video settings.
- Read the propagated title text — Vimeo states the specific failure (e.g. processing error).
- 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
- Verify the video plays in a browser before escalating extractor failures.
- If you are the owner, re-upload assets whose processing failed.
- Propagate the site's failure title to users so they can distinguish upstream breakage from downloader bugs.
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
- Video %s has been removed
- Video %s is no longer available
- Wrong video password
- Cannot download embed-only video without embedding URL. Plea
- %s said: %s
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/047ed569c7124a44.
Report an issue: GitHub.