ytdl-org/youtube-dl · error · ExtractorError

%s returned error: %s

Error message

%s returned error: %s

What it means

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.

Source

Thrown at youtube_dl/extractor/xuite.py:100

            'uploader_id': '232279340',
        },
    }, {
        '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',
        'only_matching': True,
    }]

    def _real_extract(self, url):
        # /play/ URLs provide embedded video URL and more metadata
        url = url.replace('/embed/', '/play/')
        video_id = self._match_id(url)

        webpage = self._download_webpage(url, video_id)

        error_msg = self._search_regex(
            r'<div id="error-message-content">([^<]+)',
            webpage, 'error message', default=None)
        if error_msg:
            raise ExtractorError(
                '%s returned error: %s' % (self.IE_NAME, error_msg),
                expected=True)

        media_info = self._parse_json(self._search_regex(
            r'var\s+mediaInfo\s*=\s*({.*});', webpage, 'media info'), video_id)

        video_id = media_info['MEDIA_ID']

        formats = []
        for key in ('html5Url', 'html5HQUrl'):
            video_url = media_info.get(key)
            if not video_url:
                continue
            format_id = self._search_regex(
                r'\bq=(.+?)\b', video_url, 'format id', default=None)
            formats.append({
                'url': video_url,
                'ext': 'mp4' if format_id.isnumeric() else format_id,

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Read the forwarded 'Xuite said:' text for the specific reason.
  2. Verify the video still exists by opening the /play/ URL in a browser.
  3. If the page shows no error in a browser but the extractor fails, the markup changed — report upstream.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    info = ydl.extract_info(url)
except ExtractorError as e:
    if str(e).startswith('Xuite said:'):
        log_skip(url, str(e))
    else:
        raise

Prevention

When it happens

Trigger: Downloading a xuite.net URL (rewritten from /embed/ to /play/) whose page matches r'<div id="error-message-content">([^<]+)' before mediaInfo parsing.

Common situations: Deleted videos on the Taiwanese hosting service; region or account restrictions; old embed links after the service changed its page structure.

Related errors


AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14). Data as JSON: /api/errors/49c9fb46bd83e41c. Report an issue: GitHub.