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
- Update youtube-dl/yt-dlp — new sites and embed parsers are added constantly
- Verify the URL opens a real video page in a browser (not a consent wall or 404)
- Find the underlying video URL (devtools Network tab) and pass it directly
- 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
- Update youtube-dl/yt-dlp before assuming a site is unsupported
- In automation, catch UnsupportedError separately from other DownloadErrors
- Prefer handing youtube-dl the concrete media/embed URL over article pages
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
- Unsupported URL: %s
- Simplestream ID not found
- Redirect loop: %s
- No sources found for video %s. Maybe a plain image?
- Can't find any video
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/f93ee8d6d3402940.
Report an issue: GitHub.