ytdl-sub/src/ytdl_sub/plugins/date_range.py
2023-07-25 00:37:47 -07:00

72 lines
2.2 KiB
Python

from typing import Dict
from typing import Optional
from ytdl_sub.config.plugin import Plugin
from ytdl_sub.config.preset_options import OptionsDictValidator
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
from ytdl_sub.utils.datetime import to_date_range
from ytdl_sub.validators.string_datetime import StringDatetimeValidator
class DateRangeOptions(OptionsDictValidator):
"""
Only download files uploaded within the specified date range.
Usage:
.. code-block:: yaml
presets:
my_example_preset:
date_range:
before: "now"
after: "today-2weeks"
"""
_optional_keys = {"before", "after"}
def __init__(self, name, value):
super().__init__(name, value)
self._before = self._validate_key_if_present("before", StringDatetimeValidator)
self._after = self._validate_key_if_present("after", StringDatetimeValidator)
@property
def before(self) -> Optional[StringDatetimeValidator]:
"""
Optional. Only download videos before this datetime.
"""
return self._before
@property
def after(self) -> Optional[StringDatetimeValidator]:
"""
Optional. Only download videos after this datetime.
"""
return self._after
class DateRangePlugin(Plugin[DateRangeOptions]):
plugin_options_type = DateRangeOptions
def ytdl_options(self) -> Optional[Dict]:
"""
Returns
-------
YTDL options for setting a date range
"""
ytdl_options_builder = YTDLOptionsBuilder()
source_date_range = to_date_range(
before=self.plugin_options.before,
after=self.plugin_options.after,
overrides=self.overrides,
)
if source_date_range:
ytdl_options_builder.add({"daterange": source_date_range})
# Only add break_on_reject if after is specified, but not before.
# Otherwise, it can break on first metadata pull if it's after the 'before'
if self.plugin_options.after and not self.plugin_options.before:
ytdl_options_builder.add({"break_on_reject": True})
return ytdl_options_builder.to_dict()