ytdl-org/youtube-dl · error · ExtractorError

Video does not exist

Error message

Video %s does not exist

What it means

Raised by the XFileShare-family extractor when the page container matches one of the _FILE_NOT_FOUND_REGEXES. These regexes cover the various 'file not found' / 'file deleted' wordings used across the mirrored hosts, so the error means the requested file no longer exists on that host.

Solutions

  1. Confirm the link is dead by opening it in a browser.
  2. Find a re-upload or alternative host for the same content.
  3. Remove the URL from your queue — the file will not come back under the same ID.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    info = ydl.extract_info(url)
except ExtractorError as e:
    if 'does not exist' in str(e):
        drop_from_queue(url)
    else:
        raise

Prevention

When it happens

Trigger: Requesting a video ID whose page shows a file-deleted notice matched by _FILE_NOT_FOUND_REGEXES (checked right after the maintenance-mode check and before form handling).

Common situations: Files removed for inactivity or ToS violations on file lockers; dead links in scraped or archived playlists; mistyped video IDs.

Related errors


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

Appendix: source

Thrown at youtube_dl/extractor/xfileshare.py:211

        return list(yield_urls())

    def _real_extract(self, url):
        host, video_id = self._match_valid_url(url).group('host', 'id')

        url = 'https://%s/%s' % (
            host,
            'embed-%s.html' % video_id if host in ('govid.me', 'vidlo.us') else video_id)
        webpage = self._download_webpage(url, video_id)
        container_div = get_element_by_id('container', webpage) or webpage
        if self._search_regex(
                r'>This server is in maintenance mode\.', container_div,
                'maint error', group=0, default=None):
            raise ExtractorError(clean_html(container_div), expected=True)
        if self._search_regex(
                self._FILE_NOT_FOUND_REGEXES, container_div,
                'missing video error', group=0, default=None):
            raise ExtractorError('Video %s does not exist' % video_id, expected=True)

        fields = self._hidden_inputs(webpage)

        if fields.get('op') == 'download1':
            countdown = int_or_none(self._search_regex(
                r'<span id="countdown_str">(?:[Ww]ait)?\s*<span id="cxc">(\d+)</span>\s*(?:seconds?)?</span>',
                webpage, 'countdown', default=None))
            if countdown:
                self._sleep(countdown, video_id)

            webpage = self._download_webpage(
                url, video_id, 'Downloading video page',
                data=urlencode_postdata(fields), headers={
                    'Referer': url,
                    'Content-type': 'application/x-www-form-urlencoded',
                })

        title = (

View on GitHub (pinned to 956b8c5855)