ytdl-org/youtube-dl · warning · ExtractorError
No extractors matching %r found
Error message
No extractors matching %r found
What it means
Raised by the special testurl extractor (testurl:<extractor regex>[/<test number>]) when the case-insensitive regex the user supplied matches zero IE_NAMEs among all generated extractors. Marked expected=True — it is purely a user-input error in the test pseudo-URL.
Source
Thrown at youtube_dl/extractor/testurl.py:28
""" Allows addressing of the test cases as test:yout.*be_1 """
IE_DESC = False # Do not list
_VALID_URL = r'test(?:url)?:(?P<id>(?P<extractor>.+?)(?:_(?P<num>[0-9]+))?)$'
def _real_extract(self, url):
from ..extractor import gen_extractors
mobj = re.match(self._VALID_URL, url)
video_id = mobj.group('id')
extractor_id = mobj.group('extractor')
all_extractors = gen_extractors()
rex = re.compile(extractor_id, flags=re.IGNORECASE)
matching_extractors = [
e for e in all_extractors if rex.search(e.IE_NAME)]
if len(matching_extractors) == 0:
raise ExtractorError(
'No extractors matching %r found' % extractor_id,
expected=True)
elif len(matching_extractors) > 1:
# Is it obvious which one to pick?
try:
extractor = next(
ie for ie in matching_extractors
if ie.IE_NAME.lower() == extractor_id.lower())
except StopIteration:
raise ExtractorError(
('Found multiple matching extractors: %s' %
' '.join(ie.IE_NAME for ie in matching_extractors)),
expected=True)
else:
extractor = matching_extractors[0]
num_str = mobj.group('num')
num = int(num_str) if num_str else 0View on GitHub (pinned to 956b8c5855)
Solutions
- List extractor names (youtube-dl --list-extractors) and re-check the spelling of the pattern you passed.
- Use a broader, correct substring, e.g. testurl:youtube for YouTube-family extractors (note: patterns matching multiple extractors have their own ambiguity error).
- Read the error: it echoes the exact pattern searched, so compare it directly against --list-extractors output.
Example fix
# before # youtube-dl testurl:yutube # after # youtube-dl --list-extractors | grep -i youtube # find real names # youtube-dl testurl:youtube
Defensive patterns
Strategy: validation
Validate before calling
import subprocess, re
names = subprocess.run(['youtube-dl', '--list-extractors'], capture_output=True, text=True).stdout.splitlines()
if not any(re.search(pattern, n, re.IGNORECASE) for n in names):
print('pattern %r matches no extractor' % pattern) Try / catch
try:
ydl.extract_info('testurl:%s' % pattern)
except ExtractorError as e:
if e.expected and 'No extractors matching' in str(e):
suggest_similar_names(pattern) # fuzzy-match against --list-extractors
raise Prevention
- Copy extractor names from --list-extractors output, not from memory.
- Remember testurl patterns are regexes matched against IE_NAMEs.
- Re-validate patterns after upgrades; extractor sets change across versions.
When it happens
Trigger: Using a URL like testurl:nosuchthing or testurl:xyz123 where no extractor's IE_NAME contains that substring under re.IGNORECASE.
Common situations: Typos in the extractor pattern; assuming an extractor name that differs from its IE_NAME (e.g. 'soundcloud' vs registered name variants); copied test URLs referencing extractors removed in newer versions.
Related errors
- Found multiple matching extractors: %s
- Test case %d not found, got only %d tests
- %s said: %s
- Unable to login: %s
- lynda returned error: %s
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/ec73df845ab134a2.
Report an issue: GitHub.