{"record":{"id":"42d05d56857df0b4","repo":"ytdl-org/youtube-dl","slug":"video-s-has-been-removed","errorCode":null,"errorMessage":"Video %s has been removed","messagePattern":"Video (.+?) has been removed","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/veehd.py","lineNumber":62,"sourceCode":"        'info_dict': {\n            'id': '2046729',\n            'ext': 'avi',\n            'title': '2012 (2009) DivX Trailer',\n            'description': 'md5:75435ee95255e6a9838ac6f6f3a2396b',\n            'uploader_id': 'Movie_Trailers',\n        }\n    }]\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n\n        # VeeHD seems to send garbage on the first request.\n        # See https://github.com/ytdl-org/youtube-dl/issues/2102\n        self._download_webpage(url, video_id, 'Requesting webpage')\n        webpage = self._download_webpage(url, video_id)\n\n        if 'This video has been removed<' in webpage:\n            raise ExtractorError('Video %s has been removed' % video_id, expected=True)\n\n        player_path = self._search_regex(\n            r'\\$\\(\"#playeriframe\"\\).attr\\({src : \"(.+?)\"',\n            webpage, 'player path')\n        player_url = compat_urlparse.urljoin(url, player_path)\n\n        self._download_webpage(player_url, video_id, 'Requesting player page')\n        player_page = self._download_webpage(\n            player_url, video_id, 'Downloading player page')\n\n        video_url = None\n\n        config_json = self._search_regex(\n            r'value=\\'config=({.+?})\\'', player_page, 'config json', default=None)\n\n        if config_json:\n            config = json.loads(config_json)\n            video_url = compat_urllib_parse_unquote(config['clip']['url'])","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/veehd.py#L44-L80","documentation":"Raised by the VeeHD extractor when the second (post-garbage-first-request) download of the video page contains the literal marker 'This video has been removed<'. VeeHD serves corrupt data on the first request, so the code downloads twice; seeing the removal marker on the clean fetch means the video is gone. expected=True — content condition, not a network fault.","triggerScenarios":"Extracting any VeeHD video URL whose page now shows the removal notice; the string check on the second webpage download matches.","commonSituations":"VeeHD was effectively defunct — nearly all legacy links hit this; DMCA removals; template text changed so the marker no longer matches and the code instead fails later at the player-path regex.","solutions":["Accept that the video is removed — there is no parameter that recovers it.","Find a mirror or re-upload of the content on another site.","If maintaining the extractor and the page layout changed, update the marker string to the current removal text; otherwise the failure moves to the player-path regex.","Filter veehd.com URLs out of batch downloads since the site is largely dead."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"html = fetch('http://veehd.com/video/' + video_id)  # second fetch: first returns garbage\nif 'This video has been removed<' in html:\n    skip(video_id, 'video removed from veehd')","typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if e.expected and 'has been removed' in str(e):\n        archive_dead(url)  # permanent, do not retry\n    raise","preventionTips":["Assume VeeHD links are dead; validate before queueing.","Mark removal errors as permanent in job state so they are never re-fetched.","Keep a dead-link archive to short-circuit future runs."],"tags":["content-missing","site-side-rejection","dead-site","expected-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}