diff --git a/src/ytdl_sub/entries/script/variable_definitions.py b/src/ytdl_sub/entries/script/variable_definitions.py index a4d02e82..e6867f00 100644 --- a/src/ytdl_sub/entries/script/variable_definitions.py +++ b/src/ytdl_sub/entries/script/variable_definitions.py @@ -2,6 +2,7 @@ from abc import ABC from typing import Dict from typing import Set +from ytdl_sub.entries.script.custom_functions import CustomFunctions from ytdl_sub.entries.script.variable_types import ArrayMetadataVariable from ytdl_sub.entries.script.variable_types import IntegerMetadataVariable from ytdl_sub.entries.script.variable_types import IntegerVariable @@ -15,6 +16,7 @@ from ytdl_sub.entries.script.variable_types import StringVariable # This file contains mixins to a BaseEntry subclass. Ignore pylint's "no kwargs member" suggestion # pylint: disable=no-member # pylint: disable=too-many-public-methods +# pylint: disable=too-many-lines class MetadataVariableDefinitions(ABC): @@ -62,7 +64,9 @@ class PlaylistVariableDefinitions(ABC): """ The playlist unique ID if it exists, otherwise return the entry unique ID. """ - return StringMetadataVariable.from_playlist(metadata_key="playlist_id", default=self.uid) + return StringMetadataVariable.from_playlist( + metadata_key="playlist_id", variable_name="playlist_uid", default=self.uid + ) @property def playlist_title(self: "VariableDefinitions") -> StringMetadataVariable: @@ -209,7 +213,10 @@ class PlaylistVariableDefinitions(ABC): """ The playlist uploader id if it exists, otherwise returns the entry uploader ID. """ - return StringMetadataVariable.from_entry(metadata_key="playlist_uploader_id") + return StringMetadataVariable.from_entry( + metadata_key="playlist_uploader_id", + default=self.uploader_id, + ) @property def playlist_uploader(self: "VariableDefinitions") -> StringMetadataVariable: @@ -296,7 +303,9 @@ class SourceVariableDefinitions(ABC): The source webpage url if it exists, otherwise returns the playlist webpage url. """ return StringMetadataVariable.from_source( - metadata_key=self.webpage_url.metadata_key, variable_name="source_webpage_url" + metadata_key=self.webpage_url.metadata_key, + variable_name="source_webpage_url", + default=self.playlist_webpage_url, ) @property @@ -740,14 +749,15 @@ class EntryVariableDefinitions(ABC): The sanitized uid with additional sanitizing for Plex. Replaces numbers with fixed-width numbers so Plex does not recognize them as season or episode numbers. """ - return self.uid.to_sanitized_plex("uid_sanitized_plex") + return self.uid.to_sanitized_plex(variable_name="uid_sanitized_plex") @property def ie_key(self: "VariableDefinitions") -> StringMetadataVariable: """ - The ie_key, used in legacy yt-dlp things as the 'info-extractor key' + The ie_key, used in legacy yt-dlp things as the 'info-extractor key'. + If it does not exist, return ``extractor_key`` """ - return StringMetadataVariable.from_entry(metadata_key="ie_key") + return StringMetadataVariable.from_entry(metadata_key="ie_key", default=self.extractor_key) @property def extractor_key(self: "VariableDefinitions") -> StringMetadataVariable: @@ -962,6 +972,9 @@ class VariableDefinitions( ): @classmethod def scripts(cls) -> Dict[str, str]: + """ + Returns all variables and their scripts in dict form + """ return { property_name: getattr(VARIABLES, property_name).definition for property_name in [ @@ -971,6 +984,9 @@ class VariableDefinitions( @classmethod def injected_variables(cls) -> Set[MetadataVariable]: + """ + Returns variables that get injected in the download-stage + """ return { VARIABLES.download_index, VARIABLES.comments, @@ -982,6 +998,9 @@ class VariableDefinitions( @classmethod def required_entry_variables(cls) -> Set[MetadataVariable]: + """ + Returns variables that the entry requires to exist + """ return { VARIABLES.uid, VARIABLES.extractor_key, @@ -992,6 +1011,10 @@ class VariableDefinitions( @classmethod def default_entry_variables(cls) -> Set[MetadataVariable]: + """ + Returns variables that reside on the entry that may or may not exist, + but have defaults + """ return { VARIABLES.title, VARIABLES.extractor, @@ -1015,6 +1038,9 @@ class VariableDefinitions( @classmethod def unresolvable_static_variables(cls) -> Set[str]: + """ + Returns variables that are not static (i.e. depend on runtime) + """ return { VARIABLES.entry_metadata.variable_name, } | cls.injected_variables() @@ -1024,3 +1050,5 @@ class VariableDefinitions( VARIABLES: VariableDefinitions = VariableDefinitions() VARIABLE_SCRIPTS: Dict[str, str] = VariableDefinitions.scripts() UNRESOLVED_VARIABLES: Set[str] = VariableDefinitions.unresolvable_static_variables() + +CustomFunctions.register() diff --git a/src/ytdl_sub/entries/script/variable_types.py b/src/ytdl_sub/entries/script/variable_types.py index 7343ca4b..91b4a801 100644 --- a/src/ytdl_sub/entries/script/variable_types.py +++ b/src/ytdl_sub/entries/script/variable_types.py @@ -17,6 +17,7 @@ PLAYLIST_METADATA_VARIABLE_NAME = "playlist_metadata" SOURCE_METADATA_VARIABLE_NAME = "source_metadata" TMetadataVariable = TypeVar("TMetadataVariable", bound="MetadataVariable") +TVariable = TypeVar("TVariable", bound="Variable") def _get( @@ -24,7 +25,7 @@ def _get( metadata_variable_name: str, metadata_key: str, variable_name: Optional[str], - default: Optional["Variable" | str | int | Dict | List], + default: Optional[TVariable | str | int | Dict | List], as_type: Type[TMetadataVariable], ) -> TMetadataVariable: if default is None: @@ -69,12 +70,18 @@ class StringVariable(Variable): return String.__name__ def to_sanitized_plex(self, variable_name: str) -> "StringVariable": + """ + Converts a String variable to be plex sanitized + """ return StringVariable( variable_name=variable_name, definition=f"{{%sanitize_plex_episode({self.variable_name})}}", ) def as_date_variable(self) -> "StringDateVariable": + """ + Converts a String variable to a date variable (which has metadata helpers) + """ return StringDateVariable( variable_name=self.variable_name, definition=self.definition, @@ -86,6 +93,9 @@ class StringDateVariable(StringVariable): def get_string_date_metadata( self, date_metadata_key: str, variable_name: Optional[str] = None ) -> StringVariable: + """ + Gets a string-based date metadata variable + """ return StringVariable( variable_name=variable_name or date_metadata_key, definition=f"""{{ @@ -101,6 +111,9 @@ class StringDateVariable(StringVariable): def get_integer_date_metadata( self, date_metadata_key: str, variable_name: str ) -> "IntegerVariable": + """ + Gets an int-based date metadata variable + """ return IntegerVariable( variable_name=variable_name, definition=f"""{{ @@ -121,6 +134,9 @@ class IntegerVariable(Variable): return Integer.__name__ def to_padded_int(self, variable_name: str, pad: int) -> StringVariable: + """ + Pads an integer + """ return StringVariable( variable_name=variable_name, definition=f"{{%pad_zero({self.variable_name}, {pad})}}" ) @@ -154,6 +170,9 @@ class MapMetadataVariable(MetadataVariable, MapVariable): variable_name: Optional[str] = None, default: Optional["MapMetadataVariable" | Dict] = None, ) -> "MapMetadataVariable": + """ + Creates a map variable from entry metadata + """ return _get( "map", metadata_variable_name=ENTRY_METADATA_VARIABLE_NAME, @@ -173,6 +192,9 @@ class ArrayMetadataVariable(MetadataVariable, ArrayVariable): variable_name: Optional[str] = None, default: Optional["ArrayMetadataVariable" | List] = None, ) -> "ArrayMetadataVariable": + """ + Creates an array variable from entry metadata + """ return _get( "array", metadata_variable_name=ENTRY_METADATA_VARIABLE_NAME, @@ -192,6 +214,9 @@ class StringMetadataVariable(MetadataVariable, StringVariable): variable_name: Optional[str] = None, default: Optional[StringVariable | str] = None, ) -> "StringMetadataVariable": + """ + Creates a string variable from entry metadata + """ return _get( "string", metadata_variable_name=ENTRY_METADATA_VARIABLE_NAME, @@ -208,6 +233,9 @@ class StringMetadataVariable(MetadataVariable, StringVariable): variable_name: Optional[str] = None, default: Optional[StringVariable | str] = None, ) -> "StringMetadataVariable": + """ + Creates a string variable from playlist metadata + """ return _get( "string", metadata_variable_name=PLAYLIST_METADATA_VARIABLE_NAME, @@ -224,6 +252,9 @@ class StringMetadataVariable(MetadataVariable, StringVariable): variable_name: Optional[str] = None, default: Optional[StringVariable | str] = None, ) -> "StringMetadataVariable": + """ + Creates a string variable from source metadata + """ return _get( "string", metadata_variable_name=SOURCE_METADATA_VARIABLE_NAME, @@ -243,6 +274,9 @@ class IntegerMetadataVariable(MetadataVariable, IntegerVariable): variable_name: Optional[str] = None, default: Optional[IntegerVariable | int] = None, ) -> "IntegerMetadataVariable": + """ + Creates an int variable from entry metadata + """ return _get( "int", metadata_variable_name=ENTRY_METADATA_VARIABLE_NAME, @@ -259,6 +293,9 @@ class IntegerMetadataVariable(MetadataVariable, IntegerVariable): variable_name: Optional[str] = None, default: Optional[IntegerVariable | int] = None, ) -> "IntegerMetadataVariable": + """ + Creates an int variable from playlist metadata + """ return _get( "int", metadata_variable_name=PLAYLIST_METADATA_VARIABLE_NAME,