{"record":{"id":"70318c283d1f4208","repo":"ytdl-org/youtube-dl","slug":"this-video-is-drm-protected","errorCode":null,"errorMessage":"This video is DRM protected.","messagePattern":"This video is DRM protected\\.","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/brightcove.py","lineNumber":550,"sourceCode":"                        'format_id': build_format_id('http' if src else 'http-streaming'),\n                        'source_preference': 0 if src else -1,\n                    })\n                else:\n                    f.update({\n                        'url': app_name,\n                        'play_path': stream_name,\n                        'format_id': build_format_id('rtmp'),\n                    })\n                formats.append(f)\n\n        if not formats:\n            errors = json_data.get('errors')\n            if errors:\n                error = errors[0]\n                raise ExtractorError(\n                    error.get('message') or error.get('error_subcode') or error['error_code'], expected=True)\n            if sources and num_drm_sources == len(sources):\n                raise ExtractorError('This video is DRM protected.', expected=True)\n\n        self._sort_formats(formats)\n\n        for f in formats:\n            f.setdefault('http_headers', {}).update(headers)\n\n        subtitles = {}\n        for text_track in json_data.get('text_tracks', []):\n            if text_track.get('kind') != 'captions':\n                continue\n            text_track_url = url_or_none(text_track.get('src'))\n            if not text_track_url:\n                continue\n            lang = (str_or_none(text_track.get('srclang'))\n                    or str_or_none(text_track.get('label')) or 'en').lower()\n            subtitles.setdefault(lang, []).append({\n                'url': text_track_url,\n            })","sourceCodeStart":532,"sourceCodeEnd":568,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/brightcove.py#L532-L568","documentation":"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.","triggerScenarios":"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.","commonSituations":"Trying to download DRM-protected commercial content that youtube-dl fundamentally cannot play; youtube-dl deliberately has no DRM decryption.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"from youtube_dl.utils import ExtractorError\ntry:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'DRM' in str(e):\n        skip_permanently(url)  # do not retry; DRM is unfixable\n    else:\n        raise","preventionTips":["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."],"tags":["brightcove","drm","licensing","expected"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}