diff --git a/.github/workflows/quick-test.yml b/.github/workflows/quick-test.yml index 7d409dfc4..500a504a4 100644 --- a/.github/workflows/quick-test.yml +++ b/.github/workflows/quick-test.yml @@ -27,5 +27,7 @@ jobs: python-version: 3.9 - name: Install flake8 run: pip install flake8 + - name: Make lazy extractors + run: python devscripts/make_lazy_extractors.py yt_dlp/extractor/lazy_extractors.py - name: Run flake8 run: flake8 . diff --git a/devscripts/lazy_load_template.py b/devscripts/lazy_load_template.py index d06655d10..20322e04b 100644 --- a/devscripts/lazy_load_template.py +++ b/devscripts/lazy_load_template.py @@ -8,10 +8,6 @@ import re class LazyLoadExtractor(object): _module = None - @classmethod - def ie_key(cls): - return cls.__name__[:-2] - def __new__(cls, *args, **kwargs): mod = __import__(cls._module, fromlist=(cls.__name__,)) real_cls = getattr(mod, cls.__name__) diff --git a/devscripts/make_lazy_extractors.py b/devscripts/make_lazy_extractors.py index 727d28204..8189c77dc 100644 --- a/devscripts/make_lazy_extractors.py +++ b/devscripts/make_lazy_extractors.py @@ -32,6 +32,7 @@ with open('devscripts/lazy_load_template.py', 'rt') as f: module_contents = [ module_template, + getsource(InfoExtractor.ie_key), getsource(InfoExtractor._match_valid_url), getsource(InfoExtractor.suitable), '\nclass LazyLoadSearchExtractor(LazyLoadExtractor):\n pass\n'] @@ -104,7 +105,7 @@ for ie in ordered_cls: names.append(name) module_contents.append( - '_ALL_CLASSES = [{0}]'.format(', '.join(names))) + '\n_ALL_CLASSES = [{0}]'.format(', '.join(names))) module_src = '\n'.join(module_contents) + '\n' diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py index 31356111b..734651193 100644 --- a/yt_dlp/extractor/common.py +++ b/yt_dlp/extractor/common.py @@ -458,6 +458,8 @@ class InfoExtractor(object): @classmethod def suitable(cls, url): """Receives a URL and returns True if suitable for this IE.""" + # This function must import everything it needs (except other extractors), + # so that lazy_extractors works correctly return cls._match_valid_url(url) is not None @classmethod @@ -622,7 +624,7 @@ class InfoExtractor(object): @classmethod def ie_key(cls): """A string for getting the InfoExtractor with get_info_extractor""" - return compat_str(cls.__name__[:-2]) + return cls.__name__[:-2] @property def IE_NAME(self): diff --git a/yt_dlp/extractor/rutube.py b/yt_dlp/extractor/rutube.py index 01529315f..d027412c4 100644 --- a/yt_dlp/extractor/rutube.py +++ b/yt_dlp/extractor/rutube.py @@ -297,6 +297,8 @@ class RutubePlaylistIE(RutubePlaylistBaseIE): @classmethod def suitable(cls, url): + from ..utils import int_or_none, parse_qs + if not super(RutubePlaylistIE, cls).suitable(url): return False params = parse_qs(url) diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py index 15e0f8adb..236f5809a 100644 --- a/yt_dlp/extractor/youtube.py +++ b/yt_dlp/extractor/youtube.py @@ -1837,8 +1837,6 @@ class YoutubeIE(YoutubeBaseInfoExtractor): @classmethod def suitable(cls, url): - # Hack for lazy extractors until more generic solution is implemented - # (see #28780) from ..utils import parse_qs qs = parse_qs(url)