{"record":{"id":"32a79aa65c4dcfdc","repo":"yt-dlp/yt-dlp","slug":"video-requires-payment-and-log-in-but-log-in-is-n","errorCode":null,"errorMessage":"Video requires payment and log-in, but log-in is not implemented","messagePattern":"Video requires payment and log-in, but log-in is not implemented","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"yt_dlp/extractor/tvp.py","lineNumber":391,"sourceCode":"            'jebac_pis',\n            'jebacpis',\n            'ziobro',\n            'sasin70',\n            'sasin_przejebal_70_milionow_PLN',\n            'tvp_is_a_state_propaganda_service',\n        ))\n\n        webpage = self._download_webpage(\n            f'https://www.tvp.pl/sess/TVPlayer2/api.php?id={video_id}&@method=getTvpConfig&@callback={callback}', video_id)\n\n        # stripping JSONP padding\n        datastr = webpage[15 + len(callback):-3]\n        if datastr.startswith('null,'):\n            error = self._parse_json(datastr[5:], video_id, fatal=False)\n            error_desc = traverse_obj(error, (0, 'desc'))\n\n            if error_desc == 'Obiekt wymaga płatności':\n                raise ExtractorError('Video requires payment and log-in, but log-in is not implemented')\n\n            raise ExtractorError(error_desc or 'unexpected JSON error')\n\n        content = self._parse_json(datastr, video_id)['content']\n        info = content['info']\n        is_live = try_get(info, lambda x: x['isLive'], bool)\n\n        if info.get('isGeoBlocked'):\n            # actual country list is not provided, we just assume it's always available in PL\n            self.raise_geo_restricted(countries=['PL'])\n\n        formats = []\n        for file in content['files']:\n            video_url = url_or_none(file.get('url'))\n            if not video_url:\n                continue\n            ext = determine_ext(video_url, None)\n            if ext == 'm3u8':","sourceCodeStart":373,"sourceCodeEnd":409,"githubUrl":"https://github.com/yt-dlp/yt-dlp/blob/81ecd58b1394793e6da9998cc19fdb45657f1685/yt_dlp/extractor/tvp.py#L373-L409","documentation":"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.","triggerScenarios":"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.","commonSituations":"TVP VOD purchases, rental premieres, or premium materials opened without credentials; users assuming free-to-air availability for everything on tvp.pl.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"def is_paywall_error(e: Exception) -> bool:\n    return isinstance(e, ExtractorError) and 'requires payment' in str(e)","tryCatchPattern":"from yt_dlp.utils import ExtractorError\n\ntry:\n    info = ydl.extract_info(url, download=False)\nexcept ExtractorError as e:\n    if 'requires payment' in str(e):\n        ...  # paid TVP content; route to a licensed session or drop","preventionTips":["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."],"tags":["yt-dlp","extractor","tvp","paywall","login-required"],"backgroundTag":"paywalled-content","analyzedSha":"81ecd58b1394793e6da9998cc19fdb45657f1685","analyzedAt":"2026-08-22T12:21:25.439Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}