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

  1. Purchase/hold a TVNOW subscription and pass --cookies from an authenticated browser session.
  2. Check whether a free, ad-supported episode of the same show is available and use its URL.
  3. Use the official TVNOW app for subscribed playback.
  4. 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

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


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