{"record":{"id":"52c149a02d32dbff","repo":"ytdl-org/youtube-dl","slug":"s-said-s-52c149","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/vbox7.py","lineNumber":123,"sourceCode":"                    kwargs['transform_source'] = fix_chars\n                    kwargs = compat_kwargs(kwargs)\n\n        return super(Vbox7IE, self)._parse_json(\n            json_string, video_id, *args, **kwargs)\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n        url = 'https://vbox7.com/play:%s' % (video_id,)\n\n        now = time.time()\n        response = self._download_json(\n            'https://www.vbox7.com/aj/player/item/options', video_id,\n            query={'vid': video_id}, headers={'Referer': url})\n        # estimate time to which possible `ago` member is relative\n        now = now + 0.5 * (time.time() - now)\n\n        if traverse_obj(response, 'error'):\n            raise ExtractorError(\n                '%s said: %s' % (self.IE_NAME, response['error']), expected=True)\n\n        src_url = traverse_obj(response, ('options', 'src', T(url_or_none))) or ''\n\n        fmt_base = url_basename(src_url).rsplit('.', 1)[0].rsplit('_', 1)[0]\n        if fmt_base in ('na', 'vn'):\n            self.raise_geo_restricted(countries=self._GEO_COUNTRIES)\n\n        ext = determine_ext(src_url)\n        if ext == 'mpd':\n            # extract MPD\n            try:\n                formats, subtitles = self._extract_mpd_formats_and_subtitles(\n                    src_url, video_id, 'dash', fatal=False)\n            except KeyError:  # fatal doesn't catch this\n                self.report_warning('Failed to parse MPD manifest')\n                formats, subtitles = [], {}\n        elif ext != 'm3u8':","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/vbox7.py#L105-L141","documentation":"Raised by the Vbox7 extractor when the JSON from https://www.vbox7.com/aj/player/item/options?vid=<id> contains a truthy top-level 'error' member (read via traverse_obj). The site's own error text is propagated with the extractor name. It is an expected site-side rejection: removed video, bad vid, or blocked request.","triggerScenarios":"Extracting a vbox7.com play URL whose options endpoint answers with {\"error\": \"...\"} — deleted/private videos, malformed vid, or missing Referer header causing the API to reject the call.","commonSituations":"Vbox7 redesigns its player API and changes the error field or adds anti-bot checks; old video ids from playlists are removed; requests without the Referer: https://vbox7.com/play:<vid> header get rejected.","solutions":["Verify the video plays at https://vbox7.com/play:<vid> in a browser.","Check the raw JSON of the options endpoint (with the Referer header set) to see what error the site returns.","If the API shape changed, update the extractor's traversal of response (e.g. error now nested or named differently).","Pass through the site's error message to the end user; it is expected and not retryable."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"resp = ydl.extract_info('https://www.vbox7.com/aj/player/item/options?vid=' + video_id,\n                          download=False, headers={'Referer': 'https://vbox7.com/play:' + video_id})\nif resp and resp.get('error'):\n    skip(video_id, resp['error'])","typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if e.expected and 'said:' in str(e):\n        log_skip(url, str(e))\n    else:\n        raise","preventionTips":["Always send the Referer header when probing vbox7's options endpoint.","Check the options JSON error field before full extraction.","Watch for extractor updates when vbox7 changes its player API."],"tags":["api","json","site-side-rejection","referer-required"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}