ytdl-org/youtube-dl · error · ExtractorError

video not found

Error message

video not found

What it means

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.

Source

Thrown at youtube_dl/extractor/rtl2.py:151

        'only_matching': True,
    }]
    _AES_KEY = b'\xe9W\xe4.<*\xb8\x1a\xd2\xb6\x92\xf3C\xd3\xefL\x1b\x03*\xbbbH\xc0\x03\xffo\xc2\xf2(\xaa\xaa!'
    _GEO_COUNTRIES = ['DE']

    def _real_extract(self, url):
        video_id = self._match_id(url)

        stream_data = self._download_json(
            self._BACKWERK_BASE_URL + 'stream/video/' + video_id, video_id)

        data, iv = compat_b64decode(stream_data['streamUrl']).decode().split(':')
        stream_url = intlist_to_bytes(aes_cbc_decrypt(
            bytes_to_intlist(compat_b64decode(data)),
            bytes_to_intlist(self._AES_KEY),
            bytes_to_intlist(compat_b64decode(iv))
        ))
        if b'rtl2_you_video_not_found' in stream_url:
            raise ExtractorError('video not found', expected=True)

        formats = self._extract_m3u8_formats(
            stream_url[:-compat_ord(stream_url[-1])].decode(),
            video_id, 'mp4', 'm3u8_native')
        self._sort_formats(formats)

        video_data = self._download_json(
            self._BACKWERK_BASE_URL + 'video/' + video_id, video_id)

        series = video_data.get('formatTitle')
        title = episode = video_data.get('title') or series
        if series and series != title:
            title = '%s - %s' % (series, title)

        return {
            'id': video_id,
            'title': title,
            'formats': formats,

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Verify the video on rtl2.de in a browser - most likely it was deleted.
  2. 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).
  3. Remove the dead id from your queue.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if e.args and 'video not found' in str(e):
        mark_deleted(video_id)  # RTL2 signaled absence via encrypted payload
    else:
        raise

Prevention

When it happens

Trigger: 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.

Common situations: User-uploaded ('you') videos deleted by their owner or moderated away; typo'd video ids; old links after RTL2 purged user content.

Related errors


AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14). Data as JSON: /api/errors/8a942e9fc0fe7eba. Report an issue: GitHub.