ytdl-org/youtube-dl · error · ExtractorError
Vidme said: This video has been suspended either due to a co
Error message
Vidme said: This video has been suspended either due to a copyright claim, or for violating the terms of use.
What it means
Raised by the Vidme extractor when response['video']['state'] is 'user-disabled' or 'suspended' — the uploader disabled the video or Vidme suspended it for a copyright claim / ToS violation. The long message spells out both causes. expected=True, terminal content state.
Source
Thrown at youtube_dl/extractor/vidme.py:160
if isinstance(e.cause, compat_HTTPError) and e.cause.code == 400:
response = self._parse_json(e.cause.read(), video_id)
else:
raise
error = response.get('error')
if error:
raise ExtractorError(
'%s returned error: %s' % (self.IE_NAME, error), expected=True)
video = response['video']
if video.get('state') == 'deleted':
raise ExtractorError(
'Vidme said: Sorry, this video has been deleted.',
expected=True)
if video.get('state') in ('user-disabled', 'suspended'):
raise ExtractorError(
'Vidme said: This video has been suspended either due to a copyright claim, '
'or for violating the terms of use.',
expected=True)
formats = []
for f in video.get('formats', []):
format_url = url_or_none(f.get('uri'))
if not format_url:
continue
format_type = f.get('type')
if format_type == 'dash':
formats.extend(self._extract_mpd_formats(
format_url, video_id, mpd_id='dash', fatal=False))
elif format_type == 'hls':
formats.extend(self._extract_m3u8_formats(
format_url, video_id, 'mp4', entry_protocol='m3u8_native',
m3u8_id='hls', fatal=False))
else:View on GitHub (pinned to 956b8c5855)
Solutions
- The video is unavailable by enforcement decision — no download is possible.
- Find a legal mirror or the original source of the content.
- Filter vid.me URLs out of crawlers/download queues.
- Report the skip reason to the user as a copyright/enforcement removal, not a bug.
Defensive patterns
Strategy: try-catch
Validate before calling
state = get_nested(fetch_json(api_url), 'video', 'state')
if state in ('user-disabled', 'suspended'):
skip(video_id, 'vidme enforcement removal: %s' % state) Try / catch
try:
ydl.extract_info(url)
except ExtractorError as e:
if e.expected and 'suspended' in str(e):
archive_dead(url) # copyright/ToS removal: permanent, do not alert
raise Prevention
- Report copyright/enforcement removals as skips, not errors, in monitoring.
- Never retry enforcement-based removals.
- Maintain per-URL outcome caches for large archives.
When it happens
Trigger: Extracting a vid.me URL whose API payload has video.state in ('user-disabled', 'suspended') — DMCA'd uploads or uploader-disabled content.
Common situations: Copyright-claimed music uploads (the classic Vidme case); accounts suspended wholesale before the service shut down; legacy links in comments/articles.
Related errors
- Vidme said: Sorry, this video has been deleted.
- This video is not available from your country.
- no video on the webpage
- %s returned error: %s
- Video %s has been removed
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/aa4343940a665af0.
Report an issue: GitHub.