[FEATURE] release_date support for date_range; WIP: Need to unit test match filters
This commit is contained in:
parent
66fd7cf41c
commit
85111b9367
2 changed files with 34 additions and 3 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
from typing import List
|
from typing import List, Set
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Tuple
|
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.utils.datetime import to_date_str
|
||||||
from ytdl_sub.validators.string_datetime import StringDatetimeValidator
|
from ytdl_sub.validators.string_datetime import StringDatetimeValidator
|
||||||
from ytdl_sub.validators.string_formatter_validators import OverridesBooleanFormatterValidator
|
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):
|
class DateRangeOptions(ToggleableOptionsDictValidator):
|
||||||
|
|
@ -41,6 +46,7 @@ class DateRangeOptions(ToggleableOptionsDictValidator):
|
||||||
self._breaks = self._validate_key_if_present(
|
self._breaks = self._validate_key_if_present(
|
||||||
"breaks", OverridesBooleanFormatterValidator, default="True"
|
"breaks", OverridesBooleanFormatterValidator, default="True"
|
||||||
)
|
)
|
||||||
|
self._type = self._validate_key("type", DateRangeType, default="upload_date")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def before(self) -> Optional[StringDatetimeValidator]:
|
def before(self) -> Optional[StringDatetimeValidator]:
|
||||||
|
|
@ -70,6 +76,15 @@ class DateRangeOptions(ToggleableOptionsDictValidator):
|
||||||
"""
|
"""
|
||||||
return self._breaks
|
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]):
|
class DateRangePlugin(Plugin[DateRangeOptions]):
|
||||||
plugin_options_type = DateRangeOptions
|
plugin_options_type = DateRangeOptions
|
||||||
|
|
@ -83,17 +98,18 @@ class DateRangePlugin(Plugin[DateRangeOptions]):
|
||||||
match_filters: List[str] = []
|
match_filters: List[str] = []
|
||||||
breaking_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:
|
if self.plugin_options.before:
|
||||||
before_str = to_date_str(
|
before_str = to_date_str(
|
||||||
date_validator=self.plugin_options.before, overrides=self.overrides
|
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:
|
if self.plugin_options.after:
|
||||||
after_str = to_date_str(
|
after_str = to_date_str(
|
||||||
date_validator=self.plugin_options.after, overrides=self.overrides
|
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):
|
if self.overrides.evaluate_boolean(self.plugin_options.breaks):
|
||||||
breaking_match_filters.append(after_filter)
|
breaking_match_filters.append(after_filter)
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
from typing import Set
|
from typing import Set
|
||||||
|
|
||||||
|
from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator
|
||||||
from ytdl_sub.validators.validators import StringValidator
|
from ytdl_sub.validators.validators import StringValidator
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -17,3 +18,17 @@ class StringSelectValidator(StringValidator):
|
||||||
raise self._validation_exception(
|
raise self._validation_exception(
|
||||||
f"Must be one of the following values: {', '.join(self._select_values)}"
|
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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue