[maybe] native array url support

This commit is contained in:
Jesse Bannon 2025-12-30 18:40:58 -08:00
parent 1abe2a44f5
commit e874b7bddb
4 changed files with 163 additions and 1007 deletions

View file

@ -52,12 +52,12 @@ class UrlDownloaderBasePluginExtension(SourcePluginExtension[MultiUrlValidator])
if 0 <= input_url_idx < len(self.plugin_options.urls.list): if 0 <= input_url_idx < len(self.plugin_options.urls.list):
validator = self.plugin_options.urls.list[input_url_idx] validator = self.plugin_options.urls.list[input_url_idx]
if self.overrides.apply_formatter(validator.url) == entry_input_url: if entry_input_url in self.overrides.apply_overrides_formatter_to_native(validator.url):
return validator return validator
# Match the first validator based on the URL, if one exists # Match the first validator based on the URL, if one exists
for validator in self.plugin_options.urls.list: for validator in self.plugin_options.urls.list:
if self.overrides.apply_formatter(validator.url) == entry_input_url: if entry_input_url in self.overrides.apply_overrides_formatter_to_native(validator.url):
return validator return validator
# Return the first validator if none exist # Return the first validator if none exist
@ -487,19 +487,27 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
# download the bottom-most urls first since they are top-priority # download the bottom-most urls first since they are top-priority
for idx, url_validator in reversed(list(enumerate(self.collection.urls.list))): for idx, url_validator in reversed(list(enumerate(self.collection.urls.list))):
# URLs can be empty. If they are, then skip # URLs can be empty. If they are, then skip
if not (url := self.overrides.apply_formatter(url_validator.url)): if not (urls := self.overrides.apply_overrides_formatter_to_native(url_validator.url)):
continue continue
for entry in self._download_metadata(url=url, validator=url_validator): assert isinstance(urls, list)
entry.initialize_script(self.overrides).add(
{
v.ytdl_sub_input_url: url,
v.ytdl_sub_input_url_index: idx,
v.ytdl_sub_input_url_count: len(self.collection.urls.list),
}
)
yield entry for url in reversed(urls):
assert isinstance(url, str)
if not url:
continue
for entry in self._download_metadata(url=url, validator=url_validator):
entry.initialize_script(self.overrides).add(
{
v.ytdl_sub_input_url: url,
v.ytdl_sub_input_url_index: idx,
v.ytdl_sub_input_url_count: len(self.collection.urls.list),
}
)
yield entry
def download(self, entry: Entry) -> Optional[Entry]: def download(self, entry: Entry) -> Optional[Entry]:
""" """

View file

@ -43,6 +43,20 @@ class UrlThumbnailListValidator(ListValidator[UrlThumbnailValidator]):
_inner_list_type = UrlThumbnailValidator _inner_list_type = UrlThumbnailValidator
class OverridesOneOrManyUrlValidator(OverridesStringFormatterValidator):
def post_process_native(self, resolved: Any) -> Any:
if isinstance(resolved, str):
return [resolved]
if isinstance(resolved, list):
for value in resolved:
if not isinstance(value, str):
raise self._validation_exception("Must be a string or an array of strings.")
return resolved
raise self._validation_exception("Must be a string or an array of strings.")
class UrlValidator(StrictDictValidator): class UrlValidator(StrictDictValidator):
_required_keys = {"url"} _required_keys = {"url"}
_optional_keys = { _optional_keys = {
@ -68,7 +82,7 @@ class UrlValidator(StrictDictValidator):
super().__init__(name, value) super().__init__(name, value)
# TODO: url validate using yt-dlp IE # TODO: url validate using yt-dlp IE
self._url = self._validate_key(key="url", validator=OverridesStringFormatterValidator) self._url = self._validate_key(key="url", validator=OverridesOneOrManyUrlValidator)
self._variables = self._validate_key_if_present( self._variables = self._validate_key_if_present(
key="variables", validator=DictFormatterValidator, default={} key="variables", validator=DictFormatterValidator, default={}
) )

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from typing import Dict from typing import Dict, Any
from typing import Set from typing import Set
from typing import Union from typing import Union
from typing import final from typing import final
@ -89,6 +89,14 @@ class StringFormatterValidator(StringValidator):
""" """
return resolved return resolved
def post_process_native(self, resolved: Any) -> Any:
"""
Returns
-------
Apply any post processing to the resolved native value.
"""
return resolved
class FloatFormatterValidator(StringFormatterValidator): class FloatFormatterValidator(StringFormatterValidator):
_expected_value_type_name = "float" _expected_value_type_name = "float"