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
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):

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -4,34 +4,19 @@ from typing import List
from typing import Optional
from typing import Type
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.string_formatter_validators import (
OverridesStringFormatterValidator,
)
from ytdl_subscribe.validators.base.validators import DictValidator
from ytdl_subscribe.validators.base.validators import Validator
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.overrides.overrides_validator import OverridesValidator
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
from ytdl_subscribe.config.download_strategy_validators import DownloadStrategyValidator
from ytdl_subscribe.config.download_strategy_validators import SoundcloudDownloadStrategyValidator
from ytdl_subscribe.config.download_strategy_validators import YoutubeDownloadStrategyValidator
from ytdl_subscribe.config.output_options_validator import OutputOptionsValidator
from ytdl_subscribe.config.overrides_validator import OverridesValidator
from ytdl_subscribe.config.ytdl_options_validator import YTDLOptionsValidator
from ytdl_subscribe.downloaders.downloader import DownloaderValidator
from ytdl_subscribe.utils.exceptions import StringFormattingVariableNotFoundException
from ytdl_subscribe.utils.exceptions import ValidationException
from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.string_formatter_validators import OverridesStringFormatterValidator
from ytdl_subscribe.validators.validators import DictValidator
from ytdl_subscribe.validators.validators import Validator
PRESET_SOURCE_VALIDATOR_MAPPING: Dict[str, Type[DownloadStrategyValidator]] = {
"soundcloud": SoundcloudDownloadStrategyValidator,
@ -55,7 +40,7 @@ class PresetValidator(StrictDictValidator):
def __available_sources(self) -> List[str]:
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
for key in self._keys:
@ -130,9 +115,8 @@ class PresetValidator(StrictDictValidator):
key="output_options",
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(
key="ytdl_options", validator=YTDLOptionsValidator, default={}

View file

@ -8,30 +8,24 @@ from typing import Type
import yaml
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.subscription import Subscription
from ytdl_subscribe.subscriptions.youtube import YoutubeChannelSubscription
from ytdl_subscribe.subscriptions.youtube import YoutubePlaylistSubscription
from ytdl_subscribe.subscriptions.youtube import YoutubeVideoSubscription
from ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.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,
)
from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.validators import StringValidator
class SubscriptionValidator(StrictDictValidator):
@ -79,11 +73,11 @@ class SubscriptionValidator(StrictDictValidator):
subscription_class: Optional[Type[Subscription]] = None
if isinstance(self.preset.subscription_source, SoundcloudAlbumsAndSinglesSourceValidator):
subscription_class = SoundcloudAlbumsAndSinglesSubscription
elif isinstance(self.preset.subscription_source, YoutubePlaylistSourceValidator):
elif isinstance(self.preset.subscription_source, YoutubePlaylistDownloaderValidator):
subscription_class = YoutubePlaylistSubscription
elif isinstance(self.preset.subscription_source, YoutubeVideoSourceValidator):
elif isinstance(self.preset.subscription_source, YoutubeVideoDownloaderValidator):
subscription_class = YoutubeVideoSubscription
elif isinstance(self.preset.subscription_source, YoutubeChannelSourceValidator):
elif isinstance(self.preset.subscription_source, YoutubeChannelDownloaderValidator):
subscription_class = YoutubeChannelSubscription
if subscription_class is None:
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):

View file

@ -1,3 +1,4 @@
from abc import ABC
from contextlib import contextmanager
from pathlib import Path
from typing import Dict
@ -5,6 +6,14 @@ from typing import Optional
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:
"""

View file

@ -1,9 +1,27 @@
from abc import ABC
from typing import Dict
from typing import List
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 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):
@ -48,3 +66,11 @@ class SoundcloudDownloader(Downloader):
SoundcloudTrack(working_directory=self.working_directory, kwargs=e)
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 os
from abc import ABC
from pathlib import Path
from typing import List
from yt_dlp.utils import RejectedVideoReached
from ytdl_subscribe.downloaders.downloader import Downloader
from ytdl_subscribe.downloaders.downloader import DownloaderValidator
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):
@ -86,3 +96,29 @@ class YoutubeDownloader(Downloader):
entries.append(YoutubeVideo(**json.load(file)))
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.main_args_parser import parser
from ytdl_subscribe.validators.config.config_file_validator import ConfigFileValidator
from ytdl_subscribe.validators.config.subscription_validator import SubscriptionValidator
from ytdl_subscribe.validators.exceptions import ValidationException
from ytdl_subscribe.config.config_file_validator import ConfigFileValidator
from ytdl_subscribe.config.subscription_validator import SubscriptionValidator
from ytdl_subscribe.utils.exceptions import ValidationException
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.plugins.plugin import Plugin
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):

View file

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

View file

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

View file

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

View file

@ -1,13 +1,11 @@
from abc import ABC
from typing import Generic
from typing import Optional
from typing import TypeVar
from typing import final
from ytdl_subscribe.config.overrides_validator import OverridesValidator
from ytdl_subscribe.entries.entry import Entry
from ytdl_subscribe.validators.base.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.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive

View file

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

View file

@ -11,21 +11,17 @@ from typing import Optional
from typing import Type
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 DownloaderValidator
from ytdl_subscribe.entries.entry import Entry
from ytdl_subscribe.validators.config.config_options.config_options_validator import (
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.validators.date_range_validator import DownloadDateRangeSource
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)
DownloaderT = TypeVar("DownloaderT", bound=Downloader)

View file

@ -1,20 +1,14 @@
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 YoutubePlaylistDownloaderValidator
from ytdl_subscribe.downloaders.youtube_downloader import YoutubeVideoDownloaderValidator
from ytdl_subscribe.entries.youtube import YoutubeVideo
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
"""
@ -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
"""
@ -40,7 +34,7 @@ class YoutubeChannelSubscription(Subscription[YoutubeChannelSourceValidator, You
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
"""

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 ytdl_subscribe.validators.base.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.base.string_datetime import StringDatetimeValidator
from ytdl_subscribe.validators.strict_dict_validator import StrictDictValidator
from ytdl_subscribe.validators.string_datetime import StringDatetimeValidator
class DownloadDateRangeSource(StrictDictValidator, ABC):

View file

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

View file

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

View file

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

View file

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

View file

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