ytdl-org/youtube-dl · error · ExtractorError

Video %s %s

Error message

Video %s %s

What it means

Raised by the RedTube extractor after downloading the video webpage when the HTML contains markers that the video was removed ('video-deleted-info' / '>This video has been removed') or is private ('private_video_text' / '>This video is private' / '>Send a friend request to its owner to be able to view it'). The message interpolates the video id and the reason ('has been removed' or 'is private'). Expected=True, so it is a clean, site-reported failure.

Source

Thrown at youtube_dl/extractor/redtube.py:57

    @staticmethod
    def _extract_urls(webpage):
        return re.findall(
            r'<iframe[^>]+?src=["\'](?P<url>(?:https?:)?//embed\.redtube\.com/\?.*?\bid=\d+)',
            webpage)

    def _real_extract(self, url):
        video_id = self._match_id(url)
        webpage = self._download_webpage(
            'http://www.redtube.com/%s' % video_id, video_id)

        ERRORS = (
            (('video-deleted-info', '>This video has been removed'), 'has been removed'),
            (('private_video_text', '>This video is private', '>Send a friend request to its owner to be able to view it'), 'is private'),
        )

        for patterns, message in ERRORS:
            if any(p in webpage for p in patterns):
                raise ExtractorError(
                    'Video %s %s' % (video_id, message), expected=True)

        info = self._search_json_ld(webpage, video_id, default={})

        if not info.get('title'):
            info['title'] = self._html_search_regex(
                (r'<h(\d)[^>]+class="(?:video_title_text|videoTitle|video_title)[^"]*">(?P<title>(?:(?!\1).)+)</h\1>',
                 r'(?:videoTitle|title)\s*:\s*(["\'])(?P<title>(?:(?!\1).)+)\1',),
                webpage, 'title', group='title',
                default=None) or self._og_search_title(webpage)

        formats = []
        sources = self._parse_json(
            self._search_regex(
                r'sources\s*:\s*({.+?})', webpage, 'source', default='{}'),
            video_id, fatal=False)
        if sources and isinstance(sources, dict):
            for format_id, format_url in sources.items():

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Confirm the video still exists by opening the URL in a browser.
  2. If private, the video is only reachable by a logged-in friend of the owner - obtain a public mirror or drop the URL.
  3. Remove dead IDs from your batch/playlist and mark them as unavailable in your pipeline.
  4. If the page loads fine in a browser, the marker strings likely changed - update youtube-dl or adjust the ERRORS patterns.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    ydl.extract_info(url)
except ExtractorError as e:
    if 'has been removed' in str(e) or 'is private' in str(e):
        mark_unavailable(video_id)  # permanent: stop retrying
    else:
        raise

Prevention

When it happens

Trigger: Downloading any redtube.com/<id> URL where the served page embeds one of the six marker strings, i.e. the video was taken down or its owner set it to private.

Common situations: Stale URLs from old playlists/bookmarks whose videos were removed; private videos shared without friendship with the owner; region-served variant pages that include the private marker.

Related errors


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