{"record":{"id":"4ef5954bbdffee34","repo":"ytdl-org/youtube-dl","slug":"this-video-is-s","errorCode":null,"errorMessage":"This video is %s.","messagePattern":"This video is (.+?)\\.","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/ruutu.py","lineNumber":208,"sourceCode":"                            'tbr': tbr,\n                            'preference': preference,\n                        })\n\n        extract_formats(video_xml.find('./Clip'))\n\n        def pv(name):\n            node = find_xpath_attr(\n                video_xml, './Clip/PassthroughVariables/variable', 'name', name)\n            if node is not None:\n                return node.get('value')\n\n        if not formats:\n            drm = xpath_text(video_xml, './Clip/DRM', default=None)\n            if drm:\n                raise ExtractorError('This video is DRM protected.', expected=True)\n            ns_st_cds = pv('ns_st_cds')\n            if ns_st_cds != 'free':\n                raise ExtractorError('This video is %s.' % ns_st_cds, expected=True)\n\n        self._sort_formats(formats)\n\n        themes = pv('themes')\n\n        return {\n            'id': video_id,\n            'title': xpath_attr(video_xml, './/Behavior/Program', 'program_name', 'title', fatal=True),\n            'description': xpath_attr(video_xml, './/Behavior/Program', 'description', 'description'),\n            'thumbnail': xpath_attr(video_xml, './/Behavior/Startpicture', 'href', 'thumbnail'),\n            'duration': int_or_none(xpath_text(video_xml, './/Runtime', 'duration')) or int_or_none(pv('runtime')),\n            'age_limit': int_or_none(xpath_text(video_xml, './/AgeLimit', 'age limit')),\n            'upload_date': unified_strdate(pv('date_start')),\n            'series': pv('series_name'),\n            'season_number': int_or_none(pv('season_number')),\n            'episode_number': int_or_none(pv('episode_number')),\n            'categories': themes.split(',') if themes else [],\n            'formats': formats,","sourceCodeStart":190,"sourceCodeEnd":226,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/ruutu.py#L190-L226","documentation":"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.","triggerScenarios":"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.","commonSituations":"Non-subscribers hitting paywalled Ruutu clips; content whose free window expired.","solutions":["Check the interpolated value: 'subscription'/'rental' means payment-gated content - it is not downloadable without entitlement.","Log in with an account that has the entitlement if the extractor version supports credentials.","If the clip is visibly free on the site, the ns_st_cds flag is stale - update youtube-dl or the check."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if str(e).startswith('This video is ') and str(e).endswith('.'):\n        tier = str(e)[len('This video is '):-1]\n        if tier in ('subscription', 'rental'):\n            skip_permanently(video_id)\n        else:\n            investigate(tier)\n    else:\n        raise","preventionTips":["Check the interpolated ns_st_cds tier to know whether payment (not a bug) is the blocker.","Authenticate with an entitled account if your youtube-dl version supports it.","Do not retry paywalled clips without credentials - the outcome cannot change."],"tags":["ruutu","paywall","expected-error"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}