]> jfr.im git - yt-dlp.git/commitdiff
Allow plugin extractors to replace the built-in ones
authorpukkandan <redacted>
Fri, 16 Sep 2022 11:07:38 +0000 (16:37 +0530)
committerpukkandan <redacted>
Fri, 16 Sep 2022 11:32:52 +0000 (17:02 +0530)
This allows easier plugin chaining; e.g.
- https://gist.github.com/pukkandan/24f13ff1ed385c5a390c1d7bd130d8f7
- https://gist.github.com/pukkandan/fcf5ca1785c80f64e471f0ee14f990fb

yt_dlp/extractor/common.py
yt_dlp/extractor/extractors.py

index dae952f6a83b3ef90e2a93c9089df742f7c08215..30042d61feade16ca9bc48859576903f4b990c44 100644 (file)
@@ -5,6 +5,7 @@
 import http.client
 import http.cookiejar
 import http.cookies
+import inspect
 import itertools
 import json
 import math
@@ -3900,6 +3901,18 @@ def _extract_url(cls, webpage):  # TODO: Remove
         """Only for compatibility with some older extractors"""
         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):
     """
index 32818a024ad16cb1c4886dc6af13de3e1ce0800a..610e02f9061ee203c80f839d4e5229d2cc8b8187 100644 (file)
@@ -3,6 +3,9 @@
 
 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
 if not os.environ.get('YTDLP_NO_LAZY_EXTRACTORS'):
     with contextlib.suppress(ImportError):
@@ -19,5 +22,5 @@
     ]
     _ALL_CLASSES.append(GenericIE)  # noqa: F405
 
-_PLUGIN_CLASSES = load_plugins('extractor', 'IE', globals())
-_ALL_CLASSES = list(_PLUGIN_CLASSES.values()) + _ALL_CLASSES
+globals().update(_PLUGIN_CLASSES)
+_ALL_CLASSES[:0] = _PLUGIN_CLASSES.values()