{"record":{"id":"863f711b98fc062b","repo":"ytdl-org/youtube-dl","slug":"s-said-s-863f71","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/redbulltv.py","lineNumber":65,"sourceCode":"        'url': 'https://www.redbull.com/us-en/events/AP-1XV2K61Q51W11/live/AP-1XUJ86FDH1W11',\n        'only_matching': True,\n    }, {\n        'url': 'https://www.redbull.com/int-en/films/AP-1ZSMAW8FH2111',\n        'only_matching': True,\n    }, {\n        'url': 'https://www.redbull.com/int-en/episodes/AP-1TQWK7XE11W11',\n        'only_matching': True,\n    }]\n\n    def extract_info(self, video_id):\n        session = self._download_json(\n            'https://api.redbull.tv/v3/session', video_id,\n            note='Downloading access token', query={\n                'category': 'personal_computer',\n                'os_family': 'http',\n            })\n        if session.get('code') == 'error':\n            raise ExtractorError('%s said: %s' % (\n                self.IE_NAME, session['message']))\n        token = session['token']\n\n        try:\n            video = self._download_json(\n                'https://api.redbull.tv/v3/products/' + video_id,\n                video_id, note='Downloading video information',\n                headers={'Authorization': token}\n            )\n        except ExtractorError as e:\n            if isinstance(e.cause, compat_HTTPError) and e.cause.code == 404:\n                error_message = self._parse_json(\n                    e.cause.read().decode(), video_id)['error']\n                raise ExtractorError('%s said: %s' % (\n                    self.IE_NAME, error_message), expected=True)\n            raise\n\n        title = video['title'].strip()","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/redbulltv.py#L47-L83","documentation":"RedBullTVIE.extract_info requests a session from api.redbull.tv/v3/session and raises ExtractorError('%s said: %s' % (IE_NAME, session['message'])) when the response JSON has code == 'error'. The interpolated message is Red Bull's own explanation (e.g. service unavailable / region issues). Not marked expected=True, so it surfaces as an unexpected failure. This is the gate before the token is used for product and stream requests.","triggerScenarios":"The v3/session endpoint (queried with category=personal_computer&os_family=http) returns {'code': 'error', 'message': ...} — service outages, API contract changes, or regional blocking of token issuance. Everything downstream (products/<id> with Authorization header, dms.redbull.tv m3u8) depends on this token, so failure here aborts all Red Bull TV extraction.","commonSituations":"Red Bull API maintenance or v3 deprecation after an extractor release; transient 5xx-ish responses shaped as code=error; unusual client IPs (VPNs) triggering session refusal.","solutions":["Retry after a short wait — session issuance failures are often transient.","Update youtube-dl / yt-dlp; Red Bull TV endpoint version bumps are handled in newer releases.","Test https://api.redbull.tv/v3/session?category=personal_computer&os_family=http directly to see the current response shape.","If behind a VPN, try a different egress region in case token issuance is region-filtered."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"# Pre-flight the session endpoint before a batch run\nimport requests\nr = requests.get('https://api.redbull.tv/v3/session',\n                 params={'category': 'personal_computer', 'os_family': 'http'})\nsession_ok = r.ok and r.json().get('code') != 'error'","typeGuard":null,"tryCatchPattern":"try:\n    info = ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'RedBullTV said:' in str(e) and 'session' in str(e).lower():\n        backoff_and_retry(url, attempts=3)","preventionTips":["Probe the session endpoint once before batch extraction and abort early if code=error.","Retry with exponential backoff — session failures are often transient.","Keep the extractor updated for Red Bull API version changes."],"tags":["redbulltv","session-token","api-error","transient"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}