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

  1. The video is unavailable by enforcement decision — no download is possible.
  2. Find a legal mirror or the original source of the content.
  3. Filter vid.me URLs out of crawlers/download queues.
  4. 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

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


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