[FEATURE] Ability to add subscription __value__ via config

This commit is contained in:
Jesse Bannon 2023-09-25 22:53:39 -07:00
parent 6615e1d1ac
commit 3c105c11cc
3 changed files with 34 additions and 18 deletions

View file

@ -106,6 +106,7 @@ class ConfigOptions(StrictDictValidator):
"ffprobe_path", "ffprobe_path",
"file_name_max_bytes", "file_name_max_bytes",
"experimental", "experimental",
"subscription_value",
} }
def __init__(self, name: str, value: Any): def __init__(self, name: str, value: Any):
@ -138,6 +139,9 @@ class ConfigOptions(StrictDictValidator):
self._file_name_max_bytes = self._validate_key( self._file_name_max_bytes = self._validate_key(
key="file_name_max_bytes", validator=IntValidator, default=MAX_FILE_NAME_BYTES key="file_name_max_bytes", validator=IntValidator, default=MAX_FILE_NAME_BYTES
) )
self._subscription_value = self._validate_key_if_present(
key="subscription_value", validator=StringValidator
)
@property @property
def working_directory(self) -> str: def working_directory(self) -> str:
@ -230,6 +234,14 @@ class ConfigOptions(StrictDictValidator):
""" """
return self._ffprobe_path.value return self._ffprobe_path.value
@property
def subscription_value(self) -> Optional[str]:
"""
Optional. Sets the (TODO: LINK)
subscription value key for subscription files that use this config.
"""
return self._subscription_value.value if self._subscription_value else None
class ConfigValidator(StrictDictValidator): class ConfigValidator(StrictDictValidator):
_required_keys = {"configuration", "presets"} _required_keys = {"configuration", "presets"}

View file

@ -1,6 +1,7 @@
import copy import copy
from typing import Dict from typing import Dict
from typing import List from typing import List
from typing import Optional
from ytdl_sub.config.config_file import ConfigFile from ytdl_sub.config.config_file import ConfigFile
from ytdl_sub.config.preset import Preset from ytdl_sub.config.preset import Preset
@ -63,6 +64,18 @@ class Subscription(SubscriptionDownload):
config=config, config=config,
) )
@classmethod
def _maybe_get_subscription_value(cls, config: ConfigFile, subscription_dict: Dict) -> Optional[str]:
if FILE_SUBSCRIPTION_VALUE_KEY in subscription_dict:
if not isinstance(subscription_dict[FILE_SUBSCRIPTION_VALUE_KEY], str):
raise ValidationException(
f"Using {FILE_SUBSCRIPTION_VALUE_KEY} in a subscription"
f"must be a string that corresponds to an override variable"
)
return subscription_dict[FILE_SUBSCRIPTION_VALUE_KEY]
return config.config_options.subscription_value # can be None
@classmethod @classmethod
def from_file_path(cls, config: ConfigFile, subscription_path: str) -> List["Subscription"]: def from_file_path(cls, config: ConfigFile, subscription_path: str) -> List["Subscription"]:
""" """
@ -90,7 +103,9 @@ class Subscription(SubscriptionDownload):
subscription_dict = load_yaml(file_path=subscription_path) subscription_dict = load_yaml(file_path=subscription_path)
has_file_preset = FILE_PRESET_APPLY_KEY in subscription_dict has_file_preset = FILE_PRESET_APPLY_KEY in subscription_dict
has_file_subscription_value = FILE_SUBSCRIPTION_VALUE_KEY in subscription_dict file_subscription_value: Optional[str] = cls._maybe_get_subscription_value(
config=config, subscription_dict=subscription_dict
)
# If a file preset is present... # If a file preset is present...
if has_file_preset: if has_file_preset:
@ -104,13 +119,6 @@ class Subscription(SubscriptionDownload):
config = copy.deepcopy(config) config = copy.deepcopy(config)
config.presets.dict[FILE_PRESET_APPLY_KEY] = file_preset.dict config.presets.dict[FILE_PRESET_APPLY_KEY] = file_preset.dict
if has_file_subscription_value:
if not isinstance(subscription_dict[FILE_SUBSCRIPTION_VALUE_KEY], str):
raise ValidationException(
f"Using {FILE_SUBSCRIPTION_VALUE_KEY} in a subscription"
f"must be a string that corresponds to an override variable"
)
for subscription_key, subscription_object in subscription_dict.items(): for subscription_key, subscription_object in subscription_dict.items():
# Skip file preset or value # Skip file preset or value
@ -119,18 +127,14 @@ class Subscription(SubscriptionDownload):
# If the subscription obj is just a string, set it to the override variable # If the subscription obj is just a string, set it to the override variable
# defined in FILE_SUBSCRIPTION_VALUE_KEY # defined in FILE_SUBSCRIPTION_VALUE_KEY
if isinstance(subscription_object, str) and has_file_subscription_value: if isinstance(subscription_object, str) and file_subscription_value:
subscription_object = { subscription_object = {"overrides": {file_subscription_value: subscription_object}}
"overrides": {
subscription_dict[FILE_SUBSCRIPTION_VALUE_KEY]: subscription_object
}
}
elif isinstance(subscription_object, dict): elif isinstance(subscription_object, dict):
pass pass
elif isinstance(subscription_object, str) and not has_file_subscription_value: elif isinstance(subscription_object, str) and not file_subscription_value:
raise ValidationException( raise ValidationException(
f"Subscription {subscription_key} is a string, but " f"Subscription {subscription_key} is a string, but the subscription value "
f"{FILE_SUBSCRIPTION_VALUE_KEY} is not set to an override variable" f"is not set to an override variable"
) )
else: else:
raise ValidationException( raise ValidationException(

View file

@ -124,7 +124,7 @@ def test_subscription_file_using_value_when_not_defined(config_file: ConfigFile)
ValidationException, ValidationException,
match=re.escape( match=re.escape(
f"Subscription sub_name is a string, but " f"Subscription sub_name is a string, but "
f"{FILE_SUBSCRIPTION_VALUE_KEY} is not set to an override variable" f"the subscription value is not set to an override variable"
), ),
): ):
_ = Subscription.from_file_path(config=config_file, subscription_path="mocked") _ = Subscription.from_file_path(config=config_file, subscription_path="mocked")