ytdl-sub 2026.1.24__py3-none-any.whl → 2026.1.24.post1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ytdl_sub/__init__.py +1 -1
- ytdl_sub/config/overrides.py +37 -16
- ytdl_sub/config/plugin/plugin.py +1 -1
- ytdl_sub/config/preset_options.py +4 -1
- ytdl_sub/downloaders/url/downloader.py +8 -6
- ytdl_sub/downloaders/url/validators.py +1 -2
- ytdl_sub/plugins/date_range.py +1 -1
- ytdl_sub/plugins/embed_thumbnail.py +1 -1
- ytdl_sub/plugins/filter_exclude.py +3 -8
- ytdl_sub/plugins/filter_include.py +5 -7
- ytdl_sub/plugins/nfo_tags.py +1 -1
- ytdl_sub/plugins/square_thumbnail.py +1 -1
- ytdl_sub/plugins/throttle_protection.py +3 -3
- ytdl_sub/validators/string_formatter_validators.py +19 -22
- {ytdl_sub-2026.1.24.dist-info → ytdl_sub-2026.1.24.post1.dist-info}/METADATA +1 -1
- {ytdl_sub-2026.1.24.dist-info → ytdl_sub-2026.1.24.post1.dist-info}/RECORD +20 -20
- {ytdl_sub-2026.1.24.dist-info → ytdl_sub-2026.1.24.post1.dist-info}/WHEEL +0 -0
- {ytdl_sub-2026.1.24.dist-info → ytdl_sub-2026.1.24.post1.dist-info}/entry_points.txt +0 -0
- {ytdl_sub-2026.1.24.dist-info → ytdl_sub-2026.1.24.post1.dist-info}/licenses/LICENSE +0 -0
- {ytdl_sub-2026.1.24.dist-info → ytdl_sub-2026.1.24.post1.dist-info}/top_level.txt +0 -0
ytdl_sub/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__pypi_version__ = "2026.01.24";__local_version__ = "2026.01.24+
|
|
1
|
+
__pypi_version__ = "2026.01.24.post1";__local_version__ = "2026.01.24+c1431c8"
|
ytdl_sub/config/overrides.py
CHANGED
|
@@ -3,8 +3,6 @@ from typing import Dict
|
|
|
3
3
|
from typing import Iterable
|
|
4
4
|
from typing import Optional
|
|
5
5
|
from typing import Set
|
|
6
|
-
from typing import Type
|
|
7
|
-
from typing import TypeVar
|
|
8
6
|
|
|
9
7
|
from ytdl_sub.entries.entry import Entry
|
|
10
8
|
from ytdl_sub.entries.script.variable_definitions import VARIABLES
|
|
@@ -22,11 +20,10 @@ from ytdl_sub.utils.exceptions import StringFormattingException
|
|
|
22
20
|
from ytdl_sub.utils.exceptions import ValidationException
|
|
23
21
|
from ytdl_sub.utils.script import ScriptUtils
|
|
24
22
|
from ytdl_sub.utils.scriptable import Scriptable
|
|
23
|
+
from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator
|
|
25
24
|
from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator
|
|
26
25
|
from ytdl_sub.validators.string_formatter_validators import UnstructuredDictFormatterValidator
|
|
27
26
|
|
|
28
|
-
ExpectedT = TypeVar("ExpectedT")
|
|
29
|
-
|
|
30
27
|
|
|
31
28
|
class Overrides(UnstructuredDictFormatterValidator, Scriptable):
|
|
32
29
|
"""
|
|
@@ -210,8 +207,7 @@ class Overrides(UnstructuredDictFormatterValidator, Scriptable):
|
|
|
210
207
|
formatter: StringFormatterValidator,
|
|
211
208
|
entry: Optional[Entry] = None,
|
|
212
209
|
function_overrides: Optional[Dict[str, str]] = None,
|
|
213
|
-
|
|
214
|
-
) -> ExpectedT:
|
|
210
|
+
) -> str:
|
|
215
211
|
"""
|
|
216
212
|
Parameters
|
|
217
213
|
----------
|
|
@@ -221,8 +217,6 @@ class Overrides(UnstructuredDictFormatterValidator, Scriptable):
|
|
|
221
217
|
Optional. Entry to add source variables to the formatter
|
|
222
218
|
function_overrides
|
|
223
219
|
Optional. Explicit values to override the overrides themselves and source variables
|
|
224
|
-
expected_type
|
|
225
|
-
The expected type that should return. Defaults to string.
|
|
226
220
|
|
|
227
221
|
Returns
|
|
228
222
|
-------
|
|
@@ -233,15 +227,42 @@ class Overrides(UnstructuredDictFormatterValidator, Scriptable):
|
|
|
233
227
|
StringFormattingException
|
|
234
228
|
If the formatter that is trying to be resolved cannot
|
|
235
229
|
"""
|
|
236
|
-
|
|
230
|
+
return formatter.post_process(
|
|
231
|
+
str(
|
|
232
|
+
self._apply_to_resolvable(
|
|
233
|
+
formatter=formatter, entry=entry, function_overrides=function_overrides
|
|
234
|
+
)
|
|
235
|
+
)
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
def apply_overrides_formatter_to_native(
|
|
239
|
+
self,
|
|
240
|
+
formatter: OverridesStringFormatterValidator,
|
|
241
|
+
function_overrides: Optional[Dict[str, str]] = None,
|
|
242
|
+
) -> Any:
|
|
243
|
+
"""
|
|
244
|
+
Parameters
|
|
245
|
+
----------
|
|
246
|
+
formatter
|
|
247
|
+
Overrides formatter to apply
|
|
248
|
+
function_overrides
|
|
249
|
+
Optional. Explicit values to override the overrides themselves and source variables
|
|
250
|
+
|
|
251
|
+
Returns
|
|
252
|
+
-------
|
|
253
|
+
The native python form of the resolved variable
|
|
254
|
+
"""
|
|
255
|
+
return formatter.post_process_native(
|
|
237
256
|
self._apply_to_resolvable(
|
|
238
|
-
formatter=formatter, entry=
|
|
257
|
+
formatter=formatter, entry=None, function_overrides=function_overrides
|
|
239
258
|
).native
|
|
240
259
|
)
|
|
241
260
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
261
|
+
def evaluate_boolean(
|
|
262
|
+
self, formatter: StringFormatterValidator, entry: Optional[Entry] = None
|
|
263
|
+
) -> bool:
|
|
264
|
+
"""
|
|
265
|
+
Apply a formatter, and evaluate it to a boolean
|
|
266
|
+
"""
|
|
267
|
+
output = self.apply_formatter(formatter=formatter, entry=entry)
|
|
268
|
+
return ScriptUtils.bool_formatter_output(output)
|
ytdl_sub/config/plugin/plugin.py
CHANGED
|
@@ -48,7 +48,7 @@ class Plugin(BasePlugin[OptionsValidatorT], Generic[OptionsValidatorT], ABC):
|
|
|
48
48
|
Returns True if enabled, False if disabled.
|
|
49
49
|
"""
|
|
50
50
|
if isinstance(self.plugin_options, ToggleableOptionsDictValidator):
|
|
51
|
-
return self.overrides.
|
|
51
|
+
return self.overrides.evaluate_boolean(self.plugin_options.enable)
|
|
52
52
|
return True
|
|
53
53
|
|
|
54
54
|
def ytdl_options_match_filters(self) -> Tuple[List[str], List[str]]:
|
|
@@ -62,7 +62,10 @@ class YTDLOptions(UnstructuredOverridesDictFormatterValidator):
|
|
|
62
62
|
Materializes the entire ytdl-options dict from OverrideStringFormatters into
|
|
63
63
|
native python.
|
|
64
64
|
"""
|
|
65
|
-
out = {
|
|
65
|
+
out = {
|
|
66
|
+
key: overrides.apply_overrides_formatter_to_native(val)
|
|
67
|
+
for key, val in self.dict.items()
|
|
68
|
+
}
|
|
66
69
|
if "cookiefile" in out:
|
|
67
70
|
if not FileHandler.is_file_existent(out["cookiefile"]):
|
|
68
71
|
raise ValidationException(
|
|
@@ -52,12 +52,12 @@ class UrlDownloaderBasePluginExtension(SourcePluginExtension[MultiUrlValidator])
|
|
|
52
52
|
|
|
53
53
|
if 0 <= input_url_idx < len(self.plugin_options.urls.list):
|
|
54
54
|
validator = self.plugin_options.urls.list[input_url_idx]
|
|
55
|
-
if entry_input_url in self.overrides.
|
|
55
|
+
if entry_input_url in self.overrides.apply_overrides_formatter_to_native(validator.url):
|
|
56
56
|
return validator
|
|
57
57
|
|
|
58
58
|
# Match the first validator based on the URL, if one exists
|
|
59
59
|
for validator in self.plugin_options.urls.list:
|
|
60
|
-
if entry_input_url in self.overrides.
|
|
60
|
+
if entry_input_url in self.overrides.apply_overrides_formatter_to_native(validator.url):
|
|
61
61
|
return validator
|
|
62
62
|
|
|
63
63
|
# Return the first validator if none exist
|
|
@@ -382,7 +382,7 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|
|
382
382
|
entries_to_iter: List[Optional[Entry]] = entries
|
|
383
383
|
|
|
384
384
|
indices = list(range(len(entries_to_iter)))
|
|
385
|
-
if self.overrides.
|
|
385
|
+
if self.overrides.evaluate_boolean(validator.download_reverse):
|
|
386
386
|
indices = reversed(indices)
|
|
387
387
|
|
|
388
388
|
for idx in indices:
|
|
@@ -461,8 +461,8 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|
|
461
461
|
ytdl_option_overrides=validator.ytdl_options.to_native_dict(self.overrides)
|
|
462
462
|
)
|
|
463
463
|
|
|
464
|
-
include_sibling_metadata = self.overrides.
|
|
465
|
-
validator.include_sibling_metadata
|
|
464
|
+
include_sibling_metadata = self.overrides.evaluate_boolean(
|
|
465
|
+
validator.include_sibling_metadata
|
|
466
466
|
)
|
|
467
467
|
|
|
468
468
|
parents, orphan_entries = self._download_url_metadata(
|
|
@@ -487,9 +487,11 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|
|
487
487
|
# download the bottom-most urls first since they are top-priority
|
|
488
488
|
for idx, url_validator in reversed(list(enumerate(self.collection.urls.list))):
|
|
489
489
|
# URLs can be empty. If they are, then skip
|
|
490
|
-
if not (urls := self.overrides.
|
|
490
|
+
if not (urls := self.overrides.apply_overrides_formatter_to_native(url_validator.url)):
|
|
491
491
|
continue
|
|
492
492
|
|
|
493
|
+
assert isinstance(urls, list)
|
|
494
|
+
|
|
493
495
|
for url in reversed(urls):
|
|
494
496
|
assert isinstance(url, str)
|
|
495
497
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from typing import Any
|
|
2
2
|
from typing import Dict
|
|
3
|
-
from typing import List
|
|
4
3
|
from typing import Optional
|
|
5
4
|
from typing import Set
|
|
6
5
|
|
|
@@ -45,7 +44,7 @@ class UrlThumbnailListValidator(ListValidator[UrlThumbnailValidator]):
|
|
|
45
44
|
|
|
46
45
|
|
|
47
46
|
class OverridesOneOrManyUrlValidator(OverridesStringFormatterValidator):
|
|
48
|
-
def
|
|
47
|
+
def post_process_native(self, resolved: Any) -> Any:
|
|
49
48
|
if isinstance(resolved, str):
|
|
50
49
|
return [resolved]
|
|
51
50
|
if isinstance(resolved, list):
|
ytdl_sub/plugins/date_range.py
CHANGED
|
@@ -116,7 +116,7 @@ class DateRangePlugin(Plugin[DateRangeOptions]):
|
|
|
116
116
|
date_validator=self.plugin_options.after, overrides=self.overrides
|
|
117
117
|
)
|
|
118
118
|
after_filter = f"{date_type} >= {after_str}"
|
|
119
|
-
if self.overrides.
|
|
119
|
+
if self.overrides.evaluate_boolean(self.plugin_options.breaks):
|
|
120
120
|
breaking_match_filters.append(after_filter)
|
|
121
121
|
else:
|
|
122
122
|
match_filters.append(after_filter)
|
|
@@ -33,7 +33,7 @@ class EmbedThumbnailPlugin(Plugin[EmbedThumbnailOptions]):
|
|
|
33
33
|
|
|
34
34
|
@property
|
|
35
35
|
def _embed_thumbnail(self) -> bool:
|
|
36
|
-
return self.overrides.
|
|
36
|
+
return self.overrides.evaluate_boolean(self.plugin_options)
|
|
37
37
|
|
|
38
38
|
@classmethod
|
|
39
39
|
def _embed_video_thumbnail(cls, entry: Entry) -> None:
|
|
@@ -7,14 +7,13 @@ from ytdl_sub.config.validators.options import OptionsValidator
|
|
|
7
7
|
from ytdl_sub.entries.entry import Entry
|
|
8
8
|
from ytdl_sub.utils.exceptions import StringFormattingException
|
|
9
9
|
from ytdl_sub.utils.logger import Logger
|
|
10
|
-
from ytdl_sub.validators.string_formatter_validators import
|
|
11
|
-
from ytdl_sub.validators.validators import ListValidator
|
|
10
|
+
from ytdl_sub.validators.string_formatter_validators import ListFormatterValidator
|
|
12
11
|
from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive
|
|
13
12
|
|
|
14
13
|
logger = Logger.get("filter-exclude")
|
|
15
14
|
|
|
16
15
|
|
|
17
|
-
class FilterExcludeOptions(
|
|
16
|
+
class FilterExcludeOptions(ListFormatterValidator, OptionsValidator):
|
|
18
17
|
"""
|
|
19
18
|
Applies a conditional OR on any number of filters comprised of either variables or scripts.
|
|
20
19
|
If any filter evaluates to True, the entry will be excluded.
|
|
@@ -30,8 +29,6 @@ class FilterExcludeOptions(ListValidator[BooleanFormatterValidator], OptionsVali
|
|
|
30
29
|
{ %contains( %lower(description), '#short' ) }
|
|
31
30
|
"""
|
|
32
31
|
|
|
33
|
-
_inner_list_type = BooleanFormatterValidator
|
|
34
|
-
|
|
35
32
|
|
|
36
33
|
class FilterExcludePlugin(Plugin[FilterExcludeOptions]):
|
|
37
34
|
plugin_options_type = FilterExcludeOptions
|
|
@@ -55,9 +52,7 @@ class FilterExcludePlugin(Plugin[FilterExcludeOptions]):
|
|
|
55
52
|
return entry
|
|
56
53
|
|
|
57
54
|
for formatter in self.plugin_options.list:
|
|
58
|
-
should_exclude = self.overrides.
|
|
59
|
-
formatter=formatter, entry=entry, expected_type=bool
|
|
60
|
-
)
|
|
55
|
+
should_exclude = self.overrides.evaluate_boolean(formatter=formatter, entry=entry)
|
|
61
56
|
|
|
62
57
|
if should_exclude:
|
|
63
58
|
logger.info(
|
|
@@ -7,14 +7,14 @@ from ytdl_sub.config.validators.options import OptionsValidator
|
|
|
7
7
|
from ytdl_sub.entries.entry import Entry
|
|
8
8
|
from ytdl_sub.utils.exceptions import StringFormattingException
|
|
9
9
|
from ytdl_sub.utils.logger import Logger
|
|
10
|
-
from ytdl_sub.
|
|
11
|
-
from ytdl_sub.validators.
|
|
10
|
+
from ytdl_sub.utils.script import ScriptUtils
|
|
11
|
+
from ytdl_sub.validators.string_formatter_validators import ListFormatterValidator
|
|
12
12
|
from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive
|
|
13
13
|
|
|
14
14
|
logger = Logger.get("filter-include")
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class FilterIncludeOptions(
|
|
17
|
+
class FilterIncludeOptions(ListFormatterValidator, OptionsValidator):
|
|
18
18
|
"""
|
|
19
19
|
Applies a conditional AND on any number of filters comprised of either variables or scripts.
|
|
20
20
|
If all filters evaluate to True, the entry will be included.
|
|
@@ -38,8 +38,6 @@ class FilterIncludeOptions(ListValidator[BooleanFormatterValidator], OptionsVali
|
|
|
38
38
|
}
|
|
39
39
|
"""
|
|
40
40
|
|
|
41
|
-
_inner_list_type = BooleanFormatterValidator
|
|
42
|
-
|
|
43
41
|
|
|
44
42
|
class FilterIncludePlugin(Plugin[FilterIncludeOptions]):
|
|
45
43
|
plugin_options_type = FilterIncludeOptions
|
|
@@ -63,8 +61,8 @@ class FilterIncludePlugin(Plugin[FilterIncludeOptions]):
|
|
|
63
61
|
return entry
|
|
64
62
|
|
|
65
63
|
for formatter in self.plugin_options.list:
|
|
66
|
-
should_exclude =
|
|
67
|
-
formatter=formatter, entry=entry
|
|
64
|
+
should_exclude = ScriptUtils.bool_formatter_output(
|
|
65
|
+
self.overrides.apply_formatter(formatter=formatter, entry=entry)
|
|
68
66
|
)
|
|
69
67
|
if not should_exclude:
|
|
70
68
|
logger.info(
|
ytdl_sub/plugins/nfo_tags.py
CHANGED
|
@@ -140,7 +140,7 @@ class SharedNfoTagsPlugin(Plugin[SharedNfoTagsOptions], ABC):
|
|
|
140
140
|
if not nfo_tags:
|
|
141
141
|
return
|
|
142
142
|
|
|
143
|
-
if self.overrides.
|
|
143
|
+
if self.overrides.evaluate_boolean(self.plugin_options.kodi_safe):
|
|
144
144
|
nfo_root = to_max_3_byte_utf8_string(nfo_root)
|
|
145
145
|
nfo_tags = {
|
|
146
146
|
to_max_3_byte_utf8_string(key): [
|
|
@@ -31,7 +31,7 @@ class SquareThumbnailPlugin(Plugin[SquareThumbnailOptions]):
|
|
|
31
31
|
|
|
32
32
|
@property
|
|
33
33
|
def _square_thumbnail(self) -> bool:
|
|
34
|
-
return self.overrides.
|
|
34
|
+
return self.overrides.evaluate_boolean(self.plugin_options)
|
|
35
35
|
|
|
36
36
|
@classmethod
|
|
37
37
|
def _convert_to_square_thumbnail(cls, entry: Entry) -> None:
|
|
@@ -42,8 +42,8 @@ class _RandomizedRangeValidator(StrictDictValidator, ABC):
|
|
|
42
42
|
)
|
|
43
43
|
|
|
44
44
|
def _randomized_float(self, overrides: Overrides, entry: Optional[Entry] = None) -> float:
|
|
45
|
-
actualized_min = overrides.apply_formatter(self._min, entry=entry
|
|
46
|
-
actualized_max = overrides.apply_formatter(self._max, entry=entry
|
|
45
|
+
actualized_min = float(overrides.apply_formatter(self._min, entry=entry))
|
|
46
|
+
actualized_max = float(overrides.apply_formatter(self._max, entry=entry))
|
|
47
47
|
|
|
48
48
|
if actualized_min < 0:
|
|
49
49
|
raise self._validation_exception(
|
|
@@ -70,7 +70,7 @@ class _RandomizedRangeValidator(StrictDictValidator, ABC):
|
|
|
70
70
|
-------
|
|
71
71
|
Max possible value
|
|
72
72
|
"""
|
|
73
|
-
actualized_max = overrides.apply_formatter(self._max, entry=entry
|
|
73
|
+
actualized_max = float(overrides.apply_formatter(self._max, entry=entry))
|
|
74
74
|
if actualized_max < 0:
|
|
75
75
|
raise self._validation_exception(
|
|
76
76
|
f"max must be greater than zero, received {actualized_max}"
|
|
@@ -82,27 +82,35 @@ class StringFormatterValidator(StringValidator):
|
|
|
82
82
|
"""
|
|
83
83
|
return self._parsed
|
|
84
84
|
|
|
85
|
-
def post_process(self, resolved:
|
|
85
|
+
def post_process(self, resolved: str) -> str:
|
|
86
86
|
"""
|
|
87
87
|
Returns
|
|
88
88
|
-------
|
|
89
|
-
Apply any post processing to the resolved value
|
|
89
|
+
Apply any post processing to the resolved value
|
|
90
90
|
"""
|
|
91
|
-
return
|
|
91
|
+
return resolved
|
|
92
|
+
|
|
93
|
+
def post_process_native(self, resolved: Any) -> Any:
|
|
94
|
+
"""
|
|
95
|
+
Returns
|
|
96
|
+
-------
|
|
97
|
+
Apply any post processing to the resolved native value.
|
|
98
|
+
"""
|
|
99
|
+
return resolved
|
|
92
100
|
|
|
93
101
|
|
|
94
102
|
class FloatFormatterValidator(StringFormatterValidator):
|
|
95
103
|
_expected_value_type_name = "float"
|
|
96
104
|
|
|
97
|
-
def post_process(self, resolved: str) ->
|
|
105
|
+
def post_process(self, resolved: str) -> str:
|
|
98
106
|
try:
|
|
99
|
-
|
|
107
|
+
float(resolved)
|
|
100
108
|
except Exception as exc:
|
|
101
109
|
raise self._validation_exception(
|
|
102
110
|
f"Expected a float, but received '{resolved}'"
|
|
103
111
|
) from exc
|
|
104
112
|
|
|
105
|
-
return
|
|
113
|
+
return resolved
|
|
106
114
|
|
|
107
115
|
|
|
108
116
|
class StandardizedDateValidator(StringFormatterValidator):
|
|
@@ -119,13 +127,6 @@ class StandardizedDateValidator(StringFormatterValidator):
|
|
|
119
127
|
return resolved
|
|
120
128
|
|
|
121
129
|
|
|
122
|
-
class BooleanFormatterValidator(StringFormatterValidator):
|
|
123
|
-
_expected_value_type_name = "boolean"
|
|
124
|
-
|
|
125
|
-
def post_process(self, resolved: Any) -> bool:
|
|
126
|
-
return ScriptUtils.bool_formatter_output(output=str(resolved))
|
|
127
|
-
|
|
128
|
-
|
|
129
130
|
# pylint: disable=line-too-long
|
|
130
131
|
class OverridesStringFormatterValidator(StringFormatterValidator):
|
|
131
132
|
"""
|
|
@@ -145,14 +146,15 @@ class OverridesStringFormatterValidator(StringFormatterValidator):
|
|
|
145
146
|
class OverridesIntegerFormatterValidator(OverridesStringFormatterValidator):
|
|
146
147
|
_expected_value_type_name = "integer"
|
|
147
148
|
|
|
148
|
-
def post_process(self, resolved: str) ->
|
|
149
|
+
def post_process(self, resolved: str) -> str:
|
|
149
150
|
try:
|
|
150
|
-
|
|
151
|
+
int(resolved)
|
|
151
152
|
except Exception as exc:
|
|
152
153
|
raise self._validation_exception(
|
|
153
154
|
f"Expected an integer, but received '{resolved}'"
|
|
154
155
|
) from exc
|
|
155
|
-
|
|
156
|
+
|
|
157
|
+
return resolved
|
|
156
158
|
|
|
157
159
|
|
|
158
160
|
class OverridesFloatFormatterValidator(FloatFormatterValidator, OverridesStringFormatterValidator):
|
|
@@ -161,14 +163,9 @@ class OverridesFloatFormatterValidator(FloatFormatterValidator, OverridesStringF
|
|
|
161
163
|
"""
|
|
162
164
|
|
|
163
165
|
|
|
164
|
-
class OverridesBooleanFormatterValidator(
|
|
165
|
-
BooleanFormatterValidator, OverridesStringFormatterValidator
|
|
166
|
-
):
|
|
166
|
+
class OverridesBooleanFormatterValidator(OverridesStringFormatterValidator):
|
|
167
167
|
_expected_value_type_name = "boolean"
|
|
168
168
|
|
|
169
|
-
def post_process(self, resolved: Any) -> bool:
|
|
170
|
-
return ScriptUtils.bool_formatter_output(output=str(resolved))
|
|
171
|
-
|
|
172
169
|
|
|
173
170
|
class ListFormatterValidator(ListValidator[StringFormatterValidator]):
|
|
174
171
|
_inner_list_type = StringFormatterValidator
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
ytdl_sub/__init__.py,sha256=
|
|
1
|
+
ytdl_sub/__init__.py,sha256=Wd1d30BVPX4KeRIOh3WhKWVUZgXdxTi4iz3W-wzSqCY,79
|
|
2
2
|
ytdl_sub/main.py,sha256=4Rf9wXxSKW7IPnWqG5YtTZ814PjP1n9WtoFDivaainE,1004
|
|
3
3
|
ytdl_sub/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
ytdl_sub/cli/entrypoint.py,sha256=XXjUH4HiOP_BB2ZA_bNcyt5-o6YLAdZmj0EP3xtOtD8,9496
|
|
@@ -12,11 +12,11 @@ ytdl_sub/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
12
12
|
ytdl_sub/config/config_file.py,sha256=SQtVrMIUq2z3WwJVOed4y84JBMQ8aa4pbiBB0Y-YY4M,2781
|
|
13
13
|
ytdl_sub/config/config_validator.py,sha256=W1dvQD8wI7VOmGOHyaliu8DC6HOjfoGsgUw2MURTZOM,9797
|
|
14
14
|
ytdl_sub/config/defaults.py,sha256=NTwzlKDkks1LDGNjFMxh91fw5E6T6d_zGsCwODNYJxo,1152
|
|
15
|
-
ytdl_sub/config/overrides.py,sha256=
|
|
15
|
+
ytdl_sub/config/overrides.py,sha256=jXUQQmh1Jwz1yyZ6SeVGKlnOWUMyXliZEzCQKqjQZnk,10519
|
|
16
16
|
ytdl_sub/config/preset.py,sha256=Msacs60TyDWWzSlvkI3PurRil5vWOGQFK__Ev2HG1l0,9887
|
|
17
|
-
ytdl_sub/config/preset_options.py,sha256=
|
|
17
|
+
ytdl_sub/config/preset_options.py,sha256=PBinBBRLTaO4B5Q9bW2WUHAd0-x8fVIUqodOIm-py-c,14207
|
|
18
18
|
ytdl_sub/config/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
|
-
ytdl_sub/config/plugin/plugin.py,sha256=
|
|
19
|
+
ytdl_sub/config/plugin/plugin.py,sha256=ugUyDnjLKcBy7lOpTbVKaGSuUMvzyyQx3DIcbv3eTkQ,4721
|
|
20
20
|
ytdl_sub/config/plugin/plugin_mapping.py,sha256=xx9K2EReIU7zdPlogjvIkowy8J2R4TEhMNJyR7_1aE0,7846
|
|
21
21
|
ytdl_sub/config/plugin/plugin_operation.py,sha256=evRLt-m7LI7q4oQvA4YqlCU0x3-i5MWEWdUn0p7UViw,169
|
|
22
22
|
ytdl_sub/config/plugin/preset_plugins.py,sha256=AbyYOJwWPK3hy93CfosD4toKJP7yiTVoA1sL4YrppV0,2877
|
|
@@ -30,8 +30,8 @@ ytdl_sub/downloaders/ytdlp.py,sha256=x_12E3dqJxjDThsGhWLI7itCbXvOM3_jcK3F5wOvj9w
|
|
|
30
30
|
ytdl_sub/downloaders/info_json/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
31
|
ytdl_sub/downloaders/info_json/info_json_downloader.py,sha256=_FOvM52GsaLhJy4_D9RkpMhsZZyygXrL62CqcxaO5Co,6619
|
|
32
32
|
ytdl_sub/downloaders/url/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
|
-
ytdl_sub/downloaders/url/downloader.py,sha256=
|
|
34
|
-
ytdl_sub/downloaders/url/validators.py,sha256=
|
|
33
|
+
ytdl_sub/downloaders/url/downloader.py,sha256=y7DBJbGWZYC14ZzhOEc-zTIK6gHsgBT_WqeD93Wxq-o,20985
|
|
34
|
+
ytdl_sub/downloaders/url/validators.py,sha256=wbmkBtu-MQXGybJhc9g6K661LV1hLaJKSYa8ottDvns,13565
|
|
35
35
|
ytdl_sub/entries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
36
|
ytdl_sub/entries/base_entry.py,sha256=x5CByJIMtwmsZkEe8TipBuQUQO8b2bWMYqyYvRlXGag,5403
|
|
37
37
|
ytdl_sub/entries/entry.py,sha256=_U0PryLO1QNLexYHG4bcQ1yMgOY1nxKjRNb99-PXg7A,10008
|
|
@@ -46,21 +46,21 @@ ytdl_sub/entries/variables/override_variables.py,sha256=LjWtora5FT9hSka3COP6RySB
|
|
|
46
46
|
ytdl_sub/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
47
|
ytdl_sub/plugins/audio_extract.py,sha256=3S8xdL-UkOcfPcNfEebXBzSbSu2fpO3Q_wt8OQIH5HA,5445
|
|
48
48
|
ytdl_sub/plugins/chapters.py,sha256=SWvHtEfVCh7K8OugKUWOWn2TTqdUbpFabbcBGsYpRHc,14495
|
|
49
|
-
ytdl_sub/plugins/date_range.py,sha256
|
|
50
|
-
ytdl_sub/plugins/embed_thumbnail.py,sha256=
|
|
49
|
+
ytdl_sub/plugins/date_range.py,sha256=-LsByeB3M-phvQcm5ttYgeL9TYqFun0wrNOP8LvQQoY,4482
|
|
50
|
+
ytdl_sub/plugins/embed_thumbnail.py,sha256=VMaUk0oRu-wZl8Q4g1kg1mwGl0hV6yMQzsMBA5vicCg,3213
|
|
51
51
|
ytdl_sub/plugins/file_convert.py,sha256=A2DGd53iGre22EpwscYpOx215odoi9fztvhnfiOl_IY,8503
|
|
52
|
-
ytdl_sub/plugins/filter_exclude.py,sha256=
|
|
53
|
-
ytdl_sub/plugins/filter_include.py,sha256=
|
|
52
|
+
ytdl_sub/plugins/filter_exclude.py,sha256=8hiwRvD3RkHavghPRSvtK6FME2hG-Pkt_oWaWJpMuIs,2530
|
|
53
|
+
ytdl_sub/plugins/filter_include.py,sha256=uFiF6ARXyppHkxA2onFc8OWUJWilxrTGL1Rg_qpI7ZE,2756
|
|
54
54
|
ytdl_sub/plugins/format.py,sha256=a1bHNr3gZkwP2KdoatSjJa7htyDFSh43zA-7rcLK6SU,1059
|
|
55
55
|
ytdl_sub/plugins/match_filters.py,sha256=N5xAAshsxN3akgCCFgIZLVWuJkT66PV2DYcAcrOU_bk,3229
|
|
56
56
|
ytdl_sub/plugins/music_tags.py,sha256=G0ma1u4CQA1kb9xlWDarULpJx5aNG-Mm5FQpBnYXl1o,5875
|
|
57
|
-
ytdl_sub/plugins/nfo_tags.py,sha256=
|
|
57
|
+
ytdl_sub/plugins/nfo_tags.py,sha256=L6L1rCsojfOYd5MIXzCy60gEi6kWF9cnGYBIibtUYUU,9515
|
|
58
58
|
ytdl_sub/plugins/output_directory_nfo_tags.py,sha256=7cVJWPe_Q8iQywqjyTEKE3Tl6-GglEoHxD-r3eK_6kk,3534
|
|
59
59
|
ytdl_sub/plugins/split_by_chapters.py,sha256=vL7qVqwikK1Sum7z730b7LMRtFLA0I8PMLtEZcFxNO8,7982
|
|
60
|
-
ytdl_sub/plugins/square_thumbnail.py,sha256=
|
|
60
|
+
ytdl_sub/plugins/square_thumbnail.py,sha256=rGZBgTQbygY0ckElZchj832lkyH5OqqC4qdK5Cv-rIU,2445
|
|
61
61
|
ytdl_sub/plugins/static_nfo_tags.py,sha256=i3UMYd_IF7FAHJyJD9NqKrSUKUtpjcTxXspU19u1DEE,2200
|
|
62
62
|
ytdl_sub/plugins/subtitles.py,sha256=MU0tslS1tqrqJNJcezxPpiIazI4IIXFj3MwUXz9Cd7E,10161
|
|
63
|
-
ytdl_sub/plugins/throttle_protection.py,sha256=
|
|
63
|
+
ytdl_sub/plugins/throttle_protection.py,sha256=N3oVnrV09WyiHEg3r1Fh09ToYl0N-mb2_jxcRYAfviQ,13479
|
|
64
64
|
ytdl_sub/plugins/video_tags.py,sha256=UEpllX9q_7789SoYKd2JLkHBKD-8BXdQvmwm1WGs83I,1674
|
|
65
65
|
ytdl_sub/plugins/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
66
66
|
ytdl_sub/plugins/internal/view.py,sha256=XDPCsTmchcZPYDyV7kPDeDRVm87_gjBS15q4otYCsJU,1963
|
|
@@ -153,14 +153,14 @@ ytdl_sub/validators/regex_validator.py,sha256=jS8No927eg3zcpYEOv5g0gykePV0DCZaIr
|
|
|
153
153
|
ytdl_sub/validators/source_variable_validator.py,sha256=ziG4PVIyzj5ky-Okle0FB2d2P5DWs3-jYF81hMvBTEQ,922
|
|
154
154
|
ytdl_sub/validators/strict_dict_validator.py,sha256=RduK_3pOEbEQQuugAUeKKqM0Tv5x2vxSSb7vROyo2vQ,1661
|
|
155
155
|
ytdl_sub/validators/string_datetime.py,sha256=GpbBiZH1FHTMeo0Zk134-uMdTMk2JD3Re3TnvuPx2OU,1125
|
|
156
|
-
ytdl_sub/validators/string_formatter_validators.py,sha256=
|
|
156
|
+
ytdl_sub/validators/string_formatter_validators.py,sha256=2Iti0kGkqexK4LrpxE1tY7lX_wJnW_jZd_ka0s0Gkrc,12342
|
|
157
157
|
ytdl_sub/validators/string_select_validator.py,sha256=KFXNKWX2J80WGt08m5gVYphPMHYxhHlgfcoXAQMq6zw,1086
|
|
158
158
|
ytdl_sub/validators/validators.py,sha256=JC3-c9fSrozFADUY5jqZEhXpM2q3sfserlooQxT2DK8,9133
|
|
159
159
|
ytdl_sub/ytdl_additions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
160
160
|
ytdl_sub/ytdl_additions/enhanced_download_archive.py,sha256=Lsc0wjHdx9d8dYJCskZYAUGDAQ_QzQ-_xbQlyrBSzfk,24884
|
|
161
|
-
ytdl_sub-2026.1.24.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
162
|
-
ytdl_sub-2026.1.24.dist-info/METADATA,sha256=
|
|
163
|
-
ytdl_sub-2026.1.24.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
164
|
-
ytdl_sub-2026.1.24.dist-info/entry_points.txt,sha256=K3T5235NlAI-WLmHCg5tzLZHqc33OLN5IY5fOGc9t10,48
|
|
165
|
-
ytdl_sub-2026.1.24.dist-info/top_level.txt,sha256=6z-JWazl6jXspC2DNyxOnGnEqYyGzVbgcBDoXfbkUhI,9
|
|
166
|
-
ytdl_sub-2026.1.24.dist-info/RECORD,,
|
|
161
|
+
ytdl_sub-2026.1.24.post1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
162
|
+
ytdl_sub-2026.1.24.post1.dist-info/METADATA,sha256=2klHU9a8IWQ_-y9LV-nTUVnFHYsoD7vvNMAlBhRZza4,51426
|
|
163
|
+
ytdl_sub-2026.1.24.post1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
164
|
+
ytdl_sub-2026.1.24.post1.dist-info/entry_points.txt,sha256=K3T5235NlAI-WLmHCg5tzLZHqc33OLN5IY5fOGc9t10,48
|
|
165
|
+
ytdl_sub-2026.1.24.post1.dist-info/top_level.txt,sha256=6z-JWazl6jXspC2DNyxOnGnEqYyGzVbgcBDoXfbkUhI,9
|
|
166
|
+
ytdl_sub-2026.1.24.post1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|