ytdl-org/youtube-dl · error · ExtractorError

This video is DRM protected.

Error message

This video is DRM protected.

What it means

Raised by BrightcoveNewIE when the playback JSON has 'sources' but every single one is DRM protected (num_drm_sources == len(sources)), so no format could be added. This is an explicit, expected (expected=True) refusal rather than emitting unplayable streams.

Source

Thrown at youtube_dl/extractor/brightcove.py:550

                        'format_id': build_format_id('http' if src else 'http-streaming'),
                        'source_preference': 0 if src else -1,
                    })
                else:
                    f.update({
                        'url': app_name,
                        'play_path': stream_name,
                        'format_id': build_format_id('rtmp'),
                    })
                formats.append(f)

        if not formats:
            errors = json_data.get('errors')
            if errors:
                error = errors[0]
                raise ExtractorError(
                    error.get('message') or error.get('error_subcode') or error['error_code'], expected=True)
            if sources and num_drm_sources == len(sources):
                raise ExtractorError('This video is DRM protected.', expected=True)

        self._sort_formats(formats)

        for f in formats:
            f.setdefault('http_headers', {}).update(headers)

        subtitles = {}
        for text_track in json_data.get('text_tracks', []):
            if text_track.get('kind') != 'captions':
                continue
            text_track_url = url_or_none(text_track.get('src'))
            if not text_track_url:
                continue
            lang = (str_or_none(text_track.get('srclang'))
                    or str_or_none(text_track.get('label')) or 'en').lower()
            subtitles.setdefault(lang, []).append({
                'url': text_track_url,
            })

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Accept that DRM content is not downloadable with youtube-dl; use the provider's official offline/download feature.
  2. Check whether the same video has a non-DRM rendition on another platform or quality tier.
  3. If you believe the video is DRM-free, update to yt-dlp in case newer source classification fixes a false positive.
  4. Do not attempt to strip DRM unless you hold the rights; tooling aside, it is usually not permitted.
Defensive patterns

Strategy: try-catch

Try / catch

from youtube_dl.utils import ExtractorError
try:
    ydl.extract_info(url)
except ExtractorError as e:
    if 'DRM' in str(e):
        skip_permanently(url)  # do not retry; DRM is unfixable
    else:
        raise

Prevention

When it happens

Trigger: Videos whose manifest URLs require Widevine/PlayReady/FairPlay DRM (e.g. .ism/.m3u8 sources with protection schemes). Typical for licensed studio content, live sports, or premium catalogs.

Common situations: Trying to download DRM-protected commercial content that youtube-dl fundamentally cannot play; youtube-dl deliberately has no DRM decryption.

Related errors


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