{"record":{"id":"248f20a5c6441748","repo":"ytdl-org/youtube-dl","slug":"video-s-does-not-exist","errorCode":null,"errorMessage":"Video %s does not exist","messagePattern":"Video (.+?) does not exist","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/afreecatv.py","lineNumber":277,"sourceCode":"            if flag == 'PARTIAL_ADULT':\n                self._downloader.report_warning(\n                    'In accordance with local laws and regulations, underage users are restricted from watching adult content. '\n                    'Only content suitable for all ages will be downloaded. '\n                    'Provide account credentials if you wish to download restricted content.')\n                partial_view = True\n                continue\n            elif flag == 'ADULT':\n                error = 'Only users older than 19 are able to watch this video. Provide account credentials to download this content.'\n            else:\n                error = flag\n            raise ExtractorError(\n                '%s said: %s' % (self.IE_NAME, error), expected=True)\n        else:\n            raise ExtractorError('Unable to download video info')\n\n        video_element = video_xml.findall(compat_xpath('./track/video'))[-1]\n        if video_element is None or video_element.text is None:\n            raise ExtractorError(\n                'Video %s does not exist' % video_id, expected=True)\n\n        video_url = video_element.text.strip()\n\n        title = xpath_text(video_xml, './track/title', 'title', fatal=True)\n\n        uploader = xpath_text(video_xml, './track/nickname', 'uploader')\n        uploader_id = xpath_text(video_xml, './track/bj_id', 'uploader id')\n        duration = int_or_none(xpath_text(\n            video_xml, './track/duration', 'duration'))\n        thumbnail = xpath_text(video_xml, './track/titleImage', 'thumbnail')\n\n        common_entry = {\n            'uploader': uploader,\n            'uploader_id': uploader_id,\n            'thumbnail': thumbnail,\n        }\n","sourceCodeStart":259,"sourceCodeEnd":295,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/afreecatv.py#L259-L295","documentation":"Raised after parsing AfreecaTV's video XML when the last ./track/video element is missing or its text is empty. The metadata API answered, but contains no playable video node, so the extractor declares the video nonexistent. Marked expected=True.","triggerScenarios":"video_xml.findall('./track/video') returns elements whose .text is None (or the final element is empty); replay expired so track XML retains metadata but no video file; multi-file track where the last entry is a placeholder.","commonSituations":"Expired replays that still serve a station page; audio-only or reserved tracks the API lists without media; deleted-in-progress replays.","solutions":["Verify the video still plays in a browser at the same URL","If expired, no client fix exists — the media node is genuinely absent","Try the alternate URL forms (title number vs station number) for the same broadcast"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'does not exist' in str(e):\n        mark_url_dead(url)  # track XML has no video node; permanent","preventionTips":["Verify replay availability in a browser before bulk-queuing old AfreecaTV broadcasts","Download replays within their retention window; expired tracks return metadata without media"],"tags":["afreecatv","content-missing","expired","video-info"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}