ytdl-org/youtube-dl · error · ExtractorError

This video is DRM protected.

Error message

This video is DRM protected.

What it means

ProSiebenSat1BaseIE._real_extract (via the shared video-extraction helper) raises ExtractorError('This video is DRM protected.', expected=True) when the VAS API response for the clip (vas.sim-technik.de/vas/live/v2/videos) has is_protected == True. The broadcaster serves DRM-encrypted streams for some content, and youtube-dl cannot decrypt them, so it aborts early before requesting formats/protocols.

Source

Thrown at youtube_dl/extractor/prosiebensat1.py:38

    _GEO_BYPASS = False
    _ACCESS_ID = None
    _SUPPORTED_PROTOCOLS = 'dash:clear,hls:clear,progressive:clear'
    _V4_BASE_URL = 'https://vas-v4.p7s1video.net/4.0/get'

    def _extract_video_info(self, url, clip_id):
        client_location = url

        video = self._download_json(
            'http://vas.sim-technik.de/vas/live/v2/videos',
            clip_id, 'Downloading videos JSON', query={
                'access_token': self._TOKEN,
                'client_location': client_location,
                'client_name': self._CLIENT_NAME,
                'ids': clip_id,
            })[0]

        if video.get('is_protected') is True:
            raise ExtractorError('This video is DRM protected.', expected=True)

        formats = []
        if self._ACCESS_ID:
            raw_ct = self._ENCRYPTION_KEY + clip_id + self._IV + self._ACCESS_ID
            protocols = self._download_json(
                self._V4_BASE_URL + 'protocols', clip_id,
                'Downloading protocols JSON',
                headers=self.geo_verification_headers(), query={
                    'access_id': self._ACCESS_ID,
                    'client_token': sha1((raw_ct).encode()).hexdigest(),
                    'video_id': clip_id,
                }, fatal=False, expected_status=(403,)) or {}
            error = protocols.get('error') or {}
            if error.get('title') == 'Geo check failed':
                self.raise_geo_restricted(countries=['AT', 'CH', 'DE'])
            server_token = protocols.get('server_token')
            if server_token:
                urls = (self._download_json(

View on GitHub (pinned to 956b8c5855)

Solutions

  1. There is no youtube-dl-side fix — DRM streams cannot be extracted; use the broadcaster's official apps/site for playback.
  2. Look for an alternate unprotected clip of the same content (different URL or free-tier episode).
  3. If you believe the content is not actually DRM'd, update youtube-dl in case the is_protected flag interpretation changed.
  4. Filter such URLs out of automated jobs by catching this expected error and skipping.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    info = ydl.extract_info(url)
except ExtractorError as e:
    if 'DRM protected' in str(e):
        skip_permanently(url)  # cannot be extracted

Prevention

When it happens

Trigger: Extracting any ProSiebenSat.1-group clip (prosieben, sat1, kabel1, sixx, pro7maxx, etc.) whose VAS video JSON sets "is_protected": true; checked immediately after the videos JSON download, before the protocols/sources requests.

Common situations: Premium or current-season TV episodes, live-event replays, and some films on these German broadcasters are DRM-protected; users hitting old show links that switched to protected delivery; region plus DRM combined (the API returns protection regardless of geo).

Related errors


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