{"record":{"id":"7cc2e544a3f3514c","repo":"ytdl-org/youtube-dl","slug":"vidme-said-sorry-this-video-has-been-deleted","errorCode":null,"errorMessage":"Vidme said: Sorry, this video has been deleted.","messagePattern":"Vidme said: Sorry, this video has been deleted\\.","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/vidme.py","lineNumber":155,"sourceCode":"\n        try:\n            response = self._download_json(\n                'https://api.vid.me/videoByUrl/%s' % video_id, video_id)\n        except ExtractorError as e:\n            if isinstance(e.cause, compat_HTTPError) and e.cause.code == 400:\n                response = self._parse_json(e.cause.read(), video_id)\n            else:\n                raise\n\n        error = response.get('error')\n        if error:\n            raise ExtractorError(\n                '%s returned error: %s' % (self.IE_NAME, error), expected=True)\n\n        video = response['video']\n\n        if video.get('state') == 'deleted':\n            raise ExtractorError(\n                'Vidme said: Sorry, this video has been deleted.',\n                expected=True)\n\n        if video.get('state') in ('user-disabled', 'suspended'):\n            raise ExtractorError(\n                'Vidme said: This video has been suspended either due to a copyright claim, '\n                'or for violating the terms of use.',\n                expected=True)\n\n        formats = []\n        for f in video.get('formats', []):\n            format_url = url_or_none(f.get('uri'))\n            if not format_url:\n                continue\n            format_type = f.get('type')\n            if format_type == 'dash':\n                formats.extend(self._extract_mpd_formats(\n                    format_url, video_id, mpd_id='dash', fatal=False))","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/vidme.py#L137-L173","documentation":"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.","triggerScenarios":"Extracting a vid.me video URL whose API payload has video.state == 'deleted' — user-deleted or moderation-removed uploads.","commonSituations":"Since Vidme closed in 2017, all remaining ids return deleted/absent states; users following links from old forum posts and archived pages.","solutions":["Treat as permanent: the uploader or Vidme removed the video.","Look for mirrors on other platforms; the original vid.me asset is unrecoverable.","Skip vid.me links in automated archives.","No code change helps — the state comes straight from the (defunct) API."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"state = get_nested(fetch_json('https://api.vid.me/videoByUrl/%s' % video_id), 'video', 'state')\nif state == 'deleted':\n    skip(video_id, 'deleted on vidme')","typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if e.expected and 'has been deleted' in str(e):\n        archive_dead(url)\n    raise","preventionTips":["Treat deleted-state errors as permanent; never requeue.","Cache video.state checks for URLs seen before.","For defunct services, domain-level dead lists beat per-URL probing."],"tags":["content-missing","service-shutdown","expected-error","api"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}