big midnight refactor

This commit is contained in:
jbannon 2022-04-22 07:34:51 +00:00
parent 7a3144a838
commit 139d82e126
44 changed files with 182 additions and 253 deletions

View file

@ -1,7 +1,7 @@
import pytest import pytest
from ytdl_subscribe.entries.entry import Entry from ytdl_subscribe.entries.entry import Entry
from ytdl_subscribe.validators.base.string_formatter_validators import StringFormatterValidator from ytdl_subscribe.validators.string_formatter_validators import StringFormatterValidator
def _pad(num): def _pad(num):

View file

@ -1,7 +1,7 @@
import pytest import pytest
from ytdl_subscribe.validators.base.validators import BoolValidator from ytdl_subscribe.utils.exceptions import ValidationException
from ytdl_subscribe.validators.exceptions import ValidationException from ytdl_subscribe.validators.validators import BoolValidator
@pytest.mark.parametrize("value", [True, False]) @pytest.mark.parametrize("value", [True, False])

View file

@ -1,10 +1,10 @@
import pytest import pytest
from ytdl_subscribe.validators.base.validators import BoolValidator from ytdl_subscribe.utils.exceptions import ValidationException
from ytdl_subscribe.validators.base.validators import DictValidator from ytdl_subscribe.validators.validators import BoolValidator
from ytdl_subscribe.validators.base.validators import LiteralDictValidator from ytdl_subscribe.validators.validators import DictValidator
from ytdl_subscribe.validators.base.validators import StringValidator from ytdl_subscribe.validators.validators import LiteralDictValidator
from ytdl_subscribe.validators.exceptions import ValidationException from ytdl_subscribe.validators.validators import StringValidator
class TestDictValidator: class TestDictValidator:

View file

@ -1,15 +1,11 @@
import pytest import pytest
from ytdl_subscribe.validators.base.string_formatter_validators import DictFormatterValidator from ytdl_subscribe.utils.exceptions import StringFormattingException
from ytdl_subscribe.validators.base.string_formatter_validators import ( from ytdl_subscribe.utils.exceptions import ValidationException
OverridesDictFormatterValidator, from ytdl_subscribe.validators.string_formatter_validators import DictFormatterValidator
) from ytdl_subscribe.validators.string_formatter_validators import OverridesDictFormatterValidator
from ytdl_subscribe.validators.base.string_formatter_validators import ( from ytdl_subscribe.validators.string_formatter_validators import OverridesStringFormatterValidator
OverridesStringFormatterValidator, from ytdl_subscribe.validators.string_formatter_validators import StringFormatterValidator
)
from ytdl_subscribe.validators.base.string_formatter_validators import StringFormatterValidator
from ytdl_subscribe.validators.exceptions import StringFormattingException
from ytdl_subscribe.validators.exceptions import ValidationException
@pytest.fixture @pytest.fixture

View file

@ -1,7 +1,7 @@
import pytest import pytest
from ytdl_subscribe.validators.base.validators import StringValidator from ytdl_subscribe.utils.exceptions import ValidationException
from ytdl_subscribe.validators.exceptions import ValidationException from ytdl_subscribe.validators.validators import StringValidator
@pytest.mark.parametrize("value", ["a", "unicode 💩", ""]) @pytest.mark.parametrize("value", ["a", "unicode 💩", ""])

View file

@ -2,11 +2,9 @@ from typing import Any
import yaml import yaml
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator from ytdl_subscribe.config.config_options_validator import ConfigOptionsValidator
from ytdl_subscribe.validators.base.validators import LiteralDictValidator from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.config.config_options.config_options_validator import ( from ytdl_subscribe.validators.validators import LiteralDictValidator
ConfigOptionsValidator,
)
class ConfigPresetsValidator(LiteralDictValidator): class ConfigPresetsValidator(LiteralDictValidator):

View file

@ -1,7 +1,7 @@
from typing import Any from typing import Any
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.validators import StringValidator from ytdl_subscribe.validators.validators import StringValidator
class ConfigOptionsValidator(StrictDictValidator): class ConfigOptionsValidator(StrictDictValidator):

View file

@ -4,21 +4,15 @@ from typing import Any
from typing import Dict from typing import Dict
from typing import Type from typing import Type
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator from ytdl_subscribe.downloaders.downloader import DownloaderValidator
from ytdl_subscribe.validators.base.validators import StringValidator from ytdl_subscribe.downloaders.soundcloud_downloader import (
from ytdl_subscribe.validators.config.source_options.soundcloud_validators import (
SoundcloudAlbumsAndSinglesSourceValidator, SoundcloudAlbumsAndSinglesSourceValidator,
) )
from ytdl_subscribe.validators.config.source_options.source_validators import SourceValidator from ytdl_subscribe.downloaders.youtube_downloader import YoutubeChannelDownloaderValidator
from ytdl_subscribe.validators.config.source_options.youtube_validators import ( from ytdl_subscribe.downloaders.youtube_downloader import YoutubePlaylistDownloaderValidator
YoutubeChannelSourceValidator, from ytdl_subscribe.downloaders.youtube_downloader import YoutubeVideoDownloaderValidator
) from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.config.source_options.youtube_validators import ( from ytdl_subscribe.validators.validators import StringValidator
YoutubePlaylistSourceValidator,
)
from ytdl_subscribe.validators.config.source_options.youtube_validators import (
YoutubeVideoSourceValidator,
)
class DownloadStrategyValidator(StrictDictValidator, ABC): class DownloadStrategyValidator(StrictDictValidator, ABC):
@ -32,7 +26,7 @@ class DownloadStrategyValidator(StrictDictValidator, ABC):
# Extra fields will be strict-validated using other StictDictValidators # Extra fields will be strict-validated using other StictDictValidators
_allow_extra_keys = True _allow_extra_keys = True
_download_strategy_to_source_mapping: Dict[str, Type[SourceValidator]] = {} _download_strategy_to_source_mapping: Dict[str, Type[DownloaderValidator]] = {}
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)
@ -68,7 +62,7 @@ class SoundcloudDownloadStrategyValidator(DownloadStrategyValidator):
class YoutubeDownloadStrategyValidator(DownloadStrategyValidator): class YoutubeDownloadStrategyValidator(DownloadStrategyValidator):
_download_strategy_to_source_mapping = { _download_strategy_to_source_mapping = {
"channel": YoutubeChannelSourceValidator, "channel": YoutubeChannelDownloaderValidator,
"playlist": YoutubePlaylistSourceValidator, "playlist": YoutubePlaylistDownloaderValidator,
"video": YoutubeVideoSourceValidator, "video": YoutubeVideoDownloaderValidator,
} }

View file

@ -1,9 +1,7 @@
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.string_formatter_validators import ( from ytdl_subscribe.validators.string_formatter_validators import OverridesStringFormatterValidator
OverridesStringFormatterValidator, from ytdl_subscribe.validators.string_formatter_validators import StringFormatterValidator
) from ytdl_subscribe.validators.validators import BoolValidator
from ytdl_subscribe.validators.base.string_formatter_validators import StringFormatterValidator
from ytdl_subscribe.validators.base.validators import BoolValidator
class OutputOptionsValidator(StrictDictValidator): class OutputOptionsValidator(StrictDictValidator):

View file

@ -3,8 +3,8 @@ from typing import Optional
from yt_dlp.utils import sanitize_filename from yt_dlp.utils import sanitize_filename
from ytdl_subscribe.entries.entry import Entry from ytdl_subscribe.entries.entry import Entry
from ytdl_subscribe.validators.base.string_formatter_validators import DictFormatterValidator from ytdl_subscribe.validators.string_formatter_validators import DictFormatterValidator
from ytdl_subscribe.validators.base.string_formatter_validators import StringFormatterValidator from ytdl_subscribe.validators.string_formatter_validators import StringFormatterValidator
class OverridesValidator(DictFormatterValidator): class OverridesValidator(DictFormatterValidator):

View file

@ -4,34 +4,19 @@ from typing import List
from typing import Optional from typing import Optional
from typing import Type from typing import Type
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator from ytdl_subscribe.config.download_strategy_validators import DownloadStrategyValidator
from ytdl_subscribe.validators.base.string_formatter_validators import ( from ytdl_subscribe.config.download_strategy_validators import SoundcloudDownloadStrategyValidator
OverridesStringFormatterValidator, from ytdl_subscribe.config.download_strategy_validators import YoutubeDownloadStrategyValidator
) from ytdl_subscribe.config.output_options_validator import OutputOptionsValidator
from ytdl_subscribe.validators.base.validators import DictValidator from ytdl_subscribe.config.overrides_validator import OverridesValidator
from ytdl_subscribe.validators.base.validators import Validator from ytdl_subscribe.config.ytdl_options_validator import YTDLOptionsValidator
from ytdl_subscribe.validators.config.metadata_options.metadata_options_validator import ( from ytdl_subscribe.downloaders.downloader import DownloaderValidator
MetadataOptionsValidator, from ytdl_subscribe.utils.exceptions import StringFormattingVariableNotFoundException
) from ytdl_subscribe.utils.exceptions import ValidationException
from ytdl_subscribe.validators.config.output_options.output_options_validator import ( from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
OutputOptionsValidator, from ytdl_subscribe.validators.string_formatter_validators import OverridesStringFormatterValidator
) from ytdl_subscribe.validators.validators import DictValidator
from ytdl_subscribe.validators.config.overrides.overrides_validator import OverridesValidator from ytdl_subscribe.validators.validators import Validator
from ytdl_subscribe.validators.config.source_options.download_strategy_validators import (
DownloadStrategyValidator,
)
from ytdl_subscribe.validators.config.source_options.download_strategy_validators import (
SoundcloudDownloadStrategyValidator,
)
from ytdl_subscribe.validators.config.source_options.download_strategy_validators import (
YoutubeDownloadStrategyValidator,
)
from ytdl_subscribe.validators.config.source_options.source_validators import SourceValidator
from ytdl_subscribe.validators.config.ytdl_options.ytdl_options_validator import (
YTDLOptionsValidator,
)
from ytdl_subscribe.validators.exceptions import StringFormattingVariableNotFoundException
from ytdl_subscribe.validators.exceptions import ValidationException
PRESET_SOURCE_VALIDATOR_MAPPING: Dict[str, Type[DownloadStrategyValidator]] = { PRESET_SOURCE_VALIDATOR_MAPPING: Dict[str, Type[DownloadStrategyValidator]] = {
"soundcloud": SoundcloudDownloadStrategyValidator, "soundcloud": SoundcloudDownloadStrategyValidator,
@ -55,7 +40,7 @@ class PresetValidator(StrictDictValidator):
def __available_sources(self) -> List[str]: def __available_sources(self) -> List[str]:
return sorted(list(PRESET_SOURCE_VALIDATOR_MAPPING.keys())) return sorted(list(PRESET_SOURCE_VALIDATOR_MAPPING.keys()))
def __validate_and_get_subscription_source(self) -> SourceValidator: def __validate_and_get_subscription_source(self) -> DownloaderValidator:
download_strategy_validator: Optional[DownloadStrategyValidator] = None download_strategy_validator: Optional[DownloadStrategyValidator] = None
for key in self._keys: for key in self._keys:
@ -130,9 +115,8 @@ class PresetValidator(StrictDictValidator):
key="output_options", key="output_options",
validator=OutputOptionsValidator, validator=OutputOptionsValidator,
) )
self.metadata_options = self._validate_key(
key="metadata_options", validator=MetadataOptionsValidator # TODO: REPLACE METADATA OPTIONS WITH PLUGINS
)
self.ytdl_options = self._validate_key( self.ytdl_options = self._validate_key(
key="ytdl_options", validator=YTDLOptionsValidator, default={} key="ytdl_options", validator=YTDLOptionsValidator, default={}

View file

@ -8,30 +8,24 @@ from typing import Type
import yaml import yaml
from mergedeep import mergedeep from mergedeep import mergedeep
from ytdl_subscribe.config.config_file_validator import ConfigFileValidator
from ytdl_subscribe.config.overrides_validator import OverridesValidator
from ytdl_subscribe.config.preset_validator import PRESET_OPTIONAL_KEYS
from ytdl_subscribe.config.preset_validator import PRESET_REQUIRED_KEYS
from ytdl_subscribe.config.preset_validator import PresetValidator
from ytdl_subscribe.downloaders.soundcloud_downloader import (
SoundcloudAlbumsAndSinglesSourceValidator,
)
from ytdl_subscribe.downloaders.youtube_downloader import YoutubeChannelDownloaderValidator
from ytdl_subscribe.downloaders.youtube_downloader import YoutubePlaylistDownloaderValidator
from ytdl_subscribe.downloaders.youtube_downloader import YoutubeVideoDownloaderValidator
from ytdl_subscribe.subscriptions.soundcloud import SoundcloudAlbumsAndSinglesSubscription from ytdl_subscribe.subscriptions.soundcloud import SoundcloudAlbumsAndSinglesSubscription
from ytdl_subscribe.subscriptions.subscription import Subscription from ytdl_subscribe.subscriptions.subscription import Subscription
from ytdl_subscribe.subscriptions.youtube import YoutubeChannelSubscription from ytdl_subscribe.subscriptions.youtube import YoutubeChannelSubscription
from ytdl_subscribe.subscriptions.youtube import YoutubePlaylistSubscription from ytdl_subscribe.subscriptions.youtube import YoutubePlaylistSubscription
from ytdl_subscribe.subscriptions.youtube import YoutubeVideoSubscription from ytdl_subscribe.subscriptions.youtube import YoutubeVideoSubscription
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.validators import StringValidator from ytdl_subscribe.validators.validators import StringValidator
from ytdl_subscribe.validators.config.config_file_validator import ConfigFileValidator
from ytdl_subscribe.validators.config.overrides.overrides_validator import OverridesValidator
from ytdl_subscribe.validators.config.preset_validator import PRESET_OPTIONAL_KEYS
from ytdl_subscribe.validators.config.preset_validator import PRESET_REQUIRED_KEYS
from ytdl_subscribe.validators.config.preset_validator import PresetValidator
from ytdl_subscribe.validators.config.source_options.soundcloud_validators import (
SoundcloudAlbumsAndSinglesSourceValidator,
)
from ytdl_subscribe.validators.config.source_options.youtube_validators import (
YoutubeChannelSourceValidator,
)
from ytdl_subscribe.validators.config.source_options.youtube_validators import (
YoutubePlaylistSourceValidator,
)
from ytdl_subscribe.validators.config.source_options.youtube_validators import (
YoutubeVideoSourceValidator,
)
class SubscriptionValidator(StrictDictValidator): class SubscriptionValidator(StrictDictValidator):
@ -79,11 +73,11 @@ class SubscriptionValidator(StrictDictValidator):
subscription_class: Optional[Type[Subscription]] = None subscription_class: Optional[Type[Subscription]] = None
if isinstance(self.preset.subscription_source, SoundcloudAlbumsAndSinglesSourceValidator): if isinstance(self.preset.subscription_source, SoundcloudAlbumsAndSinglesSourceValidator):
subscription_class = SoundcloudAlbumsAndSinglesSubscription subscription_class = SoundcloudAlbumsAndSinglesSubscription
elif isinstance(self.preset.subscription_source, YoutubePlaylistSourceValidator): elif isinstance(self.preset.subscription_source, YoutubePlaylistDownloaderValidator):
subscription_class = YoutubePlaylistSubscription subscription_class = YoutubePlaylistSubscription
elif isinstance(self.preset.subscription_source, YoutubeVideoSourceValidator): elif isinstance(self.preset.subscription_source, YoutubeVideoDownloaderValidator):
subscription_class = YoutubeVideoSubscription subscription_class = YoutubeVideoSubscription
elif isinstance(self.preset.subscription_source, YoutubeChannelSourceValidator): elif isinstance(self.preset.subscription_source, YoutubeChannelDownloaderValidator):
subscription_class = YoutubeChannelSubscription subscription_class = YoutubeChannelSubscription
if subscription_class is None: if subscription_class is None:
raise ValueError("subscription source class not found") raise ValueError("subscription source class not found")

View file

@ -1,4 +1,4 @@
from ytdl_subscribe.validators.base.validators import LiteralDictValidator from ytdl_subscribe.validators.validators import LiteralDictValidator
class YTDLOptionsValidator(LiteralDictValidator): class YTDLOptionsValidator(LiteralDictValidator):

View file

@ -1,3 +1,4 @@
from abc import ABC
from contextlib import contextmanager from contextlib import contextmanager
from pathlib import Path from pathlib import Path
from typing import Dict from typing import Dict
@ -5,6 +6,14 @@ from typing import Optional
import yt_dlp as ytdl import yt_dlp as ytdl
from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
class DownloaderValidator(StrictDictValidator, ABC):
"""
Placeholder class to define downloader options
"""
class Downloader: class Downloader:
""" """

View file

@ -1,9 +1,27 @@
from abc import ABC
from typing import Dict from typing import Dict
from typing import List from typing import List
from ytdl_subscribe.downloaders.downloader import Downloader from ytdl_subscribe.downloaders.downloader import Downloader
from ytdl_subscribe.downloaders.downloader import DownloaderValidator
from ytdl_subscribe.entries.soundcloud import SoundcloudAlbum from ytdl_subscribe.entries.soundcloud import SoundcloudAlbum
from ytdl_subscribe.entries.soundcloud import SoundcloudTrack from ytdl_subscribe.entries.soundcloud import SoundcloudTrack
from ytdl_subscribe.validators.validators import BoolValidator
from ytdl_subscribe.validators.validators import StringValidator
class SoundcloudDownloaderValidator(DownloaderValidator, ABC):
"""
Abstract source validator for all soundcloud sources.
"""
_optional_keys = {"skip_premiere_tracks"}
def __init__(self, name: str, value: dict):
super().__init__(name=name, value=value)
self.skip_premiere_tracks = self._validate_key(
"skip_premiere_tracks", BoolValidator, default=True
)
class SoundcloudDownloader(Downloader): class SoundcloudDownloader(Downloader):
@ -48,3 +66,11 @@ class SoundcloudDownloader(Downloader):
SoundcloudTrack(working_directory=self.working_directory, kwargs=e) SoundcloudTrack(working_directory=self.working_directory, kwargs=e)
for e in info["entries"] for e in info["entries"]
] ]
class SoundcloudAlbumsAndSinglesSourceValidator(SoundcloudDownloaderValidator):
_required_keys = {"username"}
def __init__(self, name, value):
super().__init__(name, value)
self.username = self._validate_key(key="username", validator=StringValidator)

View file

@ -1,12 +1,22 @@
import json import json
import os import os
from abc import ABC
from pathlib import Path from pathlib import Path
from typing import List from typing import List
from yt_dlp.utils import RejectedVideoReached from yt_dlp.utils import RejectedVideoReached
from ytdl_subscribe.downloaders.downloader import Downloader from ytdl_subscribe.downloaders.downloader import Downloader
from ytdl_subscribe.downloaders.downloader import DownloaderValidator
from ytdl_subscribe.entries.youtube import YoutubeVideo from ytdl_subscribe.entries.youtube import YoutubeVideo
from ytdl_subscribe.validators.date_range_validator import DownloadDateRangeSource
from ytdl_subscribe.validators.validators import StringValidator
class YoutubeDownloaderValidator(DownloaderValidator, ABC):
"""
Abstract source validator for all soundcloud sources.
"""
class YoutubeDownloader(Downloader): class YoutubeDownloader(Downloader):
@ -86,3 +96,29 @@ class YoutubeDownloader(Downloader):
entries.append(YoutubeVideo(**json.load(file))) entries.append(YoutubeVideo(**json.load(file)))
return entries return entries
class YoutubePlaylistDownloaderValidator(YoutubeDownloaderValidator):
_required_keys = {"playlist_id"}
def __init__(self, name, value):
super().__init__(name, value)
self.playlist_id = self._validate_key("playlist_id", StringValidator)
class YoutubeChannelDownloaderValidator(YoutubeDownloaderValidator, DownloadDateRangeSource):
_required_keys = {"channel_id"}
_optional_keys = {"before", "after"}
def __init__(self, name, value):
YoutubeDownloaderValidator.__init__(self, name, value)
DownloadDateRangeSource.__init__(self, name, value)
self.channel_id = self._validate_key("channel_id", StringValidator)
class YoutubeVideoDownloaderValidator(YoutubeDownloaderValidator):
_required_keys = {"video_id"}
def __init__(self, name, value):
super().__init__(name, value)
self.video_id = self._validate_key("video_id", StringValidator)

View file

@ -5,9 +5,9 @@ from typing import List
from ytdl_subscribe.cli.download_args_parser import DownloadArgsParser from ytdl_subscribe.cli.download_args_parser import DownloadArgsParser
from ytdl_subscribe.cli.main_args_parser import parser from ytdl_subscribe.cli.main_args_parser import parser
from ytdl_subscribe.validators.config.config_file_validator import ConfigFileValidator from ytdl_subscribe.config.config_file_validator import ConfigFileValidator
from ytdl_subscribe.validators.config.subscription_validator import SubscriptionValidator from ytdl_subscribe.config.subscription_validator import SubscriptionValidator
from ytdl_subscribe.validators.exceptions import ValidationException from ytdl_subscribe.utils.exceptions import ValidationException
def _download_subscriptions_from_yaml_files( def _download_subscriptions_from_yaml_files(

View file

@ -5,7 +5,7 @@ from PIL.Image import Image
from ytdl_subscribe.entries.entry import Entry from ytdl_subscribe.entries.entry import Entry
from ytdl_subscribe.plugins.plugin import Plugin from ytdl_subscribe.plugins.plugin import Plugin
from ytdl_subscribe.plugins.plugin import PluginValidator from ytdl_subscribe.plugins.plugin import PluginValidator
from ytdl_subscribe.validators.base.string_select_validator import StringSelectValidator from ytdl_subscribe.validators.string_select_validator import StringSelectValidator
class ThumbnailTypes(StringSelectValidator): class ThumbnailTypes(StringSelectValidator):

View file

@ -3,8 +3,8 @@ import music_tag
from ytdl_subscribe.entries.entry import Entry from ytdl_subscribe.entries.entry import Entry
from ytdl_subscribe.plugins.plugin import Plugin from ytdl_subscribe.plugins.plugin import Plugin
from ytdl_subscribe.plugins.plugin import PluginValidator from ytdl_subscribe.plugins.plugin import PluginValidator
from ytdl_subscribe.validators.base.string_formatter_validators import DictFormatterValidator from ytdl_subscribe.validators.string_formatter_validators import DictFormatterValidator
from ytdl_subscribe.validators.base.validators import StringValidator from ytdl_subscribe.validators.validators import StringValidator
class MusicTagsValidator(PluginValidator): class MusicTagsValidator(PluginValidator):

View file

@ -5,8 +5,8 @@ import dicttoxml
from ytdl_subscribe.entries.entry import Entry from ytdl_subscribe.entries.entry import Entry
from ytdl_subscribe.plugins.plugin import Plugin from ytdl_subscribe.plugins.plugin import Plugin
from ytdl_subscribe.plugins.plugin import PluginValidator from ytdl_subscribe.plugins.plugin import PluginValidator
from ytdl_subscribe.validators.base.string_formatter_validators import DictFormatterValidator from ytdl_subscribe.validators.string_formatter_validators import DictFormatterValidator
from ytdl_subscribe.validators.base.string_formatter_validators import StringFormatterValidator from ytdl_subscribe.validators.string_formatter_validators import StringFormatterValidator
class NfoTagsValidator(PluginValidator): class NfoTagsValidator(PluginValidator):

View file

@ -4,12 +4,8 @@ import dicttoxml
from ytdl_subscribe.plugins.plugin import Plugin from ytdl_subscribe.plugins.plugin import Plugin
from ytdl_subscribe.plugins.plugin import PluginValidator from ytdl_subscribe.plugins.plugin import PluginValidator
from ytdl_subscribe.validators.base.string_formatter_validators import ( from ytdl_subscribe.validators.string_formatter_validators import OverridesDictFormatterValidator
OverridesDictFormatterValidator, from ytdl_subscribe.validators.string_formatter_validators import OverridesStringFormatterValidator
)
from ytdl_subscribe.validators.base.string_formatter_validators import (
OverridesStringFormatterValidator,
)
class OutputDirectoryNfoTagsValidator(PluginValidator): class OutputDirectoryNfoTagsValidator(PluginValidator):

View file

@ -1,13 +1,11 @@
from abc import ABC from abc import ABC
from typing import Generic from typing import Generic
from typing import Optional
from typing import TypeVar from typing import TypeVar
from typing import final from typing import final
from ytdl_subscribe.config.overrides_validator import OverridesValidator
from ytdl_subscribe.entries.entry import Entry from ytdl_subscribe.entries.entry import Entry
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.string_formatter_validators import StringFormatterValidator
from ytdl_subscribe.validators.config.overrides.overrides_validator import OverridesValidator
from ytdl_subscribe.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive from ytdl_subscribe.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive

View file

@ -1,12 +1,12 @@
from typing import List from typing import List
from ytdl_subscribe.downloaders.soundcloud_downloader import (
SoundcloudAlbumsAndSinglesSourceValidator,
)
from ytdl_subscribe.downloaders.soundcloud_downloader import SoundcloudDownloader from ytdl_subscribe.downloaders.soundcloud_downloader import SoundcloudDownloader
from ytdl_subscribe.entries.soundcloud import SoundcloudAlbum from ytdl_subscribe.entries.soundcloud import SoundcloudAlbum
from ytdl_subscribe.entries.soundcloud import SoundcloudTrack from ytdl_subscribe.entries.soundcloud import SoundcloudTrack
from ytdl_subscribe.subscriptions.subscription import Subscription from ytdl_subscribe.subscriptions.subscription import Subscription
from ytdl_subscribe.validators.config.source_options.soundcloud_validators import (
SoundcloudAlbumsAndSinglesSourceValidator,
)
class SoundcloudAlbumsAndSinglesSubscription( class SoundcloudAlbumsAndSinglesSubscription(

View file

@ -11,21 +11,17 @@ from typing import Optional
from typing import Type from typing import Type
from typing import TypeVar from typing import TypeVar
from ytdl_subscribe.config.config_options_validator import ConfigOptionsValidator
from ytdl_subscribe.config.output_options_validator import OutputOptionsValidator
from ytdl_subscribe.config.overrides_validator import OverridesValidator
from ytdl_subscribe.config.preset_validator import PresetValidator
from ytdl_subscribe.downloaders.downloader import Downloader from ytdl_subscribe.downloaders.downloader import Downloader
from ytdl_subscribe.downloaders.downloader import DownloaderValidator
from ytdl_subscribe.entries.entry import Entry from ytdl_subscribe.entries.entry import Entry
from ytdl_subscribe.validators.config.config_options.config_options_validator import ( from ytdl_subscribe.validators.date_range_validator import DownloadDateRangeSource
ConfigOptionsValidator,
)
from ytdl_subscribe.validators.config.output_options.output_options_validator import (
OutputOptionsValidator,
)
from ytdl_subscribe.validators.config.overrides.overrides_validator import OverridesValidator
from ytdl_subscribe.validators.config.preset_validator import PresetValidator
from ytdl_subscribe.validators.config.source_options.mixins import DownloadDateRangeSource
from ytdl_subscribe.validators.config.source_options.source_validators import SourceValidator
from ytdl_subscribe.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive from ytdl_subscribe.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive
SourceT = TypeVar("SourceT", bound=SourceValidator) SourceT = TypeVar("SourceT", bound=DownloaderValidator)
EntryT = TypeVar("EntryT", bound=Entry) EntryT = TypeVar("EntryT", bound=Entry)
DownloaderT = TypeVar("DownloaderT", bound=Downloader) DownloaderT = TypeVar("DownloaderT", bound=Downloader)

View file

@ -1,20 +1,14 @@
from typing import List from typing import List
from ytdl_subscribe.downloaders.youtube_downloader import YoutubeChannelDownloaderValidator
from ytdl_subscribe.downloaders.youtube_downloader import YoutubeDownloader from ytdl_subscribe.downloaders.youtube_downloader import YoutubeDownloader
from ytdl_subscribe.downloaders.youtube_downloader import YoutubePlaylistDownloaderValidator
from ytdl_subscribe.downloaders.youtube_downloader import YoutubeVideoDownloaderValidator
from ytdl_subscribe.entries.youtube import YoutubeVideo from ytdl_subscribe.entries.youtube import YoutubeVideo
from ytdl_subscribe.subscriptions.subscription import Subscription from ytdl_subscribe.subscriptions.subscription import Subscription
from ytdl_subscribe.validators.config.source_options.youtube_validators import (
YoutubeChannelSourceValidator,
)
from ytdl_subscribe.validators.config.source_options.youtube_validators import (
YoutubePlaylistSourceValidator,
)
from ytdl_subscribe.validators.config.source_options.youtube_validators import (
YoutubeVideoSourceValidator,
)
class YoutubePlaylistSubscription(Subscription[YoutubePlaylistSourceValidator, YoutubeVideo]): class YoutubePlaylistSubscription(Subscription[YoutubePlaylistDownloaderValidator, YoutubeVideo]):
""" """
Youtube subscription to download videos from a playlist Youtube subscription to download videos from a playlist
""" """
@ -25,7 +19,7 @@ class YoutubePlaylistSubscription(Subscription[YoutubePlaylistSourceValidator, Y
) )
class YoutubeChannelSubscription(Subscription[YoutubeChannelSourceValidator, YoutubeVideo]): class YoutubeChannelSubscription(Subscription[YoutubeChannelDownloaderValidator, YoutubeVideo]):
""" """
Youtube subscription to download videos from a channel Youtube subscription to download videos from a channel
""" """
@ -40,7 +34,7 @@ class YoutubeChannelSubscription(Subscription[YoutubeChannelSourceValidator, You
return downloader.download_channel(channel_id=self.source_options.channel_id.value) return downloader.download_channel(channel_id=self.source_options.channel_id.value)
class YoutubeVideoSubscription(Subscription[YoutubeVideoSourceValidator, YoutubeVideo]): class YoutubeVideoSubscription(Subscription[YoutubeVideoDownloaderValidator, YoutubeVideo]):
""" """
Youtube subscription to download a single video Youtube subscription to download a single video
""" """

View file

@ -1,18 +0,0 @@
from ytdl_subscribe.plugins.music_tags import MusicTagsValidator
from ytdl_subscribe.plugins.nfo_tags import NfoTagsValidator
from ytdl_subscribe.plugins.output_directory_nfo_tags import OutputDirectoryNfoTagsValidator
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator
class MetadataOptionsValidator(StrictDictValidator):
_optional_keys = {"id3", "nfo", "output_directory_nfo"}
def __init__(self, name, value):
super().__init__(name, value)
self.id3 = self._validate_key_if_present(key="id3", validator=MusicTagsValidator)
self.nfo = self._validate_key_if_present(key="nfo", validator=NfoTagsValidator)
self.output_directory_nfo = self._validate_key_if_present(
key="output_directory_nfo", validator=OutputDirectoryNfoTagsValidator
)

View file

@ -1,12 +0,0 @@
from ytdl_subscribe.validators.base.validators import StringValidator
from ytdl_subscribe.validators.config.source_options.source_validators import (
SoundcloudSourceValidator,
)
class SoundcloudAlbumsAndSinglesSourceValidator(SoundcloudSourceValidator):
_required_keys = {"username"}
def __init__(self, name, value):
super().__init__(name, value)
self.username = self._validate_key(key="username", validator=StringValidator)

View file

@ -1,30 +0,0 @@
from abc import ABC
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.validators import BoolValidator
class SourceValidator(StrictDictValidator):
"""
Abstract class for any source validator
"""
class SoundcloudSourceValidator(SourceValidator, ABC):
"""
Abstract source validator for all soundcloud sources.
"""
_optional_keys = {"skip_premiere_tracks"}
def __init__(self, name: str, value: dict):
super().__init__(name=name, value=value)
self.skip_premiere_tracks = self._validate_key(
"skip_premiere_tracks", BoolValidator, default=True
)
class YoutubeSourceValidator(SourceValidator, ABC):
"""
Abstract source validator for all soundcloud sources.
"""

View file

@ -1,30 +0,0 @@
from ytdl_subscribe.validators.base.string_datetime import StringDatetimeValidator
from ytdl_subscribe.validators.base.validators import StringValidator
from ytdl_subscribe.validators.config.source_options.mixins import DownloadDateRangeSource
from ytdl_subscribe.validators.config.source_options.source_validators import YoutubeSourceValidator
class YoutubePlaylistSourceValidator(YoutubeSourceValidator):
_required_keys = {"playlist_id"}
def __init__(self, name, value):
super().__init__(name, value)
self.playlist_id = self._validate_key("playlist_id", StringValidator)
class YoutubeVideoSourceValidator(YoutubeSourceValidator):
_required_keys = {"video_id"}
def __init__(self, name, value):
super().__init__(name, value)
self.video_id = self._validate_key("video_id", StringValidator)
class YoutubeChannelSourceValidator(YoutubeSourceValidator, DownloadDateRangeSource):
_required_keys = {"channel_id"}
_optional_keys = {"before", "after"}
def __init__(self, name, value):
YoutubeSourceValidator.__init__(self, name, value)
DownloadDateRangeSource.__init__(self, name, value)
self.channel_id = self._validate_key("channel_id", StringValidator)

View file

@ -3,8 +3,8 @@ from typing import Optional
from yt_dlp import DateRange from yt_dlp import DateRange
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.string_datetime import StringDatetimeValidator from ytdl_subscribe.validators.string_datetime import StringDatetimeValidator
class DownloadDateRangeSource(StrictDictValidator, ABC): class DownloadDateRangeSource(StrictDictValidator, ABC):

View file

@ -1,8 +1,8 @@
from typing import List from typing import List
from typing import Set from typing import Set
from ytdl_subscribe.validators.base.validators import DictValidator from ytdl_subscribe.utils.exceptions import ValidationException
from ytdl_subscribe.validators.exceptions import ValidationException from ytdl_subscribe.validators.validators import DictValidator
class StrictDictValidator(DictValidator): class StrictDictValidator(DictValidator):

View file

@ -1,7 +1,7 @@
from yt_dlp.utils import datetime_from_str from yt_dlp.utils import datetime_from_str
from ytdl_subscribe.validators.base.validators import Validator from ytdl_subscribe.utils.exceptions import ValidationException
from ytdl_subscribe.validators.exceptions import ValidationException from ytdl_subscribe.validators.validators import Validator
class StringDatetimeValidator(Validator): class StringDatetimeValidator(Validator):

View file

@ -5,10 +5,10 @@ from typing import Dict
from typing import List from typing import List
from typing import final from typing import final
from ytdl_subscribe.validators.base.validators import LiteralDictValidator from ytdl_subscribe.utils.exceptions import StringFormattingException
from ytdl_subscribe.validators.base.validators import Validator from ytdl_subscribe.utils.exceptions import StringFormattingVariableNotFoundException
from ytdl_subscribe.validators.exceptions import StringFormattingException from ytdl_subscribe.validators.validators import LiteralDictValidator
from ytdl_subscribe.validators.exceptions import StringFormattingVariableNotFoundException from ytdl_subscribe.validators.validators import Validator
class StringFormatterValidator(Validator): class StringFormatterValidator(Validator):

View file

@ -1,6 +1,6 @@
from typing import Set from typing import Set
from ytdl_subscribe.validators.base.validators import StringValidator from ytdl_subscribe.validators.validators import StringValidator
class StringSelectValidator(StringValidator): class StringSelectValidator(StringValidator):

View file

@ -8,7 +8,7 @@ from typing import Type
from typing import TypeVar from typing import TypeVar
from typing import final from typing import final
from ytdl_subscribe.validators.exceptions import ValidationException from ytdl_subscribe.utils.exceptions import ValidationException
V = TypeVar("V", bound=ValidationException) V = TypeVar("V", bound=ValidationException)