ytdl-org/youtube-dl · error · ExtractorError

This video is DRM protected.

Error message

This video is DRM protected.

What it means

Raised by the Ruutu (Finnish broadcaster Nelonen) extractor when no formats could be extracted and the clip XML contains a non-empty ./Clip/DRM element. The stream is DRM-protected and youtube-dl will not (and legally cannot) decrypt it. Expected=True.

Source

Thrown at youtube_dl/extractor/ruutu.py:205

                            'url': video_url,
                            'width': width,
                            'height': height,
                            'tbr': tbr,
                            'preference': preference,
                        })

        extract_formats(video_xml.find('./Clip'))

        def pv(name):
            node = find_xpath_attr(
                video_xml, './Clip/PassthroughVariables/variable', 'name', name)
            if node is not None:
                return node.get('value')

        if not formats:
            drm = xpath_text(video_xml, './Clip/DRM', default=None)
            if drm:
                raise ExtractorError('This video is DRM protected.', expected=True)
            ns_st_cds = pv('ns_st_cds')
            if ns_st_cds != 'free':
                raise ExtractorError('This video is %s.' % ns_st_cds, expected=True)

        self._sort_formats(formats)

        themes = pv('themes')

        return {
            'id': video_id,
            'title': xpath_attr(video_xml, './/Behavior/Program', 'program_name', 'title', fatal=True),
            'description': xpath_attr(video_xml, './/Behavior/Program', 'description', 'description'),
            'thumbnail': xpath_attr(video_xml, './/Behavior/Startpicture', 'href', 'thumbnail'),
            'duration': int_or_none(xpath_text(video_xml, './/Runtime', 'duration')) or int_or_none(pv('runtime')),
            'age_limit': int_or_none(xpath_text(video_xml, './/AgeLimit', 'age limit')),
            'upload_date': unified_strdate(pv('date_start')),
            'series': pv('series_name'),
            'season_number': int_or_none(pv('season_number')),

View on GitHub (pinned to 956b8c5855)

Solutions

  1. There is no fix: DRM content is intentionally not extractable by youtube-dl.
  2. If you believe the content is free, check that the correct URL (non-DRM variant) is used.
  3. Use the official Ruutu player/app for playback; report nothing - this is by design.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if 'DRM protected' in str(e):
        skip_permanently(video_id)  # by design not extractable
    else:
        raise

Prevention

When it happens

Trigger: Extracting a ruutu.fi URL whose clip metadata declares DRM - typically premium/rental content or live channels wrapped in PlayReady/Widevine.

Common situations: Subscribers trying to archive paid Ruutu content; live TV channels; trial-period rentals after expiry.

Related errors


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