{"record":{"id":"996d5401b35e9191","repo":"ytdl-org/youtube-dl","slug":"s-said-s-996d54","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/vevo.py","lineNumber":187,"sourceCode":"            headers={\n                'Content-Type': 'application/json',\n            })\n\n        if re.search(r'(?i)THIS PAGE IS CURRENTLY UNAVAILABLE IN YOUR REGION', webpage):\n            self.raise_geo_restricted(\n                '%s said: This page is currently unavailable in your region' % self.IE_NAME)\n\n        auth_info = self._parse_json(webpage, video_id)\n        self._api_url_template = self.http_scheme() + '//apiv2.vevo.com/%s?token=' + auth_info['legacy_token']\n\n    def _call_api(self, path, *args, **kwargs):\n        try:\n            data = self._download_json(self._api_url_template % path, *args, **kwargs)\n        except ExtractorError as e:\n            if isinstance(e.cause, compat_HTTPError):\n                errors = self._parse_json(e.cause.read().decode(), None)['errors']\n                error_message = ', '.join([error['message'] for error in errors])\n                raise ExtractorError('%s said: %s' % (self.IE_NAME, error_message), expected=True)\n            raise\n        return data\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n\n        self._initialize_api(video_id)\n\n        video_info = self._call_api(\n            'video/%s' % video_id, video_id, 'Downloading api video info',\n            'Failed to download video info')\n\n        video_versions = self._call_api(\n            'video/%s/streams' % video_id, video_id,\n            'Downloading video versions info',\n            'Failed to download video versions info',\n            fatal=False)\n","sourceCodeStart":169,"sourceCodeEnd":205,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/vevo.py#L169-L205","documentation":"Raised by the Vevo extractor's _call_api when an HTTP error from apiv2.vevo.com carries a JSON body with an 'errors' list; the messages are joined and re-raised with the extractor name. It converts a transport-level HTTPError into an expected, human-readable site error (geo-block, video not found, token problems).","triggerScenarios":"Any _call_api request (e.g. 'video/<id>') returning 4xx whose body parses as {\"errors\": [{\"message\": ...}]}; common for region-locked videos or after the legacy token bootstrap (auth_info['legacy_token']) expires or is rejected.","commonSituations":"Region-restricted videos outside the US/UK; Vevo API v2 deprecation or token changes breaking _initialize_api; deleted videos; clients hammering the API and getting throttled with error bodies.","solutions":["Read the propagated message — 'This page is currently unavailable in your region' vs 'not found' tells you whether a VPN/relay helps or the video is gone.","If every video fails, the legacy-token bootstrap broke: re-check _initialize_api against the current vevo.com page (isolate/auth JSON) and update it.","Upgrade youtube-dl — Vevo auth changes are typically patched upstream.","Handle it as expected=True: log and continue, do not retry blindly."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    info = ydl.extract_info(url)\nexcept ExtractorError as e:\n    if e.expected and 'Vevo said:' in str(e):\n        msg = str(e)\n        if 'region' in msg:\n            retry_via_proxy(url)      # geo-block is proxy-solvable\n        else:\n            log_skip(url, msg)        # deleted/not found is permanent\n    else:\n        raise","preventionTips":["Distinguish region-locked vs deleted from the propagated API message before choosing a remedy.","If every Vevo URL fails, suspect the legacy-token bootstrap, not the videos.","Rate-limit API-backed extractors to avoid throttle error bodies."],"tags":["api","http-error","geo-restriction","auth-token","json"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}