From 85111b93676e41bcbb8ed1dd90a6d9d69e359189 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 31 May 2025 16:52:58 -0700 Subject: [PATCH] [FEATURE] release_date support for date_range; WIP: Need to unit test match filters --- src/ytdl_sub/plugins/date_range.py | 22 ++++++++++++++++--- .../validators/string_select_validator.py | 15 +++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/ytdl_sub/plugins/date_range.py b/src/ytdl_sub/plugins/date_range.py index b8b73711..6909a87f 100644 --- a/src/ytdl_sub/plugins/date_range.py +++ b/src/ytdl_sub/plugins/date_range.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Set from typing import Optional from typing import Tuple @@ -7,6 +7,11 @@ from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator from ytdl_sub.utils.datetime import to_date_str from ytdl_sub.validators.string_datetime import StringDatetimeValidator from ytdl_sub.validators.string_formatter_validators import OverridesBooleanFormatterValidator +from ytdl_sub.validators.string_select_validator import OverridesStringSelectValidator + + +class DateRangeType(OverridesStringSelectValidator): + _select_values: Set[str] = {"upload_date", "release_date"} class DateRangeOptions(ToggleableOptionsDictValidator): @@ -41,6 +46,7 @@ class DateRangeOptions(ToggleableOptionsDictValidator): self._breaks = self._validate_key_if_present( "breaks", OverridesBooleanFormatterValidator, default="True" ) + self._type = self._validate_key("type", DateRangeType, default="upload_date") @property def before(self) -> Optional[StringDatetimeValidator]: @@ -70,6 +76,15 @@ class DateRangeOptions(ToggleableOptionsDictValidator): """ return self._breaks + @property + def type(self) -> DateRangeType: + """ + :expected type: Optional[OverridesFormatter] + :description: + Which type of date to use. Must be either ``upload_date`` or ``release_date`` + """ + return self._type + class DateRangePlugin(Plugin[DateRangeOptions]): plugin_options_type = DateRangeOptions @@ -83,17 +98,18 @@ class DateRangePlugin(Plugin[DateRangeOptions]): match_filters: List[str] = [] breaking_match_filters: List[str] = [] + date_type: str = self.overrides.apply_formatter(formatter=self.plugin_options.type) if self.plugin_options.before: before_str = to_date_str( date_validator=self.plugin_options.before, overrides=self.overrides ) - match_filters.append(f"upload_date < {before_str}") + match_filters.append(f"{date_type} < {before_str}") if self.plugin_options.after: after_str = to_date_str( date_validator=self.plugin_options.after, overrides=self.overrides ) - after_filter = f"upload_date >= {after_str}" + after_filter = f"{date_type} >= {after_str}" if self.overrides.evaluate_boolean(self.plugin_options.breaks): breaking_match_filters.append(after_filter) else: diff --git a/src/ytdl_sub/validators/string_select_validator.py b/src/ytdl_sub/validators/string_select_validator.py index 24fe767d..8586bec7 100644 --- a/src/ytdl_sub/validators/string_select_validator.py +++ b/src/ytdl_sub/validators/string_select_validator.py @@ -1,5 +1,6 @@ from typing import Set +from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator from ytdl_sub.validators.validators import StringValidator @@ -17,3 +18,17 @@ class StringSelectValidator(StringValidator): raise self._validation_exception( f"Must be one of the following values: {', '.join(self._select_values)}" ) + + +class OverridesStringSelectValidator(OverridesStringFormatterValidator): + _expected_value_type_name = "overrides select" + + _select_values: Set[str] = set() + + def post_process(self, resolved: str) -> str: + if resolved not in self._select_values: + raise self._validation_exception( + f"Must be one of the following values: {', '.join(self._select_values)}" + ) + + return resolved