diff --git a/src/ytdl_sub/entries/script/variable_definitions.py b/src/ytdl_sub/entries/script/variable_definitions.py index 2b6a4efb..9aaa2d7e 100644 --- a/src/ytdl_sub/entries/script/variable_definitions.py +++ b/src/ytdl_sub/entries/script/variable_definitions.py @@ -323,7 +323,7 @@ class _Variables: str The playlist unique ID if it exists, otherwise return Variable("") """ - return MetadataVariable(variable_name="playlist_uid", metadata_key=self.uid.metadata_key) + return MetadataVariable(variable_name="playlist_uid", metadata_key="playlist_id") @property def playlist_title(self) -> MetadataVariable: @@ -333,9 +333,7 @@ class _Variables: str Name of its parent playlist/channel if it exists, otherwise returns its title. """ - return MetadataVariable( - variable_name="playlist_title", metadata_key=self.title.metadata_key - ) + return MetadataVariable(variable_name="playlist_title", metadata_key="playlist_title") @property def playlist_title_sanitized(self) -> Variable: @@ -488,7 +486,7 @@ class _Variables: str The playlist uploader id if it exists, otherwise returns the entry uploader ID. """ - return MetadataVariable("playlist_uploader_id", metadata_key=self.uploader_id.metadata_key) + return MetadataVariable("playlist_uploader_id", metadata_key="playlist_uploader_id") @property def playlist_uploader(self) -> MetadataVariable: diff --git a/src/ytdl_sub/entries/script/variable_scripts.py b/src/ytdl_sub/entries/script/variable_scripts.py index 503ad757..b4d8512e 100644 --- a/src/ytdl_sub/entries/script/variable_scripts.py +++ b/src/ytdl_sub/entries/script/variable_scripts.py @@ -127,7 +127,6 @@ ENTRY_REQUIRED_VARIABLES: Dict[MetadataVariable, str] = { } ENTRY_DEFAULT_VARIABLES: Dict[MetadataVariable, str] = { - v.playlist_index: playlist_get_int(v.playlist_index, 1), v.title: entry_get_str(v.title, v.uid), v.extractor: entry_get_str(v.extractor, v.extractor_key), v.description: entry_get_str(v.description, ""), @@ -139,6 +138,11 @@ ENTRY_DEFAULT_VARIABLES: Dict[MetadataVariable, str] = { v.channel: entry_get_str(v.channel, v.uploader), v.creator: entry_get_str(v.creator, v.channel), v.channel_id: entry_get_str(v.channel_id, v.uploader_id), + v.playlist_index: entry_get_int(v.playlist_index, 1), + v.playlist_count: entry_get_int(v.playlist_count, 1), + v.playlist_uid: entry_get_str(v.playlist_uid, v.uid), + v.playlist_title: entry_get_str(v.playlist_title, v.title), + v.playlist_uploader_id: entry_get_str(v.playlist_uploader_id, v.uploader_id), } # MARK AS UNRESOLVABLE UNTIL THEY ARE ADDED @@ -164,6 +168,12 @@ ENTRY_DERIVED_VARIABLES: Dict[Variable, str] = { v.upload_date_index_padded: pad_int(v.upload_date_index, 2), v.upload_date_index_reversed: f"{{%sub(100, {v.upload_date_index.variable_name})}}", v.upload_date_index_reversed_padded: pad_int(v.upload_date_index_reversed, 2), + v.playlist_title_sanitized: sanitized(v.playlist_title), + v.playlist_index_reversed: f"{{%sub({v.playlist_count.variable_name}, {v.playlist_index.variable_name}, -1)}}", + v.playlist_index_padded: pad_int(v.playlist_index, 2), + v.playlist_index_reversed_padded: pad_int(v.playlist_index_reversed, 2), + v.playlist_index_padded6: pad_int(v.playlist_index, 6), + v.playlist_index_reversed_padded6: pad_int(v.playlist_index_reversed, 6), } ENTRY_UPLOAD_DATE_VARIABLES: Dict[Variable, str] = { @@ -209,23 +219,13 @@ ENTRY_RELEASE_DATE_VARIABLES: Dict[Variable, str] = { } PLAYLIST_VARIABLES: Dict[Variable, str] = { - v.playlist_uid: playlist_get_str(v.playlist_uid, v.uid), - v.playlist_title: playlist_get_str(v.playlist_title, v.title), v.playlist_webpage_url: playlist_get_str(v.playlist_webpage_url, v.webpage_url), - v.playlist_count: playlist_get_int(v.playlist_count, 1), v.playlist_description: playlist_get_str(v.playlist_description, v.description), - v.playlist_uploader_id: playlist_get_str(v.playlist_uploader_id, v.uploader_id), v.playlist_uploader: playlist_get_str(v.playlist_uploader, v.uploader), v.playlist_uploader_url: playlist_get_str(v.playlist_uploader_url, v.playlist_webpage_url), } PLAYLIST_DERIVED_VARIABLES: Dict[Variable, str] = { - v.playlist_title_sanitized: sanitized(v.playlist_title), - v.playlist_index_reversed: f"{{%sub({v.playlist_count.variable_name}, {v.playlist_index.variable_name}, -1)}}", - v.playlist_index_padded: pad_int(v.playlist_index, 2), - v.playlist_index_reversed_padded: pad_int(v.playlist_index_reversed, 2), - v.playlist_index_padded6: pad_int(v.playlist_index, 6), - v.playlist_index_reversed_padded6: pad_int(v.playlist_index_reversed, 6), v.playlist_uploader_sanitized: sanitized(v.playlist_uploader), } diff --git a/src/ytdl_sub/plugins/regex.py b/src/ytdl_sub/plugins/regex.py index baf0a960..eb25e8e7 100644 --- a/src/ytdl_sub/plugins/regex.py +++ b/src/ytdl_sub/plugins/regex.py @@ -4,20 +4,15 @@ from typing import List from typing import Optional from typing import Set -from yt_dlp.utils import sanitize_filename - from ytdl_sub.config.plugin import Plugin from ytdl_sub.config.plugin import PluginPriority from ytdl_sub.config.preset_options import OptionsDictValidator from ytdl_sub.config.preset_options import PluginOperation from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.script.variable_scripts import VARIABLE_SCRIPTS from ytdl_sub.entries.variables.kwargs import YTDL_SUB_REGEX_SOURCE_VARS from ytdl_sub.script.parser import parse -from ytdl_sub.script.script import Script from ytdl_sub.script.utils.exceptions import ScriptVariableNotResolved from ytdl_sub.utils.exceptions import RegexNoMatchException -from ytdl_sub.utils.exceptions import StringFormattingVariableNotFoundException from ytdl_sub.utils.logger import Logger from ytdl_sub.validators.regex_validator import RegexListValidator from ytdl_sub.validators.source_variable_validator import SourceVariableNameListValidator @@ -358,10 +353,10 @@ class RegexPlugin(Plugin[RegexOptions]): return self._try_skip_entry(entry=entry, variable_name=variable_name) # add both the default... - entry.add({ + entry.add( + { regex_options.capture_group_names[i]: self.overrides.apply_formatter( - formatter=default, - entry=entry + formatter=default, entry=entry ) for i, default in enumerate(regex_options.capture_group_defaults) } @@ -369,10 +364,12 @@ class RegexPlugin(Plugin[RegexOptions]): # There is a capture, add the source variables to the entry as # {source_var}_capture_1, {source_var}_capture_2, ... else: - entry.add({ - regex_options.capture_group_names[i]: capture - for i, capture in enumerate(maybe_capture) - }) + entry.add( + { + regex_options.capture_group_names[i]: capture + for i, capture in enumerate(maybe_capture) + } + ) return entry diff --git a/src/ytdl_sub/script/utils/exceptions.py b/src/ytdl_sub/script/utils/exceptions.py index 8a8a2e02..86f18e1b 100644 --- a/src/ytdl_sub/script/utils/exceptions.py +++ b/src/ytdl_sub/script/utils/exceptions.py @@ -71,9 +71,11 @@ UNREACHABLE = _UnreachableSyntaxException( class RuntimeException(ValueError, ABC): """Exception thrown at runtime during resolution""" + class ScriptVariableNotResolved(RuntimeException): """Tried to get a variable's resolved value from a script, but has not resolved yet""" + class FunctionRuntimeException(RuntimeException): """Exception thrown when a ytdl-sub function has an error occur at runtime"""