diff --git a/devscripts/make_lazy_extractors.py b/devscripts/make_lazy_extractors.py index 58d027492..8ea87495b 100644 --- a/devscripts/make_lazy_extractors.py +++ b/devscripts/make_lazy_extractors.py @@ -12,7 +12,7 @@ from devscripts.utils import get_filename_args, read_file, write_file from yt_dlp.extractor import import_extractors from yt_dlp.extractor.common import InfoExtractor, SearchInfoExtractor -from yt_dlp._globals import extractors +from yt_dlp.globals import extractors NO_ATTR = object() STATIC_CLASS_PROPERTIES = [ diff --git a/test/test_YoutubeDL.py b/test/test_YoutubeDL.py index 61e913938..708a04f92 100644 --- a/test/test_YoutubeDL.py +++ b/test/test_YoutubeDL.py @@ -6,7 +6,7 @@ import unittest from unittest.mock import patch -from yt_dlp._globals import all_plugins_loaded +from yt_dlp.globals import all_plugins_loaded sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) diff --git a/test/test_plugins.py b/test/test_plugins.py index 28d1fa8fa..9b77659e6 100644 --- a/test/test_plugins.py +++ b/test/test_plugins.py @@ -23,7 +23,7 @@ get_plugin_spec, ) -from yt_dlp._globals import ( +from yt_dlp.globals import ( extractors, postprocessors, plugin_dirs, diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 839397edc..ad69268a6 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -33,11 +33,11 @@ from .extractor import gen_extractor_classes, get_info_extractor, import_extractors from .extractor.common import UnsupportedURLIE from .extractor.openload import PhantomJSwrapper -from ._globals import ( +from .globals import ( IN_CLI, LAZY_EXTRACTORS, plugin_ies, - plugin_overrides, + plugin_ies_overrides, plugin_pps, all_plugins_loaded, plugin_dirs, @@ -4090,7 +4090,7 @@ def get_encoding(stream): for name, klass in plugins.value.items()] if plugin_type == 'Extractor': display_list.extend(f'{plugins[-1].IE_NAME.partition("+")[2]} ({parent.__name__})' - for parent, plugins in plugin_overrides.value.items()) + for parent, plugins in plugin_ies_overrides.value.items()) if not display_list: continue write_debug(f'{plugin_type} Plugins: {", ".join(sorted(display_list))}') diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index a491fc6d1..edaeadd92 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -19,11 +19,9 @@ from .extractor import list_extractor_classes from .extractor.adobepass import MSO_INFO from .networking.impersonate import ImpersonateTarget -from ._globals import IN_CLI as _IN_CLI +from .globals import IN_CLI as _IN_CLI, plugin_dirs from .options import parseOpts from .plugins import load_all_plugins as _load_all_plugins -from .plugins import disable_plugins as _disable_plugins -from .plugins import set_plugin_dirs as _set_plugin_dirs from .postprocessor import ( FFmpegExtractAudioPP, FFmpegMergerPP, @@ -991,7 +989,10 @@ def _real_main(argv=None): FFmpegPostProcessor._ffmpeg_location.set(opts.ffmpeg_location) # load all plugins into the global lookup - _set_plugin_dirs(*set(opts.plugin_dirs)) + print(opts.plugin_dirs) + plugin_dirs.value = list(set(opts.plugin_dirs)) + if plugin_dirs.value: + _load_all_plugins() with YoutubeDL(ydl_opts) as ydl: pre_process = opts.update_self or opts.rm_cachedir diff --git a/yt_dlp/extractor/__init__.py b/yt_dlp/extractor/__init__.py index 3dde76933..18b7e40b3 100644 --- a/yt_dlp/extractor/__init__.py +++ b/yt_dlp/extractor/__init__.py @@ -1,5 +1,5 @@ -from .._globals import extractors as _extractors_context -from .._globals import plugin_ies as _plugin_ies_context +from ..globals import extractors as _extractors_context +from ..globals import plugin_ies as _plugin_ies_context from ..compat.compat_utils import passthrough_module from ..plugins import PluginSpec, register_plugin_spec diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py index 78d5ac140..27bcf44c9 100644 --- a/yt_dlp/extractor/common.py +++ b/yt_dlp/extractor/common.py @@ -22,7 +22,7 @@ import urllib.request import xml.etree.ElementTree -from .._globals import plugin_overrides as _plugin_overrides +from ..globals import plugin_ies_overrides as _plugin_overrides from ..compat import ( compat_etree_fromstring, compat_expanduser, diff --git a/yt_dlp/extractor/extractors.py b/yt_dlp/extractor/extractors.py index 5424fed84..ffcf7eb46 100644 --- a/yt_dlp/extractor/extractors.py +++ b/yt_dlp/extractor/extractors.py @@ -1,8 +1,8 @@ import inspect import os -from .._globals import LAZY_EXTRACTORS -from .._globals import extractors as _extractors_context +from ..globals import LAZY_EXTRACTORS +from ..globals import extractors as _extractors_context _CLASS_LOOKUP = None if not os.environ.get('YTDLP_NO_LAZY_EXTRACTORS'): diff --git a/yt_dlp/_globals.py b/yt_dlp/globals.py similarity index 66% rename from yt_dlp/_globals.py rename to yt_dlp/globals.py index b0f178ac2..e01005a23 100644 --- a/yt_dlp/_globals.py +++ b/yt_dlp/globals.py @@ -1,6 +1,8 @@ from collections import defaultdict -# Internal only - no backwards compatibility guaranteed +# Please Note: Due to necessary changes and the complex nature involved in the plugin/globals system, +# no backwards compatibility is guaranteed for the plugin system API. +# However, we will still try our best. class Indirect: @@ -14,14 +16,16 @@ def __repr__(self, /): postprocessors = Indirect({}) extractors = Indirect({}) +# Plugins +all_plugins_loaded = Indirect(False) +plugin_specs = Indirect({}) +plugin_dirs = Indirect(['default']) + +plugin_ies = Indirect({}) +plugin_pps = Indirect({}) +plugin_ies_overrides = Indirect(defaultdict(list)) + +# Misc IN_CLI = Indirect(False) # `False`=force, `None`=disabled, `True`=enabled LAZY_EXTRACTORS = Indirect(False) - -# Plugins -plugin_specs = Indirect({}) -all_plugins_loaded = Indirect(False) -plugin_dirs = Indirect(['default']) -plugin_ies = Indirect({}) -plugin_overrides = Indirect(defaultdict(list)) -plugin_pps = Indirect({}) diff --git a/yt_dlp/options.py b/yt_dlp/options.py index 5b8fbea67..127fa40b9 100644 --- a/yt_dlp/options.py +++ b/yt_dlp/options.py @@ -413,6 +413,7 @@ def _alias_callback(option, opt_str, value, parser, opts, nargs): metavar='PATH', dest='plugin_dirs', action='append', + default=['default'], help=( 'Path to an additional directory to search for plugins. ' 'This option can be used multiple times to add multiple directories. ')) diff --git a/yt_dlp/plugins.py b/yt_dlp/plugins.py index 1e5d0d3c0..cf4bd27de 100644 --- a/yt_dlp/plugins.py +++ b/yt_dlp/plugins.py @@ -15,7 +15,7 @@ from pathlib import Path from zipfile import ZipFile -from ._globals import ( +from .globals import ( plugin_dirs, all_plugins_loaded, plugin_specs, @@ -37,19 +37,18 @@ _BASE_PACKAGE_PATH = Path(__file__).parent -# Public APIs -# Anything else is NOT public and no backwards compatibility is guaranteed +# Please Note: Due to necessary changes and the complex nature involved, +# no backwards compatibility is guaranteed for the plugin system API. +# However, we will still try our best. + __all__ = [ 'COMPAT_PACKAGE_NAME', 'PACKAGE_NAME', - 'add_plugin_dirs', 'directories', 'disable_plugins', - 'get_plugin_spec', 'load_all_plugins', 'load_plugins', 'register_plugin_spec', - 'set_plugin_dirs', ] @@ -264,20 +263,6 @@ def register_plugin_spec(plugin_spec: PluginSpec): sys.meta_path.insert(0, PluginFinder(f'{PACKAGE_NAME}.{plugin_spec.module_name}')) -def add_plugin_dirs(*paths): - """Add external plugin dirs to the existing ones""" - plugin_dirs.value.extend(paths) - - -def set_plugin_dirs(*paths): - """Set external plugin dirs, overriding the default ones""" - plugin_dirs.value = list(paths) - - -def get_plugin_spec(module_name): - return plugin_specs.value.get(module_name) - - def disable_plugins(): if ( all_plugins_loaded.value diff --git a/yt_dlp/postprocessor/__init__.py b/yt_dlp/postprocessor/__init__.py index 172a07cde..20e8b14b2 100644 --- a/yt_dlp/postprocessor/__init__.py +++ b/yt_dlp/postprocessor/__init__.py @@ -33,7 +33,7 @@ from .sponskrub import SponSkrubPP from .sponsorblock import SponsorBlockPP from .xattrpp import XAttrMetadataPP -from .._globals import plugin_pps, postprocessors +from ..globals import plugin_pps, postprocessors from ..plugins import PACKAGE_NAME, register_plugin_spec, PluginSpec from ..utils import deprecation_warning diff --git a/yt_dlp/utils/_utils.py b/yt_dlp/utils/_utils.py index d513287a3..faa18d778 100644 --- a/yt_dlp/utils/_utils.py +++ b/yt_dlp/utils/_utils.py @@ -51,7 +51,7 @@ compat_HTMLParseError, ) from ..dependencies import xattr -from .._globals import IN_CLI as _IN_CLI +from ..globals import IN_CLI as _IN_CLI __name__ = __name__.rsplit('.', 1)[0] # noqa: A001: Pretend to be the parent module