ytdl-org/youtube-dl · error · ExtractorError

This video is %s.

Error message

This video is %s.

What it means

Raised by the Ruutu extractor when no formats were extracted, there is no DRM element, but the PassthroughVariables variable ns_st_cds is not 'free' - the value (e.g. 'ad', 'subscription', 'rental') is interpolated: 'This video is <ns_st_cds>.'. Expected=True. It distinguishes non-free-but-not-DRM content from DRM content.

Source

Thrown at youtube_dl/extractor/ruutu.py:208

                            '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')),
            'episode_number': int_or_none(pv('episode_number')),
            'categories': themes.split(',') if themes else [],
            'formats': formats,

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Check the interpolated value: 'subscription'/'rental' means payment-gated content - it is not downloadable without entitlement.
  2. Log in with an account that has the entitlement if the extractor version supports credentials.
  3. If the clip is visibly free on the site, the ns_st_cds flag is stale - update youtube-dl or the check.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if str(e).startswith('This video is ') and str(e).endswith('.'):
        tier = str(e)[len('This video is '):-1]
        if tier in ('subscription', 'rental'):
            skip_permanently(video_id)
        else:
            investigate(tier)
    else:
        raise

Prevention

When it happens

Trigger: Extracting a ruutu.fi clip whose ns_st_cds passthrough variable is e.g. 'subscription' or 'rental' - content gated behind payment but not DRM-wrapped.

Common situations: Non-subscribers hitting paywalled Ruutu clips; content whose free window expired.

Related errors


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