{"record":{"id":"49c9fb46bd83e41c","repo":"ytdl-org/youtube-dl","slug":"s-returned-error-s-49c9fb","errorCode":null,"errorMessage":"%s returned error: %s","messagePattern":"(.+?) returned error: (.+?)","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/xuite.py","lineNumber":100,"sourceCode":"            'uploader_id': '232279340',\n        },\n    }, {\n        'url': 'http://vlog.xuite.net/play/S1dDUjdyLTMyOTc3NjcuZmx2/%E5%AD%AB%E7%87%95%E5%A7%BF-%E7%9C%BC%E6%B7%9A%E6%88%90%E8%A9%A9',\n        'only_matching': True,\n    }]\n\n    def _real_extract(self, url):\n        # /play/ URLs provide embedded video URL and more metadata\n        url = url.replace('/embed/', '/play/')\n        video_id = self._match_id(url)\n\n        webpage = self._download_webpage(url, video_id)\n\n        error_msg = self._search_regex(\n            r'<div id=\"error-message-content\">([^<]+)',\n            webpage, 'error message', default=None)\n        if error_msg:\n            raise ExtractorError(\n                '%s returned error: %s' % (self.IE_NAME, error_msg),\n                expected=True)\n\n        media_info = self._parse_json(self._search_regex(\n            r'var\\s+mediaInfo\\s*=\\s*({.*});', webpage, 'media info'), video_id)\n\n        video_id = media_info['MEDIA_ID']\n\n        formats = []\n        for key in ('html5Url', 'html5HQUrl'):\n            video_url = media_info.get(key)\n            if not video_url:\n                continue\n            format_id = self._search_regex(\n                r'\\bq=(.+?)\\b', video_url, 'format id', default=None)\n            formats.append({\n                'url': video_url,\n                'ext': 'mp4' if format_id.isnumeric() else format_id,","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/xuite.py#L82-L118","documentation":"Raised by the Xuite extractor when the /play/ page contains a <div id=\"error-message-content\"> element. The site reports errors (video removed, region-restricted, login required) through that div and the extractor forwards the text with the IE name prefix.","triggerScenarios":"Downloading a xuite.net URL (rewritten from /embed/ to /play/) whose page matches r'<div id=\"error-message-content\">([^<]+)' before mediaInfo parsing.","commonSituations":"Deleted videos on the Taiwanese hosting service; region or account restrictions; old embed links after the service changed its page structure.","solutions":["Read the forwarded 'Xuite said:' text for the specific reason.","Verify the video still exists by opening the /play/ URL in a browser.","If the page shows no error in a browser but the extractor fails, the markup changed — report 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('Xuite said:'):\n        log_skip(url, str(e))\n    else:\n        raise","preventionTips":["Verify Xuite /play/ URLs in a browser before batch extraction.","Forward the site message text into your job logs for later triage.","Expect old embed links to break as the service evolves."],"tags":["site-error","extractor","xuite"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}