ytdl-org/youtube-dl · error · ExtractorError

Vidme said: Sorry, this video has been deleted.

Error message

Vidme said: Sorry, this video has been deleted.

What it means

Raised by the Vidme extractor when the API succeeds but response['video']['state'] == 'deleted'. The video object exists but the platform marked it deleted, so no formats would be returned. expected=True — deterministic content state, not a transient failure.

Source

Thrown at youtube_dl/extractor/vidme.py:155

        try:
            response = self._download_json(
                'https://api.vid.me/videoByUrl/%s' % video_id, video_id)
        except ExtractorError as e:
            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))

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Treat as permanent: the uploader or Vidme removed the video.
  2. Look for mirrors on other platforms; the original vid.me asset is unrecoverable.
  3. Skip vid.me links in automated archives.
  4. No code change helps — the state comes straight from the (defunct) API.
Defensive patterns

Strategy: validation

Validate before calling

state = get_nested(fetch_json('https://api.vid.me/videoByUrl/%s' % video_id), 'video', 'state')
if state == 'deleted':
    skip(video_id, 'deleted on vidme')

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if e.expected and 'has been deleted' in str(e):
        archive_dead(url)
    raise

Prevention

When it happens

Trigger: Extracting a vid.me video URL whose API payload has video.state == 'deleted' — user-deleted or moderation-removed uploads.

Common situations: Since Vidme closed in 2017, all remaining ids return deleted/absent states; users following links from old forum posts and archived pages.

Related errors


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