]> jfr.im git - yt-dlp.git/blob - devscripts/lazy_load_template.py
[cleanup] Misc
[yt-dlp.git] / devscripts / lazy_load_template.py
1 import importlib
2 import random
3 import re
4
5 from ..utils import (
6 age_restricted,
7 bug_reports_message,
8 classproperty,
9 write_string,
10 )
11
12 # These bloat the lazy_extractors, so allow them to passthrough silently
13 ALLOWED_CLASSMETHODS = {'extract_from_webpage', 'get_testcases', 'get_webpage_testcases'}
14 _WARNED = False
15
16
17 class LazyLoadMetaClass(type):
18 def __getattr__(cls, name):
19 global _WARNED
20 if ('_real_class' not in cls.__dict__
21 and name not in ALLOWED_CLASSMETHODS and not _WARNED):
22 _WARNED = True
23 write_string('WARNING: Falling back to normal extractor since lazy extractor '
24 f'{cls.__name__} does not have attribute {name}{bug_reports_message()}\n')
25 return getattr(cls.real_class, name)
26
27
28 class LazyLoadExtractor(metaclass=LazyLoadMetaClass):
29 @classproperty
30 def real_class(cls):
31 if '_real_class' not in cls.__dict__:
32 cls._real_class = getattr(importlib.import_module(cls._module), cls.__name__)
33 return cls._real_class
34
35 def __new__(cls, *args, **kwargs):
36 instance = cls.real_class.__new__(cls.real_class)
37 instance.__init__(*args, **kwargs)
38 return instance