ytdl-org/youtube-dl · error · ExtractorError
Video %s is not available for free
Error message
Video %s is not available for free
What it means
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.
Source
Thrown at youtube_dl/extractor/tvnow.py:76
formats = self._extract_mpd_formats(
man_url, video_id, mpd_id='dash', fatal=False)
for man_url in make_urls('hss', 'Manifest'):
formats.extend(self._extract_ism_formats(
man_url, video_id, ism_id='mss', fatal=False))
for man_url in make_urls('hls', '.m3u8'):
formats.extend(self._extract_m3u8_formats(
man_url, video_id, 'mp4', 'm3u8_native', m3u8_id='hls',
fatal=False))
if formats:
break
else:
if info.get('isDrm'):
raise ExtractorError(
'Video %s is DRM protected' % video_id, expected=True)
if info.get('geoblocked'):
raise self.raise_geo_restricted()
if not info.get('free', True):
raise ExtractorError(
'Video %s is not available for free' % video_id, expected=True)
self._sort_formats(formats)
description = info.get('articleLong') or info.get('articleShort')
timestamp = parse_iso8601(info.get('broadcastStartDate'), ' ')
duration = parse_duration(info.get('duration'))
f = info.get('format', {})
thumbnails = [{
'url': 'https://aistvnow-a.akamaihd.net/tvnow/movie/%s' % video_id,
}]
thumbnail = f.get('defaultImage169Format') or f.get('defaultImage169Logo')
if thumbnail:
thumbnails.append({
'url': thumbnail,
})
View on GitHub (pinned to 956b8c5855)
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.
Defensive patterns
Strategy: try-catch
Type guard
def tvnow_is_premium(info: dict) -> bool:
return not info.get('free', True) Try / catch
try:
ydl.extract_info(tvnow_url)
except ExtractorError as e:
if 'not available for free' in str(e):
needs_subscription.add(url)
else:
raise Prevention
- 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.
When it happens
Trigger: 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).
Common situations: Attempting to download premium RTL shows, movies, or early-access episodes without credentials; free tier only carries limited episodes.
Related errors
- Video %s is DRM protected
- Cannot download file. Are you logged in?
- This video is only available via cable service provider subs
- %s said: %s
- This content is only available for subscribers
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/65a46a1be0902250.
Report an issue: GitHub.