{"record":{"id":"05efe5965871f113","repo":"ytdl-org/youtube-dl","slug":"s-said-s-05efe5","errorCode":null,"errorMessage":"%s said: %s","messagePattern":"%s said: %s","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/vuclip.py","lineNumber":45,"sourceCode":"    }\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n        webpage = self._download_webpage(url, video_id)\n\n        ad_m = re.search(\n            r'''value=\"No.*?\" onClick=\"location.href='([^\"']+)'\"''', webpage)\n        if ad_m:\n            urlr = compat_urllib_parse_urlparse(url)\n            adfree_url = urlr.scheme + '://' + urlr.netloc + ad_m.group(1)\n            webpage = self._download_webpage(\n                adfree_url, video_id, note='Download post-ad page')\n\n        error_msg = self._html_search_regex(\n            r'<p class=\"message\">(.*?)</p>', webpage, 'error message',\n            default=None)\n        if error_msg:\n            raise ExtractorError(\n                '%s said: %s' % (self.IE_NAME, error_msg), expected=True)\n\n        # These clowns alternate between two page types\n        video_url = self._search_regex(\n            r'<a[^>]+href=\"([^\"]+)\"[^>]*><img[^>]+src=\"[^\"]*/play\\.gif',\n            webpage, 'video URL', default=None)\n        if video_url:\n            formats = [{\n                'url': video_url,\n            }]\n        else:\n            formats = self._parse_html5_media_entries(url, webpage, video_id)[0]['formats']\n\n        title = remove_end(self._html_search_regex(\n            r'<title>(.*?)-\\s*Vuclip</title>', webpage, 'title').strip(), ' - Video')\n\n        duration = parse_duration(self._html_search_regex(\n            r'[(>]([0-9]+:[0-9]+)(?:<span|\\))', webpage, 'duration', fatal=False))","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/vuclip.py#L27-L63","documentation":"Raised by the Vuclip extractor when the downloaded page contains a <p class=\"message\"> element. The site uses this element to report errors (e.g. video unavailable, region locked) on its ad-wrapped pages, and the extractor forwards the text verbatim prefixed with the extractor name.","triggerScenarios":"Downloading a Vuclip video whose page (after the optional post-ad page fetch) matches r'<p class=\"message\">(.*?)</p>'; any non-empty match triggers the error before video URL parsing.","commonSituations":"Video removed or expired on Vuclip; regional restrictions on mobile-focused video mirrors; site redesigns changing the error markup so the regex captures unrelated text.","solutions":["Read the forwarded message text — it is the site's own error explanation and dictates the fix.","If the video is gone or region-locked, obtain the content from another source.","Retry with a different Vuclip host/mirror URL if the error is transient.","If the message text looks like normal page content, the regex is stale — update the extractor or report the bug upstream."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    info = ydl.extract_info(url)\nexcept ExtractorError as e:\n    if str(e).startswith('Vuclip said:'):\n        handle_site_message(url, str(e))\n    else:\n        raise","preventionTips":["Prefer canonical Vuclip URLs over deep mobile links when possible.","Snapshot page availability before batching large link sets.","Report upstream if the captured message is clearly not a site error (stale regex)."],"tags":["site-error","parse-error","extractor","vuclip"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}