ytdl-org/youtube-dl · error · UnsupportedError

Unsupported URL: %s

Error message

Unsupported URL: %s

What it means

UnsupportedError raised by the generic extractor after every embedded-video detection strategy (HTML5 video, jwplayer, embeds, twitter:player, etc.) failed to find any video on the page. The generic extractor is the last resort; this error means no specialized extractor matched the URL and nothing playable was found in the HTML.

Source

Thrown at youtube_dl/extractor/generic.py:3704

                if new_url != url:
                    self.report_following_redirect(new_url)
                    return {
                        '_type': 'url',
                        'url': new_url,
                    }
                else:
                    found = None

        if not found:
            # twitter:player is a https URL to iframe player that may or may not
            # be supported by youtube-dl thus this is checked the very last (see
            # https://dev.twitter.com/cards/types/player#On_twitter.com_via_desktop_browser)
            embed_url = self._html_search_meta('twitter:player', webpage, default=None)
            if embed_url and embed_url != url:
                return self.url_result(embed_url)

        if not found:
            raise UnsupportedError(url)

        entries = []
        for video_url in orderedSet(found):
            video_url = unescapeHTML(video_url)
            video_url = video_url.replace('\\/', '/')
            video_url = compat_urlparse.urljoin(url, video_url)
            video_id = compat_urllib_parse_unquote(os.path.basename(video_url))

            # Sometimes, jwplayer extraction will result in a YouTube URL
            if YoutubeIE.suitable(video_url):
                entries.append(self.url_result(video_url, 'Youtube'))
                continue

            # here's a fun little line of code for you:
            video_id = os.path.splitext(video_id)[0]

            entry_info_dict = {
                'id': video_id,

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Update youtube-dl/yt-dlp — new sites and embed parsers are added constantly
  2. Verify the URL opens a real video page in a browser (not a consent wall or 404)
  3. Find the underlying video URL (devtools Network tab) and pass it directly
  4. If the video is injected by JavaScript, use yt-dlp which handles more JS-driven players, or report the site as a supported-site request
Defensive patterns

Strategy: fallback

Validate before calling

from youtube_dl import YoutubeDL
with YoutubeDL() as ydl:
    ies = [ie.IE_NAME for ie in ydl._ies if ie.suitable(url) and ie.IE_NAME != 'generic']
if not ies:
    print('No specific extractor matches; generic parsing may fail — fetch the embed URL manually')

Type guard

def likely_supported(url, html):
    markers = ('<video', 'jwplayer', 'oembed', 'twitter:player', '.m3u8', '.mp4')
    return any(m in html for m in markers)

Try / catch

from youtube_dl.utils import DownloadError, UnsupportedError
try:
    info = ydl.extract_info(url)
except UnsupportedError:
    info = fallback_to_direct_stream_url(url)  # e.g. from devtools
except DownloadError:
    raise

Prevention

When it happens

Trigger: Passing a URL that matches no registered extractor (_VALID_URL of none matches) and whose downloaded HTML contains no recognizable video embeds, media URLs, or a usable twitter:player meta tag.

Common situations: Site added a new player framework youtube-dl can't parse, page requires JS rendering to inject the video, consent/anti-bot wall returning empty HTML, typo'd URL hitting a 404-style page, or the site is simply not a video site.

Related errors


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