{"record":{"id":"65a46a1be0902250","repo":"ytdl-org/youtube-dl","slug":"video-s-is-not-available-for-free","errorCode":null,"errorMessage":"Video %s is not available for free","messagePattern":"Video (.+?) is not available for free","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/tvnow.py","lineNumber":76,"sourceCode":"                formats = self._extract_mpd_formats(\n                    man_url, video_id, mpd_id='dash', fatal=False)\n            for man_url in make_urls('hss', 'Manifest'):\n                formats.extend(self._extract_ism_formats(\n                    man_url, video_id, ism_id='mss', fatal=False))\n            for man_url in make_urls('hls', '.m3u8'):\n                formats.extend(self._extract_m3u8_formats(\n                    man_url, video_id, 'mp4', 'm3u8_native', m3u8_id='hls',\n                    fatal=False))\n            if formats:\n                break\n        else:\n            if info.get('isDrm'):\n                raise ExtractorError(\n                    'Video %s is DRM protected' % video_id, expected=True)\n            if info.get('geoblocked'):\n                raise self.raise_geo_restricted()\n            if not info.get('free', True):\n                raise ExtractorError(\n                    'Video %s is not available for free' % video_id, expected=True)\n        self._sort_formats(formats)\n\n        description = info.get('articleLong') or info.get('articleShort')\n        timestamp = parse_iso8601(info.get('broadcastStartDate'), ' ')\n        duration = parse_duration(info.get('duration'))\n\n        f = info.get('format', {})\n\n        thumbnails = [{\n            'url': 'https://aistvnow-a.akamaihd.net/tvnow/movie/%s' % video_id,\n        }]\n        thumbnail = f.get('defaultImage169Format') or f.get('defaultImage169Logo')\n        if thumbnail:\n            thumbnails.append({\n                'url': thumbnail,\n            })\n","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/tvnow.py#L58-L94","documentation":"Raised by TVNowIE when no formats were found and the API metadata reports the item is not free (info.get('free') is falsy, default True). It is the plain paywall branch: the episode requires a TVNOW paid subscription. Expected error, so users see a clean 'not available for free' message.","triggerScenarios":"Extracting a tvnow episode where every manifest extraction produced zero formats and info['free'] is False/None — i.e. subscription-only content, and it is not flagged isDrm or geoblocked (those branches raise first).","commonSituations":"Attempting to download premium RTL shows, movies, or early-access episodes without credentials; free tier only carries limited episodes.","solutions":["Purchase/hold a TVNOW subscription and pass --cookies from an authenticated browser session.","Check whether a free, ad-supported episode of the same show is available and use its URL.","Use the official TVNOW app for subscribed playback.","Update to yt-dlp; note its new-API TVNowIE explicitly cannot bypass premium checks either."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"def tvnow_is_premium(info: dict) -> bool:\n    return not info.get('free', True)","tryCatchPattern":"try:\n    ydl.extract_info(tvnow_url)\nexcept ExtractorError as e:\n    if 'not available for free' in str(e):\n        needs_subscription.add(url)\n    else:\n        raise","preventionTips":["Log paywall hits separately from DRM/geo hits so subscription purchase vs. impossibility is distinguishable.","Always pass authenticated cookies when you hold a TVNOW subscription."],"tags":["paywall","extractor","tvnow","subscription","cookies"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}