{"record":{"id":"8a942e9fc0fe7eba","repo":"ytdl-org/youtube-dl","slug":"video-not-found","errorCode":null,"errorMessage":"video not found","messagePattern":"video not found","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/rtl2.py","lineNumber":151,"sourceCode":"        'only_matching': True,\n    }]\n    _AES_KEY = b'\\xe9W\\xe4.<*\\xb8\\x1a\\xd2\\xb6\\x92\\xf3C\\xd3\\xefL\\x1b\\x03*\\xbbbH\\xc0\\x03\\xffo\\xc2\\xf2(\\xaa\\xaa!'\n    _GEO_COUNTRIES = ['DE']\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n\n        stream_data = self._download_json(\n            self._BACKWERK_BASE_URL + 'stream/video/' + video_id, video_id)\n\n        data, iv = compat_b64decode(stream_data['streamUrl']).decode().split(':')\n        stream_url = intlist_to_bytes(aes_cbc_decrypt(\n            bytes_to_intlist(compat_b64decode(data)),\n            bytes_to_intlist(self._AES_KEY),\n            bytes_to_intlist(compat_b64decode(iv))\n        ))\n        if b'rtl2_you_video_not_found' in stream_url:\n            raise ExtractorError('video not found', expected=True)\n\n        formats = self._extract_m3u8_formats(\n            stream_url[:-compat_ord(stream_url[-1])].decode(),\n            video_id, 'mp4', 'm3u8_native')\n        self._sort_formats(formats)\n\n        video_data = self._download_json(\n            self._BACKWERK_BASE_URL + 'video/' + video_id, video_id)\n\n        series = video_data.get('formatTitle')\n        title = episode = video_data.get('title') or series\n        if series and series != title:\n            title = '%s - %s' % (series, title)\n\n        return {\n            'id': video_id,\n            'title': title,\n            'formats': formats,","sourceCodeStart":133,"sourceCodeEnd":169,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/rtl2.py#L133-L169","documentation":"Raised by the RTL2 (Germany) extractor after AES-CBC decrypting the 'streamUrl' from the stream API: if the decrypted plaintext contains the literal b'rtl2_you_video_not_found', the backend is signaling the video does not exist. Expected=True.","triggerScenarios":"Extracting any rtl2.de video id for which the BACKWERK stream API returns a streamUrl that decrypts to the 'rtl2_you_video_not_found' placeholder instead of a real HLS URL.","commonSituations":"User-uploaded ('you') videos deleted by their owner or moderated away; typo'd video ids; old links after RTL2 purged user content.","solutions":["Verify the video on rtl2.de in a browser - most likely it was deleted.","If it plays in a browser, the encrypted marker changed or the AES key rotated - update youtube-dl (the extractor's _AES_KEY would need updating).","Remove the dead id from your queue."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if e.args and 'video not found' in str(e):\n        mark_deleted(video_id)  # RTL2 signaled absence via encrypted payload\n    else:\n        raise","preventionTips":["Treat this as authoritative deletion - do not retry.","Validate RTL2 ids against the site before queueing.","If the video plays in a browser, suspect a stale _AES_KEY and update youtube-dl instead."],"tags":["rtl2","video-not-found","aes-decrypt","expected-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}