diff --git a/ytdl_subscribe/validators/base/string_formatter_validator.py b/ytdl_subscribe/validators/base/string_formatter_validator.py index 00ef3c52..e516a2d5 100644 --- a/ytdl_subscribe/validators/base/string_formatter_validator.py +++ b/ytdl_subscribe/validators/base/string_formatter_validator.py @@ -2,6 +2,7 @@ import re from keyword import iskeyword from typing import List +from ytdl_subscribe.validators.base.validators import DictValidator from ytdl_subscribe.validators.base.validators import StringValidator @@ -65,3 +66,15 @@ class StringFormatterValidator(StringValidator): The literal format string, unformatted. """ return self._value + + +class DictFormatterValidator(DictValidator): + """ + Validates a dictionary made up of key: string_formatters + """ + + def __init__(self, name, value): + super().__init__(name, value) + + for key in self.keys: + _ = self.validate_key(key=key, validator=StringFormatterValidator) diff --git a/ytdl_subscribe/validators/base/validators.py b/ytdl_subscribe/validators/base/validators.py index cb1086dd..03ce8531 100644 --- a/ytdl_subscribe/validators/base/validators.py +++ b/ytdl_subscribe/validators/base/validators.py @@ -123,7 +123,10 @@ class DictValidator(Validator): return sorted(list(self.dict.keys())) def validate_key( - self, key: str, validator: Type[T], default: Optional[Any] = None + self, + key: str, + validator: Type[T], + default: Optional[Any] = None, ) -> T: """ Parameters @@ -149,3 +152,14 @@ class DictValidator(Validator): name=f"{self.name}.{key}", value=value, ) + + def validate_key_if_present( + self, + key: str, + validator: Type[T], + default: Optional[Any] = None, + ) -> Optional[T]: + if key not in self.dict: + return None + + return self.validate_key(key=key, validator=validator, default=default) diff --git a/ytdl_subscribe/validators/config/metadata_options/__init__.py b/ytdl_subscribe/validators/config/metadata_options/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ytdl_subscribe/validators/config/metadata_options/id3_validator.py b/ytdl_subscribe/validators/config/metadata_options/id3_validator.py new file mode 100644 index 00000000..300dd0ee --- /dev/null +++ b/ytdl_subscribe/validators/config/metadata_options/id3_validator.py @@ -0,0 +1,27 @@ +from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator +from ytdl_subscribe.validators.base.string_formatter_validator import ( + DictFormatterValidator, +) +from ytdl_subscribe.validators.base.string_select_validator import StringSelectValidator +from ytdl_subscribe.validators.base.validators import StringValidator + + +class Id3VersionValidator(StringSelectValidator): + select_values = {"2.3", "2.4"} + + +class Id3Validator(StrictDictValidator): + required_keys = {"id3_version", "tags"} + optional_keys = {"multi_value_separator"} + + def __init__(self, name, value): + super().__init__(name, value) + + self.id3_version = self.validate_key( + key="id3_version", validator=Id3VersionValidator + ).value + self.tags = self.validate_key(key="tags", validator=DictFormatterValidator) + + self.multi_value_separator = self.validate_key_if_present( + key="multi_value_separator", validator=StringValidator + ) diff --git a/ytdl_subscribe/validators/config/metadata_options_validator.py b/ytdl_subscribe/validators/config/metadata_options/metadata_options_validator.py similarity index 53% rename from ytdl_subscribe/validators/config/metadata_options_validator.py rename to ytdl_subscribe/validators/config/metadata_options/metadata_options_validator.py index cd4ef624..d699a7cf 100644 --- a/ytdl_subscribe/validators/config/metadata_options_validator.py +++ b/ytdl_subscribe/validators/config/metadata_options/metadata_options_validator.py @@ -4,7 +4,8 @@ from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValid from ytdl_subscribe.validators.base.string_formatter_validator import ( StringFormatterValidator, ) -from ytdl_subscribe.validators.base.string_select_validator import StringSelectValidator +from ytdl_subscribe.validators.config.metadata_options.id3_validator import Id3Validator +from ytdl_subscribe.validators.config.metadata_options.nfo_validator import NFOValidator class MetadataOptionsValidator(StrictDictValidator): @@ -13,6 +14,9 @@ class MetadataOptionsValidator(StrictDictValidator): def __init__(self, name, value): super().__init__(name, value) + self.id3 = self.validate_key_if_present(key="id3", validator=Id3Validator) + self.nfo = self.validate_key_if_present(key="nfo", validator=NFOValidator) + self.output_directory: StringFormatterValidator = self.validate_key( key="output_directory", validator=StringFormatterValidator ) @@ -20,15 +24,3 @@ class MetadataOptionsValidator(StrictDictValidator): self.file_name: StringFormatterValidator = self.validate_key( key="file_name", validator=StringFormatterValidator ) - - self.convert_thumbnail: Optional[str] = None - if "convert_thumbnail" in self.dict: - self.convert_thumbnail = self.validate_key( - key="convert_thumbnail", validator=ConvertThumbnailValidator - ).value - - self.thumbnail_name: Optional[StringFormatterValidator] = None - if "thumbnail_name" in self.dict: - self.thumbnail_name = self.validate_key( - key="thumbnail_name", validator=StringFormatterValidator - ) diff --git a/ytdl_subscribe/validators/config/metadata_options/nfo_validator.py b/ytdl_subscribe/validators/config/metadata_options/nfo_validator.py new file mode 100644 index 00000000..a56c7d5f --- /dev/null +++ b/ytdl_subscribe/validators/config/metadata_options/nfo_validator.py @@ -0,0 +1,24 @@ +from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator +from ytdl_subscribe.validators.base.string_formatter_validator import ( + DictFormatterValidator, +) +from ytdl_subscribe.validators.base.string_formatter_validator import ( + StringFormatterValidator, +) +from ytdl_subscribe.validators.base.string_select_validator import StringSelectValidator +from ytdl_subscribe.validators.base.validators import StringValidator + + +class NFOValidator(StrictDictValidator): + required_keys = {"nfo_name", "nfo_root", "tags"} + + def __init__(self, name, value): + super().__init__(name, value) + + self.nfo_name = self.validate_key( + key="nfo_name", validator=StringFormatterValidator + ) + self.nfo_root = self.validate_key( + key="nfo_root", validator=StringFormatterValidator + ) + self.tags = self.validate_key(key="tags", validator=DictFormatterValidator) diff --git a/ytdl_subscribe/validators/config/output_options/__init__.py b/ytdl_subscribe/validators/config/output_options/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ytdl_subscribe/validators/config/output_options_validator.py b/ytdl_subscribe/validators/config/output_options/output_options_validator.py similarity index 65% rename from ytdl_subscribe/validators/config/output_options_validator.py rename to ytdl_subscribe/validators/config/output_options/output_options_validator.py index b293cdbd..5d22da86 100644 --- a/ytdl_subscribe/validators/config/output_options_validator.py +++ b/ytdl_subscribe/validators/config/output_options/output_options_validator.py @@ -21,19 +21,13 @@ class OutputOptionsValidator(StrictDictValidator): self.output_directory: StringFormatterValidator = self.validate_key( key="output_directory", validator=StringFormatterValidator ) - self.file_name: StringFormatterValidator = self.validate_key( key="file_name", validator=StringFormatterValidator ) - self.convert_thumbnail: Optional[str] = None - if "convert_thumbnail" in self.dict: - self.convert_thumbnail = self.validate_key( - key="convert_thumbnail", validator=ConvertThumbnailValidator - ).value - - self.thumbnail_name: Optional[StringFormatterValidator] = None - if "thumbnail_name" in self.dict: - self.thumbnail_name = self.validate_key( - key="thumbnail_name", validator=StringFormatterValidator - ) + self.convert_thumbnail = self.validate_key_if_present( + key="convert_thumbnail", validator=ConvertThumbnailValidator + ) + self.thumbnail_name = self.validate_key_if_present( + key="thumbnail_name", validator=StringFormatterValidator + ) diff --git a/ytdl_subscribe/validators/config/preset_validator.py b/ytdl_subscribe/validators/config/preset_validator.py index 49f0a887..46ffb596 100644 --- a/ytdl_subscribe/validators/config/preset_validator.py +++ b/ytdl_subscribe/validators/config/preset_validator.py @@ -4,7 +4,14 @@ from typing import Tuple from ytdl_subscribe.utils.enums import SubscriptionSourceName from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator -from ytdl_subscribe.validators.config.output_options_validator import ( +from ytdl_subscribe.validators.base.string_formatter_validator import ( + DictFormatterValidator, +) +from ytdl_subscribe.validators.base.validators import DictValidator +from ytdl_subscribe.validators.config.metadata_options.metadata_options_validator import ( + MetadataOptionsValidator, +) +from ytdl_subscribe.validators.config.output_options.output_options_validator import ( OutputOptionsValidator, ) from ytdl_subscribe.validators.config.sources.soundcloud_validators import ( @@ -62,7 +69,19 @@ class PresetValidator(StrictDictValidator): self.subscription_source_name, self.subscription_source, ) = self.__validate_and_get_subscription_source() + self.output_options = self.validate_key( key="output_options", validator=OutputOptionsValidator, ) + self.metadata_options = self.validate_key( + key="metadata_options", validator=MetadataOptionsValidator + ) + + self.ytdl_options = self.validate_key_if_present( + key="ytdl_options", validator=DictValidator + ) + + self.overrides = self.validate_key_if_present( + key="overrides", validator=DictFormatterValidator + )