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
- Accept that DRM content is not downloadable with youtube-dl; use the provider's official offline/download feature.
- Check whether the same video has a non-DRM rendition on another platform or quality tier.
- If you believe the video is DRM-free, update to yt-dlp in case newer source classification fixes a false positive.
- 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
- Filter known DRM catalogs out of download queues.
- Mark DRM failures as permanent in job systems to avoid pointless retries.
- Remember youtube-dl cannot and will not decrypt DRM.
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
- error.get('message') or error.get('error_subcode') or error[
- This content is not available at your territory due to limit
- This video is DRM protected.
- This video is DRM protected.
- This video is DRM protected.
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/70318c283d1f4208.
Report an issue: GitHub.