{"record":{"id":"b794b70a5ef54288","repo":"ytdl-org/youtube-dl","slug":"that-clip-does-not-exist","errorCode":null,"errorMessage":"That clip does not exist.","messagePattern":"That clip does not exist\\.","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/medaltv.py","lineNumber":106,"sourceCode":"        for k, v in clip.items():\n            if not (v and isinstance(v, compat_str)):\n                continue\n            mobj = re.match(r'(contentUrl|thumbnail)(?:(\\d+)p)?$', k)\n            if not mobj:\n                continue\n            prefix = mobj.group(1)\n            height = int_or_none(mobj.group(2))\n            if prefix == 'contentUrl':\n                add_item(\n                    formats, v, height or source_height,\n                    item_id=None if height else 'source')\n            elif prefix == 'thumbnail':\n                add_item(thumbnails, v, height, 'id')\n\n        error = clip.get('error')\n        if not formats and error:\n            if error == 404:\n                raise ExtractorError(\n                    'That clip does not exist.',\n                    expected=True, video_id=video_id)\n            else:\n                raise ExtractorError(\n                    'An unknown error occurred ({0}).'.format(error),\n                    video_id=video_id)\n\n        self._sort_formats(formats)\n\n        # Necessary because the id of the author is not known in advance.\n        # Won't raise an issue if no profile can be found as this is optional.\n        author = try_get(\n            hydration_data, lambda x: list(x['profiles'].values())[0], dict) or {}\n        author_id = str_or_none(author.get('id'))\n        author_url = 'https://medal.tv/users/{0}'.format(author_id) if author_id else None\n\n        return {\n            'id': video_id,","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/medaltv.py#L88-L124","documentation":"Raised by the Medal.tv extractor when no playable formats were collected AND the clip data carries error == 404 — i.e. the site itself reports the clip as gone. Expected=True makes it a clean user-facing 'not found' signal. It only fires when both conditions hold; a 404 error field with surviving formats would not raise.","triggerScenarios":"hydration_data clips entry for the video id exists but contains error: 404 and no contentUrl/thumbnail entries that would have produced formats via add_item.","commonSituations":"Clip deleted by its author or removed by moderation; clip URL shared with a mangled id; clip made private (sometimes surfaced as 404 rather than a permission error).","solutions":["Verify the clip URL in a browser; a deleted clip shows Medal's own not-found page.","Obtain the canonical URL from the author's profile page, since share links can rot.","No client-side workaround exists for removed content; pick another source for the media."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"def medal_clip_is_404(clip):\n    return isinstance(clip, dict) and clip.get('error') == 404","tryCatchPattern":"try:\n    info = ydl.extract_info(url, download=False)\nexcept ExtractorError as e:\n    if 'That clip does not exist' in str(e):\n        mark_permanently_dead(url)  # never retry; content is removed\n    else:\n        raise","preventionTips":["Collect clip URLs from the author's profile page rather than third-party shares.","Classify 404s as permanent failures in batch tooling to avoid wasted retries."],"tags":["not-found","clip","expected-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}