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
- Verify the item is marked as paid on tvp.pl; if so it cannot be downloaded by this extractor.
- 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).
- Look for a free broadcast repeat or clip of the same material.
- 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
- Flag paid TVP items before queueing (they always fail without a purchase).
- Do not retry; the outcome is deterministic without login support.
- Watch upstream releases for TVP authentication support.
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
- Unable to find video URL
- Could not extract video/website data
- {error_desc or 'unexpected JSON error'}
- Woronicza said: {document.get("code")} (HTTP {urlh.status})
- Unsafe placeholder for exec command: {na!r} The --output-na-
AI-assisted analysis of yt-dlp/yt-dlp@81ecd58b13 (2026-08-22).
Data as JSON: /api/errors/32a79aa65c4dcfdc.
Report an issue: GitHub.