Allow plugin extractors to replace the built-in ones
This allows easier plugin chaining; e.g. - https://gist.github.com/pukkandan/24f13ff1ed385c5a390c1d7bd130d8f7 - https://gist.github.com/pukkandan/fcf5ca1785c80f64e471f0ee14f990fb
This commit is contained in:
parent
1060f82f89
commit
2314b4d89f
2 changed files with 18 additions and 2 deletions
|
@ -5,6 +5,7 @@ import hashlib
|
||||||
import http.client
|
import http.client
|
||||||
import http.cookiejar
|
import http.cookiejar
|
||||||
import http.cookies
|
import http.cookies
|
||||||
|
import inspect
|
||||||
import itertools
|
import itertools
|
||||||
import json
|
import json
|
||||||
import math
|
import math
|
||||||
|
@ -3900,6 +3901,18 @@ class InfoExtractor:
|
||||||
"""Only for compatibility with some older extractors"""
|
"""Only for compatibility with some older extractors"""
|
||||||
return next(iter(cls._extract_embed_urls(None, webpage) or []), None)
|
return next(iter(cls._extract_embed_urls(None, webpage) or []), None)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def __init_subclass__(cls, *, plugin_name=None, **kwargs):
|
||||||
|
if plugin_name:
|
||||||
|
mro = inspect.getmro(cls)
|
||||||
|
super_class = cls.__wrapped__ = mro[mro.index(cls) + 1]
|
||||||
|
cls.IE_NAME, cls.ie_key = f'{super_class.IE_NAME}+{plugin_name}', super_class.ie_key
|
||||||
|
while getattr(super_class, '__wrapped__', None):
|
||||||
|
super_class = super_class.__wrapped__
|
||||||
|
setattr(sys.modules[super_class.__module__], super_class.__name__, cls)
|
||||||
|
|
||||||
|
return super().__init_subclass__(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
class SearchInfoExtractor(InfoExtractor):
|
class SearchInfoExtractor(InfoExtractor):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -3,6 +3,9 @@ import os
|
||||||
|
|
||||||
from ..utils import load_plugins
|
from ..utils import load_plugins
|
||||||
|
|
||||||
|
# NB: Must be before other imports so that plugins can be correctly injected
|
||||||
|
_PLUGIN_CLASSES = load_plugins('extractor', 'IE', {})
|
||||||
|
|
||||||
_LAZY_LOADER = False
|
_LAZY_LOADER = False
|
||||||
if not os.environ.get('YTDLP_NO_LAZY_EXTRACTORS'):
|
if not os.environ.get('YTDLP_NO_LAZY_EXTRACTORS'):
|
||||||
with contextlib.suppress(ImportError):
|
with contextlib.suppress(ImportError):
|
||||||
|
@ -19,5 +22,5 @@ if not _LAZY_LOADER:
|
||||||
]
|
]
|
||||||
_ALL_CLASSES.append(GenericIE) # noqa: F405
|
_ALL_CLASSES.append(GenericIE) # noqa: F405
|
||||||
|
|
||||||
_PLUGIN_CLASSES = load_plugins('extractor', 'IE', globals())
|
globals().update(_PLUGIN_CLASSES)
|
||||||
_ALL_CLASSES = list(_PLUGIN_CLASSES.values()) + _ALL_CLASSES
|
_ALL_CLASSES[:0] = _PLUGIN_CLASSES.values()
|
||||||
|
|
Loading…
Reference in a new issue