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
|
import re
|
||||||
from keyword import iskeyword
|
from keyword import iskeyword
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
from ytdl_subscribe.validators.base.string_validator import StringValidator
|
from ytdl_subscribe.validators.base.string_validator import StringValidator
|
||||||
from ytdl_subscribe.validators.exceptions import ValidationException
|
|
||||||
|
|
||||||
|
|
||||||
class StringFormatterValidator(StringValidator):
|
class StringFormatterValidator(StringValidator):
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,11 @@ from typing import Optional
|
||||||
|
|
||||||
from ytdl_subscribe.utils.enums import SubscriptionSourceName
|
from ytdl_subscribe.utils.enums import SubscriptionSourceName
|
||||||
from ytdl_subscribe.validators.base.dict_validator import DictValidator
|
from ytdl_subscribe.validators.base.dict_validator import DictValidator
|
||||||
from ytdl_subscribe.validators.config.sources.base_source_validator import (
|
from ytdl_subscribe.validators.config.sources.soundcloud_validators import (
|
||||||
BaseSourceValidator,
|
|
||||||
)
|
|
||||||
from ytdl_subscribe.validators.config.sources.soundcloud_source_validator import (
|
|
||||||
SoundcloudSourceValidator,
|
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,
|
YoutubeSourceValidator,
|
||||||
)
|
)
|
||||||
from ytdl_subscribe.validators.exceptions import ValidationException
|
from ytdl_subscribe.validators.exceptions import ValidationException
|
||||||
|
|
@ -27,7 +25,7 @@ class PresetValidator(DictValidator):
|
||||||
|
|
||||||
def __init__(self, name: str, value: Any):
|
def __init__(self, name: str, value: Any):
|
||||||
super().__init__(name=name, value=value)
|
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
|
self.subscription_source_name: Optional[str] = None
|
||||||
|
|
||||||
for object_key, object_value in self.object_items:
|
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