{"record":{"id":"0f21c3661e5f40d8","repo":"ytdl-org/youtube-dl","slug":"s-said-s-0f21c3","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/laola1tv.py","lineNumber":146,"sourceCode":"\n        if 'Dieser Livestream ist bereits beendet.' in webpage:\n            raise ExtractorError('This live stream has already finished.', expected=True)\n\n        conf = self._parse_json(self._search_regex(\n            r'(?s)conf\\s*=\\s*({.+?});', webpage, 'conf'),\n            display_id,\n            transform_source=lambda s: js_to_json(re.sub(r'shareurl:.+,', '', s)))\n        video_id = conf['videoid']\n\n        config = self._download_json(conf['configUrl'], video_id, query={\n            'videoid': video_id,\n            'partnerid': conf['partnerid'],\n            'language': conf.get('language', ''),\n            'portal': conf.get('portalid', ''),\n        })\n        error = config.get('error')\n        if error:\n            raise ExtractorError('%s said: %s' % (self.IE_NAME, error), expected=True)\n\n        video_data = config['video']\n        title = video_data['title']\n        is_live = video_data.get('isLivestream') and video_data.get('isLive')\n        meta = video_data.get('metaInformation')\n        sports = meta.get('sports')\n        categories = sports.split(',') if sports else []\n\n        token_url = self._extract_token_url(\n            video_data['streamAccess'], video_id,\n            video_data['abo']['required'])\n\n        formats = self._extract_formats(token_url, video_id)\n\n        return {\n            'id': video_id,\n            'display_id': display_id,\n            'title': self._live_title(title) if is_live else title,","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/laola1tv.py#L128-L164","documentation":"Raised by the Laola1TvBaseIE when the config API (conf['configUrl'] queried with videoid/partnerid/language/portal) returns a JSON payload containing an 'error' key. The message embeds the extractor name and the API's error text. It is expected=True and typically indicates geo-blocking or expired/unavailable videos.","triggerScenarios":"Any laola1.tv page whose config endpoint response includes a non-empty 'error' field — commonly 'Video is not available in your country' style messages, or video ids removed/expired after the live window.","commonSituations":"Region-locked sports content accessed from the wrong country; expired broadcasts whose config entries error out; partner/portal id mismatches when the site updates its conf blob; stale video ids from old links.","solutions":["Read the embedded API message: if region-related, use a proxy in the licensed country","If the video is expired, look for the VOD or highlight version on the same portal","Pass cookies of an authenticated/entitled account if the error is subscription-related","Update youtube-dl/yt-dlp in case the config API contract changed"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if ' said: ' in str(e):\n        handle_by_api_message(str(e))  # geo -> proxy; expired -> find VOD\n    else:\n        raise","preventionTips":["Use region-appropriate proxies per sports-rights territory","Pass authenticated cookies when content requires a subscription"],"tags":["laola1tv","api-error","geo-restriction","extractor"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}