{"record":{"id":"0c7242a265e39ad9","repo":"ytdl-org/youtube-dl","slug":"drm-protected","errorCode":null,"errorMessage":"DRM protected","messagePattern":"DRM protected","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/tele5.py","lineNumber":91,"sourceCode":"        'url': 'https://www.tele5.de/anders-ist-sevda/',\n        'only_matching': True,\n    }]\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n        webpage = self._download_webpage(url, video_id)\n        player_element = self._search_regex(r'(<hyoga-player\\b[^>]+?>)', webpage, 'video player')\n        player_info = extract_attributes(player_element)\n        asset_id, country, realm = (player_info[x] for x in ('assetid', 'locale', 'realm', ))\n        endpoint = compat_urlparse.urlparse(player_info['endpoint']).hostname\n        source_type = player_info.get('sourcetype')\n        if source_type:\n            endpoint = '%s-%s' % (source_type, endpoint)\n        try:\n            return self._get_disco_api_info(url, asset_id, endpoint, realm, country)\n        except ExtractorError as e:\n            if getattr(e, 'message', '') == 'Missing deviceId in context':\n                raise ExtractorError('DRM protected', cause=e, expected=True)\n            raise\n","sourceCodeStart":73,"sourceCodeEnd":93,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/tele5.py#L73-L93","documentation":"Raised by Tele5IE when the joyn/disco _get_disco_api_info call fails with an ExtractorError whose message is 'Missing deviceId in context'. That upstream message is the platform's response when the asset is DRM-protected (device registration required), so the extractor rewrites it into the clearer 'DRM protected' (expected=True, chained via cause).","triggerScenarios":"Extracting a tele5.de video whose <hyoga-player> element resolves to a joyn disco asset that requires a registered DRM device; the API returns 'Missing deviceId in context' and the extractor translates it.","commonSituations":"Joyn/Tele5 premium or live content behind DRM; free clips that moved into DRM-protected delivery after platform changes; users expecting youtube-dl to bypass DRM (it does not).","solutions":["Accept it: youtube-dl does not circumvent DRM; this content cannot be downloaded with this tool.","Check whether the same clip has a non-DRM source (e.g. the broadcaster's YouTube channel or an older free clip URL).","Play it in a browser/app with an entitled account if you simply want to watch it.","Do not retry — the refusal is permanent for that asset, not transient."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    info = ydl.extract_info(url)\nexcept ExtractorError as e:\n    if e.expected and 'DRM' in str(e):\n        log.info('DRM-protected asset, not downloadable: %s', url)\n        return None\n    raise","preventionTips":["Never expect youtube-dl to fetch DRM content — it does not bypass protection.","Check for non-DRM copies (broadcasters' YouTube channels) before queueing joyn/Tele5 URLs.","Do not retry DRM refusals; they are permanent."],"tags":["drm","licensing","expected-error","unfixable"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}