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 0

View on GitHub (pinned to 956b8c5855)

Solutions

  1. List extractor names (youtube-dl --list-extractors) and re-check the spelling of the pattern you passed.
  2. Use a broader, correct substring, e.g. testurl:youtube for YouTube-family extractors (note: patterns matching multiple extractors have their own ambiguity error).
  3. 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

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


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