huge refactor, maybe revert?
This commit is contained in:
parent
d19027ca22
commit
cbfcd5154e
34 changed files with 282 additions and 266 deletions
|
|
@ -5,7 +5,6 @@ from typing import Optional
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
import mergedeep
|
import mergedeep
|
||||||
from yt_dlp.utils import sanitize_filename
|
|
||||||
|
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.entries.script.variable_definitions import VARIABLES
|
from ytdl_sub.entries.script.variable_definitions import VARIABLES
|
||||||
|
|
|
||||||
0
src/ytdl_sub/config/plugin/__init__.py
Normal file
0
src/ytdl_sub/config/plugin/__init__.py
Normal file
|
|
@ -8,7 +8,7 @@ from typing import Tuple
|
||||||
from typing import Type
|
from typing import Type
|
||||||
|
|
||||||
from ytdl_sub.config.overrides import Overrides
|
from ytdl_sub.config.overrides import Overrides
|
||||||
from ytdl_sub.config.preset_options import TOptionsValidator
|
from ytdl_sub.config.validators.options import TOptionsValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.utils.file_handler import FileMetadata
|
from ytdl_sub.utils.file_handler import FileMetadata
|
||||||
from ytdl_sub.ytdl_additions.enhanced_download_archive import DownloadArchiver
|
from ytdl_sub.ytdl_additions.enhanced_download_archive import DownloadArchiver
|
||||||
|
|
@ -1,15 +1,13 @@
|
||||||
import copy
|
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
from typing import Iterable
|
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
from typing import Type
|
from typing import Type
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.plugin import SplitPlugin
|
from ytdl_sub.config.plugin.plugin import SplitPlugin
|
||||||
from ytdl_sub.config.plugin_operation import PluginOperation
|
from ytdl_sub.config.plugin.plugin_operation import PluginOperation
|
||||||
from ytdl_sub.config.preset_options import OptionsValidator
|
from ytdl_sub.config.validators.options import OptionsValidator
|
||||||
from ytdl_sub.plugins.audio_extract import AudioExtractPlugin
|
from ytdl_sub.plugins.audio_extract import AudioExtractPlugin
|
||||||
from ytdl_sub.plugins.chapters import ChaptersPlugin
|
from ytdl_sub.plugins.chapters import ChaptersPlugin
|
||||||
from ytdl_sub.plugins.date_range import DateRangePlugin
|
from ytdl_sub.plugins.date_range import DateRangePlugin
|
||||||
42
src/ytdl_sub/config/plugin/preset_plugins.py
Normal file
42
src/ytdl_sub/config/plugin/preset_plugins.py
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
from typing import List, Type, Tuple, Optional
|
||||||
|
|
||||||
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
|
from ytdl_sub.config.validators.options import OptionsValidator, TOptionsValidator
|
||||||
|
|
||||||
|
|
||||||
|
class PresetPlugins:
|
||||||
|
def __init__(self):
|
||||||
|
self.plugin_types: List[Type[Plugin]] = []
|
||||||
|
self.plugin_options: List[OptionsValidator] = []
|
||||||
|
|
||||||
|
def add(self, plugin_type: Type[Plugin], plugin_options: OptionsValidator) -> "PresetPlugins":
|
||||||
|
"""
|
||||||
|
Add a pair of plugin type and options to the list
|
||||||
|
"""
|
||||||
|
self.plugin_types.append(plugin_type)
|
||||||
|
self.plugin_options.append(plugin_options)
|
||||||
|
return self
|
||||||
|
|
||||||
|
def zipped(self) -> List[Tuple[Type[Plugin], OptionsValidator]]:
|
||||||
|
"""
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
Plugin and PluginOptions zipped
|
||||||
|
"""
|
||||||
|
return list(zip(self.plugin_types, self.plugin_options))
|
||||||
|
|
||||||
|
def get(self, plugin_type: Type[TOptionsValidator]) -> Optional[TOptionsValidator]:
|
||||||
|
"""
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
plugin_type
|
||||||
|
Fetch the plugin options for this type
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
Options of this plugin if they exit. Otherwise, return None.
|
||||||
|
"""
|
||||||
|
plugin_option_types = [type(plugin_options) for plugin_options in self.plugin_options]
|
||||||
|
if plugin_type in plugin_option_types:
|
||||||
|
return self.plugin_options[plugin_option_types.index(plugin_type)]
|
||||||
|
return None
|
||||||
|
|
@ -1,48 +1,25 @@
|
||||||
import copy
|
import copy
|
||||||
import functools
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
from typing import Iterable
|
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Optional
|
|
||||||
from typing import Set
|
|
||||||
from typing import Tuple
|
|
||||||
from typing import Type
|
|
||||||
from typing import Union
|
|
||||||
|
|
||||||
from mergedeep import mergedeep
|
from mergedeep import mergedeep
|
||||||
|
|
||||||
from ytdl_sub.config.config_validator import ConfigValidator
|
from ytdl_sub.config.config_validator import ConfigValidator
|
||||||
from ytdl_sub.config.overrides import Overrides
|
from ytdl_sub.config.overrides import Overrides
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin_mapping import PluginMapping
|
||||||
from ytdl_sub.config.plugin_mapping import PluginMapping
|
from ytdl_sub.config.plugin.preset_plugins import PresetPlugins
|
||||||
from ytdl_sub.config.plugin_operation import PluginOperation
|
|
||||||
from ytdl_sub.config.preset_options import OptionsValidator
|
|
||||||
from ytdl_sub.config.preset_options import OutputOptions
|
from ytdl_sub.config.preset_options import OutputOptions
|
||||||
from ytdl_sub.config.preset_options import TOptionsValidator
|
|
||||||
from ytdl_sub.config.preset_options import YTDLOptions
|
from ytdl_sub.config.preset_options import YTDLOptions
|
||||||
|
from ytdl_sub.config.validators.variable_validation import VariableValidation
|
||||||
from ytdl_sub.downloaders.url.validators import MultiUrlValidator
|
from ytdl_sub.downloaders.url.validators import MultiUrlValidator
|
||||||
from ytdl_sub.entries.script.variable_definitions import VARIABLES
|
|
||||||
from ytdl_sub.entries.script.variable_scripts import VARIABLE_SCRIPTS
|
|
||||||
from ytdl_sub.prebuilt_presets import PREBUILT_PRESET_NAMES
|
from ytdl_sub.prebuilt_presets import PREBUILT_PRESET_NAMES
|
||||||
from ytdl_sub.prebuilt_presets import PUBLISHED_PRESET_NAMES
|
from ytdl_sub.prebuilt_presets import PUBLISHED_PRESET_NAMES
|
||||||
from ytdl_sub.script.script import Script
|
|
||||||
from ytdl_sub.script.utils.exceptions import VariableDoesNotExist
|
|
||||||
from ytdl_sub.utils.exceptions import StringFormattingVariableNotFoundException
|
|
||||||
from ytdl_sub.utils.exceptions import ValidationException
|
from ytdl_sub.utils.exceptions import ValidationException
|
||||||
from ytdl_sub.utils.logger import Logger
|
from ytdl_sub.utils.logger import Logger
|
||||||
from ytdl_sub.utils.script import ScriptUtils
|
|
||||||
from ytdl_sub.utils.yaml import dump_yaml
|
from ytdl_sub.utils.yaml import dump_yaml
|
||||||
from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
|
from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
|
||||||
from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator
|
|
||||||
from ytdl_sub.validators.string_formatter_validators import OverridesDictFormatterValidator
|
|
||||||
from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator
|
|
||||||
from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator
|
|
||||||
from ytdl_sub.validators.string_formatter_validators import validate_formatters
|
|
||||||
from ytdl_sub.validators.validators import DictValidator
|
|
||||||
from ytdl_sub.validators.validators import ListValidator
|
|
||||||
from ytdl_sub.validators.validators import StringListValidator
|
from ytdl_sub.validators.validators import StringListValidator
|
||||||
from ytdl_sub.validators.validators import Validator
|
|
||||||
from ytdl_sub.validators.validators import validation_exception
|
from ytdl_sub.validators.validators import validation_exception
|
||||||
|
|
||||||
PRESET_KEYS = {
|
PRESET_KEYS = {
|
||||||
|
|
@ -70,44 +47,6 @@ def _parent_preset_error_message(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class PresetPlugins:
|
|
||||||
def __init__(self):
|
|
||||||
self.plugin_types: List[Type[Plugin]] = []
|
|
||||||
self.plugin_options: List[OptionsValidator] = []
|
|
||||||
|
|
||||||
def add(self, plugin_type: Type[Plugin], plugin_options: OptionsValidator) -> "PresetPlugins":
|
|
||||||
"""
|
|
||||||
Add a pair of plugin type and options to the list
|
|
||||||
"""
|
|
||||||
self.plugin_types.append(plugin_type)
|
|
||||||
self.plugin_options.append(plugin_options)
|
|
||||||
return self
|
|
||||||
|
|
||||||
def zipped(self) -> List[Tuple[Type[Plugin], OptionsValidator]]:
|
|
||||||
"""
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
Plugin and PluginOptions zipped
|
|
||||||
"""
|
|
||||||
return list(zip(self.plugin_types, self.plugin_options))
|
|
||||||
|
|
||||||
def get(self, plugin_type: Type[TOptionsValidator]) -> Optional[TOptionsValidator]:
|
|
||||||
"""
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
plugin_type
|
|
||||||
Fetch the plugin options for this type
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
Options of this plugin if they exit. Otherwise, return None.
|
|
||||||
"""
|
|
||||||
plugin_option_types = [type(plugin_options) for plugin_options in self.plugin_options]
|
|
||||||
if plugin_type in plugin_option_types:
|
|
||||||
return self.plugin_options[plugin_option_types.index(plugin_type)]
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
class _PresetShell(StrictDictValidator):
|
class _PresetShell(StrictDictValidator):
|
||||||
# Have all present keys optional since parent presets could not have all the
|
# Have all present keys optional since parent presets could not have all the
|
||||||
# required keys. They will get validated in the init after the mergedeep of dicts
|
# required keys. They will get validated in the init after the mergedeep of dicts
|
||||||
|
|
@ -163,24 +102,6 @@ class Preset(_PresetShell):
|
||||||
validator=PluginMapping.get(plugin_name).plugin_options_type,
|
validator=PluginMapping.get(plugin_name).plugin_options_type,
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
|
||||||
def _source_variables(self) -> List[str]:
|
|
||||||
return list(VARIABLE_SCRIPTS.keys())
|
|
||||||
|
|
||||||
@property
|
|
||||||
def _added_variables(self) -> Set[str]:
|
|
||||||
added_variables: Set[str] = set()
|
|
||||||
options: List[OptionsValidator] = self.plugins.plugin_options
|
|
||||||
options.append(self.downloader_options)
|
|
||||||
|
|
||||||
for plugin_options in options:
|
|
||||||
for plugin_added_variables in plugin_options.added_source_variables(
|
|
||||||
unresolved_variables=set()
|
|
||||||
).values():
|
|
||||||
added_variables |= set(plugin_added_variables)
|
|
||||||
|
|
||||||
return added_variables
|
|
||||||
|
|
||||||
def _validate_and_get_plugins(self) -> PresetPlugins:
|
def _validate_and_get_plugins(self) -> PresetPlugins:
|
||||||
preset_plugins = PresetPlugins()
|
preset_plugins = PresetPlugins()
|
||||||
|
|
||||||
|
|
@ -195,64 +116,6 @@ class Preset(_PresetShell):
|
||||||
|
|
||||||
return preset_plugins
|
return preset_plugins
|
||||||
|
|
||||||
def _validate_variable_usage(self) -> None:
|
|
||||||
"""
|
|
||||||
Validate variables resolve as plugins are executed, and return
|
|
||||||
a mock script which contains actualized added variables from the plugins
|
|
||||||
"""
|
|
||||||
script = copy.deepcopy(self.overrides.script).add(
|
|
||||||
ScriptUtils.add_dummy_variables(self._source_variables)
|
|
||||||
)
|
|
||||||
unresolved_variables = self._added_variables
|
|
||||||
|
|
||||||
added_variables: Set[str] = self.downloader_options.added_source_variables(
|
|
||||||
unresolved_variables
|
|
||||||
).get(PluginOperation.DOWNLOADER, set())
|
|
||||||
script.add(ScriptUtils.add_dummy_variables(added_variables))
|
|
||||||
unresolved_variables -= added_variables
|
|
||||||
|
|
||||||
for plugin_options in PluginMapping.order_options_by(
|
|
||||||
self.plugins.zipped(), PluginOperation.MODIFY_ENTRY_METADATA
|
|
||||||
):
|
|
||||||
added_variables = plugin_options.added_source_variables(
|
|
||||||
unresolved_variables=unresolved_variables
|
|
||||||
).get(PluginOperation.MODIFY_ENTRY_METADATA, set())
|
|
||||||
|
|
||||||
if added_variables:
|
|
||||||
script.add(ScriptUtils.add_dummy_variables(added_variables))
|
|
||||||
unresolved_variables -= added_variables
|
|
||||||
|
|
||||||
_ = script.resolve(unresolvable=unresolved_variables, update=True)
|
|
||||||
for plugin_options in PluginMapping.order_options_by(
|
|
||||||
self.plugins.zipped(), PluginOperation.MODIFY_ENTRY
|
|
||||||
):
|
|
||||||
added_variables = plugin_options.added_source_variables(
|
|
||||||
unresolved_variables=unresolved_variables
|
|
||||||
).get(PluginOperation.MODIFY_ENTRY, set())
|
|
||||||
|
|
||||||
if added_variables:
|
|
||||||
script.add(ScriptUtils.add_dummy_variables(added_variables))
|
|
||||||
unresolved_variables -= added_variables
|
|
||||||
|
|
||||||
_ = script.resolve(unresolvable=unresolved_variables, update=True)
|
|
||||||
|
|
||||||
# Validate that any formatter in the plugin options can resolve
|
|
||||||
validate_formatters(
|
|
||||||
script=script,
|
|
||||||
unresolved_variables=unresolved_variables,
|
|
||||||
validator=plugin_options,
|
|
||||||
)
|
|
||||||
|
|
||||||
validate_formatters(
|
|
||||||
script=script,
|
|
||||||
unresolved_variables=unresolved_variables,
|
|
||||||
validator=self.output_options,
|
|
||||||
)
|
|
||||||
|
|
||||||
assert not unresolved_variables
|
|
||||||
|
|
||||||
return script
|
|
||||||
|
|
||||||
def _get_presets_to_merge(
|
def _get_presets_to_merge(
|
||||||
self, parent_presets: str | List[str], seen_presets: List[str], config: ConfigValidator
|
self, parent_presets: str | List[str], seen_presets: List[str], config: ConfigValidator
|
||||||
) -> List[Dict]:
|
) -> List[Dict]:
|
||||||
|
|
@ -329,16 +192,13 @@ class Preset(_PresetShell):
|
||||||
)
|
)
|
||||||
|
|
||||||
self.plugins: PresetPlugins = self._validate_and_get_plugins()
|
self.plugins: PresetPlugins = self._validate_and_get_plugins()
|
||||||
self.overrides = self._validate_key(
|
self.overrides = self._validate_key(key="overrides", validator=Overrides, default={})
|
||||||
key="overrides", validator=Overrides, default={}
|
|
||||||
).initialize_script(
|
|
||||||
unresolved_variables={
|
|
||||||
var_name: f"{{%throw('Plugin variable {var_name} has not been created yet')}}"
|
|
||||||
for var_name in self._added_variables
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
self._validate_variable_usage()
|
VariableValidation(
|
||||||
|
downloader_options=self.downloader_options,
|
||||||
|
output_options=self.output_options,
|
||||||
|
plugins=self.plugins,
|
||||||
|
).initialize_overrides(overrides=self.overrides).ensure_proper_usage()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self) -> str:
|
def name(self) -> str:
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,7 @@
|
||||||
from abc import ABC
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from typing import Dict
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Set
|
|
||||||
from typing import TypeVar
|
|
||||||
|
|
||||||
from ytdl_sub.config.defaults import DEFAULT_DOWNLOAD_ARCHIVE_NAME
|
from ytdl_sub.config.defaults import DEFAULT_DOWNLOAD_ARCHIVE_NAME
|
||||||
from ytdl_sub.config.plugin_operation import PluginOperation
|
|
||||||
from ytdl_sub.utils.exceptions import ValidationException
|
|
||||||
from ytdl_sub.validators.file_path_validators import OverridesStringFormatterFilePathValidator
|
from ytdl_sub.validators.file_path_validators import OverridesStringFormatterFilePathValidator
|
||||||
from ytdl_sub.validators.file_path_validators import StringFormatterFileNameValidator
|
from ytdl_sub.validators.file_path_validators import StringFormatterFileNameValidator
|
||||||
from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
|
from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
|
||||||
|
|
@ -17,55 +11,6 @@ from ytdl_sub.validators.string_formatter_validators import OverridesStringForma
|
||||||
from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator
|
from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator
|
||||||
from ytdl_sub.validators.validators import BoolValidator
|
from ytdl_sub.validators.validators import BoolValidator
|
||||||
from ytdl_sub.validators.validators import LiteralDictValidator
|
from ytdl_sub.validators.validators import LiteralDictValidator
|
||||||
from ytdl_sub.validators.validators import Validator
|
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=no-self-use
|
|
||||||
# pylint: disable=unused-argument
|
|
||||||
class OptionsValidator(Validator, ABC):
|
|
||||||
"""
|
|
||||||
Abstract class that validates options for preset sections (plugins, downloaders)
|
|
||||||
"""
|
|
||||||
|
|
||||||
def validation_exception(
|
|
||||||
self,
|
|
||||||
error_message: str | Exception,
|
|
||||||
) -> ValidationException:
|
|
||||||
"""
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
error_message
|
|
||||||
Error message to include in the validation exception
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
Validation exception that points to the location in the config. To be used to throw good
|
|
||||||
validation exceptions at runtime from code outside this class.
|
|
||||||
"""
|
|
||||||
return self._validation_exception(error_message=error_message)
|
|
||||||
|
|
||||||
def added_source_variables(
|
|
||||||
self, unresolved_variables: Set[str]
|
|
||||||
) -> Dict[PluginOperation, Set[str]]:
|
|
||||||
"""
|
|
||||||
If the plugin adds source variables, list them here.
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
List of added source variables this plugin creates
|
|
||||||
"""
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
TOptionsValidator = TypeVar("TOptionsValidator", bound=OptionsValidator)
|
|
||||||
|
|
||||||
|
|
||||||
class OptionsDictValidator(StrictDictValidator, OptionsValidator, ABC):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# pylint: enable=no-self-use
|
|
||||||
# pylint: enable=unused-argument
|
|
||||||
|
|
||||||
|
|
||||||
class YTDLOptions(LiteralDictValidator):
|
class YTDLOptions(LiteralDictValidator):
|
||||||
|
|
|
||||||
0
src/ytdl_sub/config/validators/__init__.py
Normal file
0
src/ytdl_sub/config/validators/__init__.py
Normal file
56
src/ytdl_sub/config/validators/options.py
Normal file
56
src/ytdl_sub/config/validators/options.py
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
from abc import ABC
|
||||||
|
from typing import Dict
|
||||||
|
from typing import Set
|
||||||
|
from typing import TypeVar
|
||||||
|
|
||||||
|
from ytdl_sub.config.plugin.plugin_operation import PluginOperation
|
||||||
|
from ytdl_sub.utils.exceptions import ValidationException
|
||||||
|
from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
|
||||||
|
from ytdl_sub.validators.validators import Validator
|
||||||
|
|
||||||
|
# pylint: disable=no-self-use
|
||||||
|
# pylint: disable=unused-argument
|
||||||
|
|
||||||
|
|
||||||
|
class OptionsValidator(Validator, ABC):
|
||||||
|
"""
|
||||||
|
Abstract class that validates options for preset sections (plugins, downloaders)
|
||||||
|
"""
|
||||||
|
|
||||||
|
def validation_exception(
|
||||||
|
self,
|
||||||
|
error_message: str | Exception,
|
||||||
|
) -> ValidationException:
|
||||||
|
"""
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
error_message
|
||||||
|
Error message to include in the validation exception
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
Validation exception that points to the location in the config. To be used to throw good
|
||||||
|
validation exceptions at runtime from code outside this class.
|
||||||
|
"""
|
||||||
|
return self._validation_exception(error_message=error_message)
|
||||||
|
|
||||||
|
def modified_variables(self) -> Dict[PluginOperation, Set[str]]:
|
||||||
|
"""
|
||||||
|
If the plugin modifies existing variables, define them here
|
||||||
|
"""
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def added_source_variables(
|
||||||
|
self, unresolved_variables: Set[str]
|
||||||
|
) -> Dict[PluginOperation, Set[str]]:
|
||||||
|
"""
|
||||||
|
If the plugin adds source variables, list them here.
|
||||||
|
"""
|
||||||
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
TOptionsValidator = TypeVar("TOptionsValidator", bound=OptionsValidator)
|
||||||
|
|
||||||
|
|
||||||
|
class OptionsDictValidator(StrictDictValidator, OptionsValidator, ABC):
|
||||||
|
pass
|
||||||
116
src/ytdl_sub/config/validators/variable_validation.py
Normal file
116
src/ytdl_sub/config/validators/variable_validation.py
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
import copy
|
||||||
|
from typing import List
|
||||||
|
from typing import Optional
|
||||||
|
from typing import Set
|
||||||
|
|
||||||
|
from ytdl_sub.config.overrides import Overrides
|
||||||
|
from ytdl_sub.config.plugin.plugin_mapping import PluginMapping
|
||||||
|
from ytdl_sub.config.plugin.plugin_operation import PluginOperation
|
||||||
|
from ytdl_sub.config.plugin.preset_plugins import PresetPlugins
|
||||||
|
from ytdl_sub.config.preset_options import OutputOptions
|
||||||
|
from ytdl_sub.config.validators.options import OptionsValidator
|
||||||
|
from ytdl_sub.downloaders.url.validators import MultiUrlValidator
|
||||||
|
from ytdl_sub.entries.script.variable_scripts import VARIABLE_SCRIPTS
|
||||||
|
from ytdl_sub.script.script import Script
|
||||||
|
from ytdl_sub.utils.script import ScriptUtils
|
||||||
|
from ytdl_sub.validators.string_formatter_validators import validate_formatters
|
||||||
|
|
||||||
|
|
||||||
|
class VariableValidation:
|
||||||
|
@classmethod
|
||||||
|
def _get_added_variables(
|
||||||
|
cls, plugins: PresetPlugins, downloader_options: MultiUrlValidator
|
||||||
|
) -> Set[str]:
|
||||||
|
added_variables: Set[str] = set()
|
||||||
|
options: List[OptionsValidator] = plugins.plugin_options
|
||||||
|
options.append(downloader_options)
|
||||||
|
|
||||||
|
for plugin_options in options:
|
||||||
|
for plugin_added_variables in plugin_options.added_source_variables(
|
||||||
|
unresolved_variables=set()
|
||||||
|
).values():
|
||||||
|
added_variables |= set(plugin_added_variables)
|
||||||
|
|
||||||
|
return added_variables
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
downloader_options: MultiUrlValidator,
|
||||||
|
output_options: OutputOptions,
|
||||||
|
plugins: PresetPlugins,
|
||||||
|
):
|
||||||
|
self.script: Optional[Script] = None
|
||||||
|
self.resolved_variables: Set[str] = set()
|
||||||
|
|
||||||
|
self.downloader_options = downloader_options
|
||||||
|
self.output_options = output_options
|
||||||
|
self.plugins = plugins
|
||||||
|
self.unresolved_variables = VariableValidation._get_added_variables(
|
||||||
|
plugins=plugins, downloader_options=downloader_options
|
||||||
|
)
|
||||||
|
|
||||||
|
def initialize_overrides(self, overrides: Overrides) -> "VariableValidation":
|
||||||
|
overrides = overrides.initialize_script(
|
||||||
|
unresolved_variables={
|
||||||
|
var_name: f"{{%throw('Plugin variable {var_name} has not been created yet')}}"
|
||||||
|
for var_name in self.unresolved_variables
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.script = copy.deepcopy(overrides.script).add(
|
||||||
|
ScriptUtils.add_dummy_variables(list(VARIABLE_SCRIPTS.keys()))
|
||||||
|
)
|
||||||
|
self.resolved_variables = self.script.variable_names - self.unresolved_variables
|
||||||
|
|
||||||
|
return self
|
||||||
|
|
||||||
|
def ensure_proper_usage(self) -> None:
|
||||||
|
"""
|
||||||
|
Validate variables resolve as plugins are executed, and return
|
||||||
|
a mock script which contains actualized added variables from the plugins
|
||||||
|
"""
|
||||||
|
|
||||||
|
added_variables: Set[str] = self.downloader_options.added_source_variables(
|
||||||
|
self.unresolved_variables
|
||||||
|
).get(PluginOperation.DOWNLOADER, set())
|
||||||
|
self.script.add(ScriptUtils.add_dummy_variables(added_variables))
|
||||||
|
self.unresolved_variables -= added_variables
|
||||||
|
|
||||||
|
for plugin_options in PluginMapping.order_options_by(
|
||||||
|
self.plugins.zipped(), PluginOperation.MODIFY_ENTRY_METADATA
|
||||||
|
):
|
||||||
|
added_variables = plugin_options.added_source_variables(
|
||||||
|
unresolved_variables=self.unresolved_variables
|
||||||
|
).get(PluginOperation.MODIFY_ENTRY_METADATA, set())
|
||||||
|
|
||||||
|
if added_variables:
|
||||||
|
self.script.add(ScriptUtils.add_dummy_variables(added_variables))
|
||||||
|
self.unresolved_variables -= added_variables
|
||||||
|
|
||||||
|
_ = self.script.resolve(unresolvable=self.unresolved_variables, update=True)
|
||||||
|
for plugin_options in PluginMapping.order_options_by(
|
||||||
|
self.plugins.zipped(), PluginOperation.MODIFY_ENTRY
|
||||||
|
):
|
||||||
|
added_variables = plugin_options.added_source_variables(
|
||||||
|
unresolved_variables=self.unresolved_variables
|
||||||
|
).get(PluginOperation.MODIFY_ENTRY, set())
|
||||||
|
|
||||||
|
if added_variables:
|
||||||
|
self.script.add(ScriptUtils.add_dummy_variables(added_variables))
|
||||||
|
self.unresolved_variables -= added_variables
|
||||||
|
|
||||||
|
_ = self.script.resolve(unresolvable=self.unresolved_variables, update=True)
|
||||||
|
|
||||||
|
# Validate that any formatter in the plugin options can resolve
|
||||||
|
validate_formatters(
|
||||||
|
script=self.script,
|
||||||
|
unresolved_variables=self.unresolved_variables,
|
||||||
|
validator=plugin_options,
|
||||||
|
)
|
||||||
|
|
||||||
|
validate_formatters(
|
||||||
|
script=self.script,
|
||||||
|
unresolved_variables=self.unresolved_variables,
|
||||||
|
validator=self.output_options,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert not self.unresolved_variables
|
||||||
|
|
@ -7,7 +7,7 @@ from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from ytdl_sub.config.overrides import Overrides
|
from ytdl_sub.config.overrides import Overrides
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.downloaders.source_plugin import SourcePlugin
|
from ytdl_sub.downloaders.source_plugin import SourcePlugin
|
||||||
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
||||||
from ytdl_sub.entries.entry import YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY
|
from ytdl_sub.entries.entry import YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ from typing import Type
|
||||||
from typing import final
|
from typing import final
|
||||||
|
|
||||||
from ytdl_sub.config.overrides import Overrides
|
from ytdl_sub.config.overrides import Overrides
|
||||||
from ytdl_sub.config.plugin import BasePlugin
|
from ytdl_sub.config.plugin.plugin import BasePlugin
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import TOptionsValidator
|
from ytdl_sub.config.validators.options import TOptionsValidator
|
||||||
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive
|
from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ from typing import Dict
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
from ytdl_sub.config.plugin_operation import PluginOperation
|
from ytdl_sub.config.plugin.plugin_operation import PluginOperation
|
||||||
from ytdl_sub.config.preset_options import OptionsValidator
|
from ytdl_sub.config.validators.options import OptionsValidator
|
||||||
from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
|
from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
|
||||||
from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator
|
from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator
|
||||||
from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator
|
from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,9 @@ from typing import Dict
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.plugin_operation import PluginOperation
|
from ytdl_sub.config.plugin.plugin_operation import PluginOperation
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
|
from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
|
||||||
|
|
@ -68,9 +68,7 @@ class AudioExtractOptions(OptionsDictValidator):
|
||||||
return self._quality.value
|
return self._quality.value
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def added_source_variables(
|
def modified_variables(self) -> Dict[PluginOperation, Set[str]]:
|
||||||
self, unresolved_variables: Set[str]
|
|
||||||
) -> Dict[PluginOperation, Set[str]]:
|
|
||||||
"""
|
"""
|
||||||
Possibly changes ``ext``, so do not resolve until this has run
|
Possibly changes ``ext``, so do not resolve until this has run
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
|
from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@ from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.utils.datetime import to_date_str
|
from ytdl_sub.utils.datetime import to_date_str
|
||||||
from ytdl_sub.validators.string_datetime import StringDatetimeValidator
|
from ytdl_sub.validators.string_datetime import StringDatetimeValidator
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ from typing import Optional
|
||||||
|
|
||||||
import mediafile
|
import mediafile
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import OptionsValidator
|
from ytdl_sub.config.validators.options import OptionsValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.utils.ffmpeg import FFMPEG
|
from ytdl_sub.utils.ffmpeg import FFMPEG
|
||||||
from ytdl_sub.utils.file_handler import FileHandler
|
from ytdl_sub.utils.file_handler import FileHandler
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,9 @@ from typing import Optional
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
from ytdl_sub.config.overrides import Overrides
|
from ytdl_sub.config.overrides import Overrides
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.plugin_operation import PluginOperation
|
from ytdl_sub.config.plugin.plugin_operation import PluginOperation
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
|
from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
|
||||||
from ytdl_sub.utils.exceptions import FileNotDownloadedException
|
from ytdl_sub.utils.exceptions import FileNotDownloadedException
|
||||||
|
|
@ -118,9 +118,7 @@ class FileConvertOptions(OptionsDictValidator):
|
||||||
"""
|
"""
|
||||||
return self._ffmpeg_post_process_args
|
return self._ffmpeg_post_process_args
|
||||||
|
|
||||||
def added_source_variables(
|
def modified_variables(self) -> Dict[PluginOperation, Set[str]]:
|
||||||
self, unresolved_variables: Set[str]
|
|
||||||
) -> Dict[PluginOperation, Set[str]]:
|
|
||||||
return {PluginOperation.MODIFY_ENTRY: {v.ext.variable_name}}
|
return {PluginOperation.MODIFY_ENTRY: {v.ext.variable_name}}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import OptionsValidator
|
from ytdl_sub.config.validators.options import OptionsValidator
|
||||||
from ytdl_sub.validators.validators import StringValidator
|
from ytdl_sub.validators.validators import StringValidator
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@ import copy
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from ytdl_sub.config.overrides import Overrides
|
from ytdl_sub.config.overrides import Overrides
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.utils.file_handler import FileMetadata
|
from ytdl_sub.utils.file_handler import FileMetadata
|
||||||
from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive
|
from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ from typing import Any
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.utils.logger import Logger
|
from ytdl_sub.utils.logger import Logger
|
||||||
from ytdl_sub.validators.validators import StringListValidator
|
from ytdl_sub.validators.validators import StringListValidator
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ from typing import List
|
||||||
|
|
||||||
import mediafile
|
import mediafile
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
|
from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
|
||||||
from ytdl_sub.utils.file_handler import FileMetadata
|
from ytdl_sub.utils.file_handler import FileMetadata
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ from typing import Dict
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.utils.file_handler import FileHandler
|
from ytdl_sub.utils.file_handler import FileHandler
|
||||||
from ytdl_sub.utils.file_handler import FileMetadata
|
from ytdl_sub.utils.file_handler import FileMetadata
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ from typing import Optional
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
from ytdl_sub.config.overrides import Overrides
|
from ytdl_sub.config.overrides import Overrides
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.plugin_operation import PluginOperation
|
from ytdl_sub.config.plugin.plugin_operation import PluginOperation
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.script.parser import parse
|
from ytdl_sub.script.parser import parse
|
||||||
from ytdl_sub.script.utils.exceptions import ScriptVariableNotResolved
|
from ytdl_sub.script.utils.exceptions import ScriptVariableNotResolved
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ from typing import Tuple
|
||||||
|
|
||||||
from yt_dlp.utils import sanitize_filename
|
from yt_dlp.utils import sanitize_filename
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import SplitPlugin
|
from ytdl_sub.config.plugin.plugin import SplitPlugin
|
||||||
from ytdl_sub.config.plugin_operation import PluginOperation
|
from ytdl_sub.config.plugin.plugin_operation import PluginOperation
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.entries.variables.kwargs import CHAPTERS
|
from ytdl_sub.entries.variables.kwargs import CHAPTERS
|
||||||
from ytdl_sub.entries.variables.kwargs import SPLIT_BY_CHAPTERS_PARENT_ENTRY
|
from ytdl_sub.entries.variables.kwargs import SPLIT_BY_CHAPTERS_PARENT_ENTRY
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,9 @@ from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.plugin_operation import PluginOperation
|
from ytdl_sub.config.plugin.plugin_operation import PluginOperation
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
|
from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ from typing import Optional
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
from ytdl_sub.config.overrides import Overrides
|
from ytdl_sub.config.overrides import Overrides
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.utils.file_handler import FileMetadata
|
from ytdl_sub.utils.file_handler import FileMetadata
|
||||||
from ytdl_sub.utils.logger import Logger
|
from ytdl_sub.utils.logger import Logger
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@ import copy
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset_options import OptionsDictValidator
|
from ytdl_sub.config.validators.options import OptionsDictValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.utils.ffmpeg import add_ffmpeg_metadata_key_values
|
from ytdl_sub.utils.ffmpeg import add_ffmpeg_metadata_key_values
|
||||||
from ytdl_sub.utils.file_handler import FileMetadata
|
from ytdl_sub.utils.file_handler import FileMetadata
|
||||||
|
|
|
||||||
|
|
@ -402,3 +402,7 @@ class Script:
|
||||||
return resolvable
|
return resolvable
|
||||||
|
|
||||||
raise RuntimeException(f"Tried to get unresolved variable {variable_name}")
|
raise RuntimeException(f"Tried to get unresolved variable {variable_name}")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def variable_names(self) -> Set[str]:
|
||||||
|
return set(list(self._variables.keys()))
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from typing import Optional
|
||||||
from ytdl_sub.config.config_validator import ConfigOptions
|
from ytdl_sub.config.config_validator import ConfigOptions
|
||||||
from ytdl_sub.config.overrides import Overrides
|
from ytdl_sub.config.overrides import Overrides
|
||||||
from ytdl_sub.config.preset import Preset
|
from ytdl_sub.config.preset import Preset
|
||||||
from ytdl_sub.config.preset import PresetPlugins
|
from ytdl_sub.config.plugin.preset_plugins import PresetPlugins
|
||||||
from ytdl_sub.config.preset_options import OutputOptions
|
from ytdl_sub.config.preset_options import OutputOptions
|
||||||
from ytdl_sub.config.preset_options import YTDLOptions
|
from ytdl_sub.config.preset_options import YTDLOptions
|
||||||
from ytdl_sub.downloaders.url.validators import MultiUrlValidator
|
from ytdl_sub.downloaders.url.validators import MultiUrlValidator
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,10 @@ from pathlib import Path
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.plugin import SplitPlugin
|
from ytdl_sub.config.plugin.plugin import SplitPlugin
|
||||||
from ytdl_sub.config.plugin_mapping import PluginMapping
|
from ytdl_sub.config.plugin.plugin_mapping import PluginMapping
|
||||||
from ytdl_sub.config.plugin_operation import PluginOperation
|
from ytdl_sub.config.plugin.plugin_operation import PluginOperation
|
||||||
from ytdl_sub.downloaders.info_json.info_json_downloader import InfoJsonDownloader
|
from ytdl_sub.downloaders.info_json.info_json_downloader import InfoJsonDownloader
|
||||||
from ytdl_sub.downloaders.info_json.info_json_downloader import InfoJsonDownloaderOptions
|
from ytdl_sub.downloaders.info_json.info_json_downloader import InfoJsonDownloaderOptions
|
||||||
from ytdl_sub.downloaders.source_plugin import SourcePlugin
|
from ytdl_sub.downloaders.source_plugin import SourcePlugin
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ from typing import TypeVar
|
||||||
|
|
||||||
from yt_dlp import match_filter_func
|
from yt_dlp import match_filter_func
|
||||||
|
|
||||||
from ytdl_sub.config.plugin import Plugin
|
from ytdl_sub.config.plugin.plugin import Plugin
|
||||||
from ytdl_sub.config.preset import Preset
|
from ytdl_sub.config.preset import Preset
|
||||||
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
|
||||||
from ytdl_sub.plugins.audio_extract import AudioExtractPlugin
|
from ytdl_sub.plugins.audio_extract import AudioExtractPlugin
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from typing import Optional
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from ytdl_sub.config.config_file import ConfigFile
|
from ytdl_sub.config.config_file import ConfigFile
|
||||||
from ytdl_sub.config.plugin_mapping import PluginMapping
|
from ytdl_sub.config.plugin.plugin_mapping import PluginMapping
|
||||||
from ytdl_sub.config.preset import PRESET_KEYS
|
from ytdl_sub.config.preset import PRESET_KEYS
|
||||||
from ytdl_sub.utils.exceptions import ValidationException
|
from ytdl_sub.utils.exceptions import ValidationException
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue