download strategy validator
This commit is contained in:
parent
623f495b60
commit
021ed500aa
8 changed files with 106 additions and 80 deletions
|
|
@ -1,10 +1,8 @@
|
|||
import re
|
||||
from keyword import iskeyword
|
||||
from typing import List
|
||||
from typing import Optional
|
||||
|
||||
from ytdl_subscribe.validators.base.string_validator import StringValidator
|
||||
from ytdl_subscribe.validators.exceptions import ValidationException
|
||||
|
||||
|
||||
class StringFormatterValidator(StringValidator):
|
||||
|
|
|
|||
|
|
@ -3,13 +3,11 @@ from typing import Optional
|
|||
|
||||
from ytdl_subscribe.utils.enums import SubscriptionSourceName
|
||||
from ytdl_subscribe.validators.base.dict_validator import DictValidator
|
||||
from ytdl_subscribe.validators.config.sources.base_source_validator import (
|
||||
BaseSourceValidator,
|
||||
)
|
||||
from ytdl_subscribe.validators.config.sources.soundcloud_source_validator import (
|
||||
from ytdl_subscribe.validators.config.sources.soundcloud_validators import (
|
||||
SoundcloudSourceValidator,
|
||||
)
|
||||
from ytdl_subscribe.validators.config.sources.youtube_source_validator import (
|
||||
from ytdl_subscribe.validators.config.sources.source_validator import SourceValidator
|
||||
from ytdl_subscribe.validators.config.sources.youtube_validators import (
|
||||
YoutubeSourceValidator,
|
||||
)
|
||||
from ytdl_subscribe.validators.exceptions import ValidationException
|
||||
|
|
@ -27,7 +25,7 @@ class PresetValidator(DictValidator):
|
|||
|
||||
def __init__(self, name: str, value: Any):
|
||||
super().__init__(name=name, value=value)
|
||||
self.subscription_source: Optional[BaseSourceValidator] = None
|
||||
self.subscription_source: Optional[SourceValidator] = None
|
||||
self.subscription_source_name: Optional[str] = None
|
||||
|
||||
for object_key, object_value in self.object_items:
|
||||
|
|
|
|||
|
|
@ -1,30 +0,0 @@
|
|||
from typing import Any
|
||||
from typing import Optional
|
||||
from typing import Set
|
||||
|
||||
from ytdl_subscribe.validators.base.dict_validator import DictValidator
|
||||
from ytdl_subscribe.validators.base.string_validator import StringValidator
|
||||
from ytdl_subscribe.validators.exceptions import ValidationException
|
||||
|
||||
|
||||
class BaseSourceValidator(DictValidator):
|
||||
# All media sources must define a download strategy
|
||||
required_fields = {"download_strategy"}
|
||||
download_strategies: Set[str] = {}
|
||||
|
||||
def _validate_and_get_download_strategy(self) -> str:
|
||||
download_strategy = self.validate_dict_value(
|
||||
dict_value_name="download_strategy",
|
||||
validator=StringValidator,
|
||||
)
|
||||
|
||||
if download_strategy.value not in self.download_strategies:
|
||||
raise self._validation_exception(
|
||||
f"download_strategy must be one of the following: {', '.join(self.download_strategies)}"
|
||||
)
|
||||
|
||||
return download_strategy.value
|
||||
|
||||
def __init__(self, name: str, value: Any):
|
||||
super().__init__(name=name, value=value)
|
||||
self.download_strategy = self._validate_and_get_download_strategy()
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
from typing import Optional
|
||||
|
||||
from ytdl_subscribe.validators.base.bool_validator import BoolValidator
|
||||
from ytdl_subscribe.validators.base.string_validator import StringValidator
|
||||
from ytdl_subscribe.validators.config.sources.base_source_validator import (
|
||||
BaseSourceValidator,
|
||||
)
|
||||
|
||||
|
||||
class SoundcloudSourceValidator(BaseSourceValidator):
|
||||
optional_fields = {"username", "skip_premiere_tracks"}
|
||||
download_strategies = {"albums_and_singles"}
|
||||
|
||||
def __validate_and_set_download_strategy_fields(self):
|
||||
if self.download_strategy == "albums_and_singles":
|
||||
self.username = self.validate_dict_value(
|
||||
dict_value_name="username",
|
||||
validator=StringValidator,
|
||||
).value
|
||||
|
||||
def __init__(self, name: str, value: dict):
|
||||
super().__init__(name=name, value=value)
|
||||
self.skip_premiere_tracks = self.validate_dict_value(
|
||||
"skip_premiere_tracks", BoolValidator, default=True
|
||||
).value
|
||||
self.username: Optional[str] = None
|
||||
self.__validate_and_set_download_strategy_fields()
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
from ytdl_subscribe.validators.base.bool_validator import BoolValidator
|
||||
from ytdl_subscribe.validators.base.string_validator import StringValidator
|
||||
from ytdl_subscribe.validators.config.sources.source_validator import (
|
||||
DownloadStrategyValidator,
|
||||
)
|
||||
from ytdl_subscribe.validators.config.sources.source_validator import SourceValidator
|
||||
|
||||
|
||||
class SoundcloudAlbumsAndSinglesDownloadValidator(DownloadStrategyValidator):
|
||||
required_fields = {"username"}
|
||||
|
||||
def __init__(self, name, value):
|
||||
super().__init__(name, value)
|
||||
self.username = self.validate_dict_value(
|
||||
dict_value_name="username", validator=StringValidator
|
||||
).value
|
||||
|
||||
|
||||
class SoundcloudSourceValidator(SourceValidator):
|
||||
optional_fields = {"skip_premiere_tracks"}
|
||||
|
||||
download_strategy_validator_mapping = {
|
||||
"albums_and_singles": SoundcloudAlbumsAndSinglesDownloadValidator
|
||||
}
|
||||
|
||||
def __init__(self, name: str, value: dict):
|
||||
super().__init__(name=name, value=value)
|
||||
self.skip_premiere_tracks = self.validate_dict_value(
|
||||
"skip_premiere_tracks", BoolValidator, default=True
|
||||
).value
|
||||
50
ytdl_subscribe/validators/config/sources/source_validator.py
Normal file
50
ytdl_subscribe/validators/config/sources/source_validator.py
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
import copy
|
||||
from typing import Any
|
||||
from typing import Dict
|
||||
from typing import Type
|
||||
|
||||
from ytdl_subscribe.validators.base.dict_validator import DictValidator
|
||||
from ytdl_subscribe.validators.base.string_validator import StringValidator
|
||||
|
||||
|
||||
class DownloadStrategyValidator(DictValidator):
|
||||
pass
|
||||
|
||||
|
||||
class SourceValidator(DictValidator):
|
||||
# All media sources must define a download strategy
|
||||
required_fields = {"download_strategy"}
|
||||
|
||||
# We allow extra fields at this level, once the download strategy is chosen,
|
||||
# all fields in the dict should be required.
|
||||
allow_extra_fields = True
|
||||
|
||||
download_strategy_validator_mapping: Dict[str, Type[DownloadStrategyValidator]] = {}
|
||||
|
||||
def __init__(self, name: str, value: Any):
|
||||
super().__init__(name=name, value=value)
|
||||
self.download_strategy_name = self.validate_dict_value(
|
||||
dict_value_name="download_strategy",
|
||||
validator=StringValidator,
|
||||
).value
|
||||
|
||||
if self.download_strategy_name not in self.possible_download_strategies:
|
||||
raise self._validation_exception(
|
||||
f"download_strategy must be one of the following: {', '.join(self.possible_download_strategies)}"
|
||||
)
|
||||
|
||||
# Remove all non-download strategy keys before passing the dict to the validator
|
||||
download_strategy_dict = copy.deepcopy(self.dict)
|
||||
for key_to_delete in self.allowed_fields:
|
||||
del download_strategy_dict[key_to_delete]
|
||||
|
||||
download_strategy_class = self.download_strategy_validator_mapping[
|
||||
self.download_strategy_name
|
||||
]
|
||||
self.download_strategy = download_strategy_class(
|
||||
name=self.name, value=download_strategy_dict
|
||||
)
|
||||
|
||||
@property
|
||||
def possible_download_strategies(self):
|
||||
return sorted(list(self.download_strategy_validator_mapping.keys()))
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
from typing import Any
|
||||
|
||||
from ytdl_subscribe.validators.base.string_validator import StringValidator
|
||||
from ytdl_subscribe.validators.config.sources.base_source_validator import (
|
||||
BaseSourceValidator,
|
||||
)
|
||||
|
||||
|
||||
class YoutubeSourceValidator(BaseSourceValidator):
|
||||
optional_fields = {"playlist_id"}
|
||||
download_strategies = {"playlist"}
|
||||
|
||||
def __init__(self, name: str, value: Any):
|
||||
super().__init__(name=name, value=value)
|
||||
self.playlist_id = self.validate_dict_value("playlist_id", StringValidator)
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
from typing import Any
|
||||
|
||||
from ytdl_subscribe.validators.base.string_validator import StringValidator
|
||||
from ytdl_subscribe.validators.config.sources.source_validator import (
|
||||
DownloadStrategyValidator,
|
||||
)
|
||||
from ytdl_subscribe.validators.config.sources.source_validator import SourceValidator
|
||||
|
||||
|
||||
class YoutubePlaylistDownloadValidator(DownloadStrategyValidator):
|
||||
required_fields = {"playlist_id"}
|
||||
|
||||
def __init__(self, name, value):
|
||||
super().__init__(name, value)
|
||||
self.playlist_id = self.validate_dict_value("playlist_id", StringValidator)
|
||||
|
||||
|
||||
class YoutubeSourceValidator(SourceValidator):
|
||||
download_strategy_validator_mapping = {"playlist": YoutubePlaylistDownloadValidator}
|
||||
|
||||
def __init__(self, name: str, value: Any):
|
||||
super().__init__(name=name, value=value)
|
||||
Loading…
Reference in a new issue