ytdl-org/youtube-dl · error · ExtractorError

%s said: %s

Error message

%s said: %s

What it means

Raised by the XVideos extractor when the video page contains an <h1 class="inlineError"> element. The site uses this heading for availability errors (video deleted, not available in your language/region), and its HTML-stripped text is forwarded after the extractor name.

Source

Thrown at youtube_dl/extractor/xvideos.py:89

        'url': 'https://it.xvideos.com/video4588838/biker_takes_his_girl',
        'only_matching': True
    }, {
        'url': 'http://de.xvideos.com/video4588838/biker_takes_his_girl',
        'only_matching': True
    }, {
        'url': 'https://de.xvideos.com/video4588838/biker_takes_his_girl',
        'only_matching': True
    }]

    def _real_extract(self, url):
        video_id = self._match_id(url)

        webpage = self._download_webpage(
            'https://www.xvideos.com/video%s/0' % video_id, video_id)

        mobj = re.search(r'<h1 class="inlineError">(.+?)</h1>', webpage)
        if mobj:
            raise ExtractorError('%s said: %s' % (self.IE_NAME, clean_html(mobj.group(1))), expected=True)

        title = self._html_search_regex(
            (r'<title>(?P<title>.+?)\s+-\s+XVID',
             r'setVideoTitle\s*\(\s*(["\'])(?P<title>(?:(?!\1).)+)\1'),
            webpage, 'title', default=None,
            group='title') or self._og_search_title(webpage)

        thumbnails = []
        for preference, thumbnail in enumerate(('', '169')):
            thumbnail_url = self._search_regex(
                r'setThumbUrl%s\(\s*(["\'])(?P<thumbnail>(?:(?!\1).)+)\1' % thumbnail,
                webpage, 'thumbnail', default=None, group='thumbnail')
            if thumbnail_url:
                thumbnails.append({
                    'url': thumbnail_url,
                    'preference': preference,
                })

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Read the forwarded 'XVideos said:' message for the precise cause.
  2. For region blocks, retry from a permitted region.
  3. For deleted videos, look for a re-upload; the ID is gone permanently.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    info = ydl.extract_info(url)
except ExtractorError as e:
    if str(e).startswith('XVideos said:'):
        log_skip(url, str(e).split('said:', 1)[1])
    else:
        raise

Prevention

When it happens

Trigger: Downloading https://www.xvideos.com/video<id>/0 whose page matches r'<h1 class="inlineError">(.+?)</h1>'; the check runs immediately after the webpage download.

Common situations: Removed or deactivated uploads; videos blocked in the requester's country; the de.xvideos mirror redirecting to a page with an inline error for localized content.

Related errors


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