yt-dlp/yt-dlp · error · ExtractorError

Video requires payment and log-in, but log-in is not impleme

Error message

Video requires payment and log-in, but log-in is not implemented

What it means

Raised by TVPIE when the TVPlayer2 config API answers with a JSONP-wrapped null payload whose first error description is exactly 'Obiekt wymaga platnosci' (Polish for 'the object requires payment'). It signals pay-per-view or subscription content on tvp.pl for which yt-dlp has no login flow implemented, so extraction stops deliberately.

Source

Thrown at yt_dlp/extractor/tvp.py:391

            'jebac_pis',
            'jebacpis',
            'ziobro',
            'sasin70',
            'sasin_przejebal_70_milionow_PLN',
            'tvp_is_a_state_propaganda_service',
        ))

        webpage = self._download_webpage(
            f'https://www.tvp.pl/sess/TVPlayer2/api.php?id={video_id}&@method=getTvpConfig&@callback={callback}', video_id)

        # stripping JSONP padding
        datastr = webpage[15 + len(callback):-3]
        if datastr.startswith('null,'):
            error = self._parse_json(datastr[5:], video_id, fatal=False)
            error_desc = traverse_obj(error, (0, 'desc'))

            if error_desc == 'Obiekt wymaga płatności':
                raise ExtractorError('Video requires payment and log-in, but log-in is not implemented')

            raise ExtractorError(error_desc or 'unexpected JSON error')

        content = self._parse_json(datastr, video_id)['content']
        info = content['info']
        is_live = try_get(info, lambda x: x['isLive'], bool)

        if info.get('isGeoBlocked'):
            # actual country list is not provided, we just assume it's always available in PL
            self.raise_geo_restricted(countries=['PL'])

        formats = []
        for file in content['files']:
            video_url = url_or_none(file.get('url'))
            if not video_url:
                continue
            ext = determine_ext(video_url, None)
            if ext == 'm3u8':

View on GitHub (pinned to 81ecd58b13)

Solutions

  1. Verify the item is marked as paid on tvp.pl; if so it cannot be downloaded by this extractor.
  2. Play it in a logged-in browser that owns the purchase, and check whether yt-dlp gains support for such sessions (pass cookies with --cookies to test).
  3. Look for a free broadcast repeat or clip of the same material.
  4. Update yt-dlp in case a newer version implements authentication.
Defensive patterns

Strategy: try-catch

Type guard

def is_paywall_error(e: Exception) -> bool:
    return isinstance(e, ExtractorError) and 'requires payment' in str(e)

Try / catch

from yt_dlp.utils import ExtractorError

try:
    info = ydl.extract_info(url, download=False)
except ExtractorError as e:
    if 'requires payment' in str(e):
        ...  # paid TVP content; route to a licensed session or drop

Prevention

When it happens

Trigger: GET https://www.tvp.pl/sess/TVPlayer2/api.php?id=...&@method=getTvpConfig returns 'null,[{"desc":"Obiekt wymaga płatności"}]' inside the JSONP callback, i.e. the asset is flagged as paid in the player config.

Common situations: TVP VOD purchases, rental premieres, or premium materials opened without credentials; users assuming free-to-air availability for everything on tvp.pl.

Related errors


AI-assisted analysis of yt-dlp/yt-dlp@81ecd58b13 (2026-08-22). Data as JSON: /api/errors/32a79aa65c4dcfdc. Report an issue: GitHub.