diff --git a/pyproject.toml b/pyproject.toml index 343e1a0a..94e18a34 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,7 +52,7 @@ lint = [ "pylint==4.0.1", ] docs = [ - "sphinx>=7,<9", + "sphinx>=7,<10", "sphinx-rtd-theme>=2,<4", "sphinx-book-theme~=1.0", "sphinx-copybutton~=0.5", diff --git a/src/ytdl_sub/entries/script/variable_types.py b/src/ytdl_sub/entries/script/variable_types.py index f406baf6..bbf994e9 100644 --- a/src/ytdl_sub/entries/script/variable_types.py +++ b/src/ytdl_sub/entries/script/variable_types.py @@ -22,7 +22,6 @@ VariableT = TypeVar("VariableT", bound="Variable") def _get( - cast: str, metadata_variable_name: str, metadata_key: str, variable_name: Optional[str], @@ -47,7 +46,7 @@ def _get( return as_type( variable_name=variable_name or metadata_key, metadata_key=metadata_key, - definition=f"{{ %legacy_bracket_safety(%{cast}({out})) }}", + definition=f"{{ {out} }}", ) @@ -182,7 +181,6 @@ class MapMetadataVariable(MetadataVariable, MapVariable): Creates a map variable from entry metadata """ return _get( - "map", metadata_variable_name=ENTRY_METADATA_VARIABLE_NAME, metadata_key=metadata_key, variable_name=variable_name, @@ -204,7 +202,6 @@ class ArrayMetadataVariable(MetadataVariable, ArrayVariable): Creates an array variable from entry metadata """ return _get( - "array", metadata_variable_name=ENTRY_METADATA_VARIABLE_NAME, metadata_key=metadata_key, variable_name=variable_name, @@ -226,7 +223,6 @@ class StringMetadataVariable(MetadataVariable, StringVariable): Creates a string variable from entry metadata """ return _get( - "string", metadata_variable_name=ENTRY_METADATA_VARIABLE_NAME, metadata_key=metadata_key, variable_name=variable_name, @@ -245,7 +241,6 @@ class StringMetadataVariable(MetadataVariable, StringVariable): Creates a string variable from playlist metadata """ return _get( - "string", metadata_variable_name=PLAYLIST_METADATA_VARIABLE_NAME, metadata_key=metadata_key, variable_name=variable_name, @@ -264,7 +259,6 @@ class StringMetadataVariable(MetadataVariable, StringVariable): Creates a string variable from source metadata """ return _get( - "string", metadata_variable_name=SOURCE_METADATA_VARIABLE_NAME, metadata_key=metadata_key, variable_name=variable_name, @@ -301,7 +295,6 @@ class IntegerMetadataVariable(MetadataVariable, IntegerVariable): Creates an int variable from entry metadata """ return _get( - "int", metadata_variable_name=ENTRY_METADATA_VARIABLE_NAME, metadata_key=metadata_key, variable_name=variable_name, @@ -320,7 +313,6 @@ class IntegerMetadataVariable(MetadataVariable, IntegerVariable): Creates an int variable from playlist metadata """ return _get( - "int", metadata_variable_name=PLAYLIST_METADATA_VARIABLE_NAME, metadata_key=metadata_key, variable_name=variable_name, diff --git a/src/ytdl_sub/script/script.py b/src/ytdl_sub/script/script.py index 38e0346e..2e436e81 100644 --- a/src/ytdl_sub/script/script.py +++ b/src/ytdl_sub/script/script.py @@ -1,4 +1,5 @@ # pylint: disable=missing-raises-doc +import copy from typing import Dict from typing import List from typing import Optional @@ -7,6 +8,7 @@ from typing import Set from ytdl_sub.script.functions import Functions from ytdl_sub.script.parser import parse from ytdl_sub.script.script_output import ScriptOutput +from ytdl_sub.script.types.resolvable import Argument from ytdl_sub.script.types.resolvable import BuiltInFunctionType from ytdl_sub.script.types.resolvable import Lambda from ytdl_sub.script.types.resolvable import Resolvable @@ -14,6 +16,7 @@ from ytdl_sub.script.types.syntax_tree import ResolvedSyntaxTree from ytdl_sub.script.types.syntax_tree import SyntaxTree from ytdl_sub.script.types.variable import FunctionArgument from ytdl_sub.script.types.variable import Variable +from ytdl_sub.script.types.variable_dependency import VariableDependency from ytdl_sub.script.utils.exceptions import UNREACHABLE from ytdl_sub.script.utils.exceptions import CycleDetected from ytdl_sub.script.utils.exceptions import IncompatibleFunctionArguments @@ -695,3 +698,59 @@ class Script: Names of all functions within the Script. """ return set(to_function_definition_name(name) for name in self._functions.keys()) + + def resolve_partial( + self, + unresolvable: Optional[Set[str]] = None, + ) -> "Script": + """ + Returns + ------- + New (deep-copied) script that resolves inner variables as much + as possible. + """ + unresolvable: Set[str] = unresolvable or {} + resolved: Dict[Variable, Resolvable] = {} + unresolved: Dict[Variable, Argument] = { + Variable(name): definition + for name, definition in self._variables.items() + if name not in unresolvable + } + + partially_resolved = True + while partially_resolved: + + partially_resolved = False + + for variable in list(unresolved.keys()): + definition = unresolved[variable] + + maybe_resolved = definition + if isinstance(definition, Variable) and definition.name not in unresolvable: + maybe_resolved = resolved.get(definition, unresolved[definition]) + elif isinstance(definition, VariableDependency): + maybe_resolved = definition.partial_resolve( + resolved_variables=resolved, + unresolved_variables=unresolved, + custom_functions=self._functions, + ) + + if isinstance(maybe_resolved, Resolvable): + resolved[variable] = maybe_resolved + del unresolved[variable] + partially_resolved = True + else: + unresolved[variable] = maybe_resolved + + # If the definition changed, then the script changed + # which means we can iterate again + partially_resolved |= definition != maybe_resolved + + return copy.deepcopy(self).add_parsed( + {var_name: self._variables[var_name] for var_name in unresolvable} + | { + var.name: ResolvedSyntaxTree(ast=[definition]) + for var, definition in resolved.items() + } + | {var.name: SyntaxTree(ast=[definition]) for var, definition in unresolved.items()} + ) diff --git a/src/ytdl_sub/script/types/array.py b/src/ytdl_sub/script/types/array.py index 8adcfe50..204697fb 100644 --- a/src/ytdl_sub/script/types/array.py +++ b/src/ytdl_sub/script/types/array.py @@ -28,7 +28,7 @@ class UnresolvedArray(_Array, VariableDependency, FutureResolvable): value: List[Argument] @property - def _iterable_arguments(self) -> List[Argument]: + def iterable_arguments(self) -> List[Argument]: return self.value def resolve( @@ -47,6 +47,27 @@ class UnresolvedArray(_Array, VariableDependency, FutureResolvable): ] ) + def partial_resolve( + self, + resolved_variables: Dict[Variable, Resolvable], + unresolved_variables: Dict[Variable, Argument], + custom_functions: Dict[str, VariableDependency], + ) -> Argument | Resolvable: + maybe_resolvable_values, is_resolvable = VariableDependency.try_partial_resolve( + args=self.value, + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + + out = UnresolvedArray(value=maybe_resolvable_values) + if is_resolvable: + return out.resolve( + resolved_variables=resolved_variables, custom_functions=custom_functions + ) + + return out + def future_resolvable_type(self) -> Type[Resolvable]: return Array diff --git a/src/ytdl_sub/script/types/function.py b/src/ytdl_sub/script/types/function.py index 5f33006e..d34c0a47 100644 --- a/src/ytdl_sub/script/types/function.py +++ b/src/ytdl_sub/script/types/function.py @@ -4,6 +4,7 @@ from dataclasses import dataclass from typing import Callable from typing import Dict from typing import List +from typing import Optional from typing import Type from typing import Union @@ -11,9 +12,11 @@ from ytdl_sub.script.functions import Functions from ytdl_sub.script.types.array import Array from ytdl_sub.script.types.array import UnresolvedArray from ytdl_sub.script.types.resolvable import Argument +from ytdl_sub.script.types.resolvable import Boolean from ytdl_sub.script.types.resolvable import BuiltInFunctionType from ytdl_sub.script.types.resolvable import FunctionType from ytdl_sub.script.types.resolvable import FutureResolvable +from ytdl_sub.script.types.resolvable import Integer from ytdl_sub.script.types.resolvable import Lambda from ytdl_sub.script.types.resolvable import NamedCustomFunction from ytdl_sub.script.types.resolvable import Resolvable @@ -35,7 +38,7 @@ from ytdl_sub.script.utils.type_checking import is_union @dataclass(frozen=True) class Function(FunctionType, VariableDependency, ABC): @property - def _iterable_arguments(self) -> List[Argument]: + def iterable_arguments(self) -> List[Argument]: return self.args @@ -84,6 +87,52 @@ class CustomFunction(Function, NamedCustomFunction): # been checked in the parser with raise UNREACHABLE + def partial_resolve( + self, + resolved_variables: Dict[Variable, Resolvable], + unresolved_variables: Dict[Variable, Argument], + custom_functions: Dict[str, VariableDependency], + ) -> Argument | Resolvable: + maybe_resolvable_args, _ = VariableDependency.try_partial_resolve( + args=self.args, + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + + for i in range(len(self.args)): + function_arg = FunctionArgument.from_idx(idx=i, custom_function_name=self.name) + function_value = maybe_resolvable_args[i] + + if isinstance(function_value, Resolvable): + resolved_variables[function_arg] = function_value + else: + unresolved_variables[function_arg] = function_value + + assert len(custom_functions[self.name].iterable_arguments) == 1 + custom_function_definition = custom_functions[self.name].iterable_arguments[0] + + maybe_resolvable_custom_function, is_resolvable = VariableDependency.try_partial_resolve( + args=[custom_function_definition], + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + + for i in range(len(self.args)): + function_arg = FunctionArgument.from_idx(idx=i, custom_function_name=self.name) + + if isinstance(maybe_resolvable_args[i], Resolvable): + del resolved_variables[function_arg] + else: + del unresolved_variables[function_arg] + + if is_resolvable: + return maybe_resolvable_custom_function[0] + + # Did not resolve custom function arguments, do not proceed + return CustomFunction(name=self.name, args=maybe_resolvable_args) + class BuiltInFunction(Function, BuiltInFunctionType): def validate_args(self) -> "BuiltInFunction": @@ -312,5 +361,133 @@ class BuiltInFunction(Function, BuiltInFunctionType): f"Runtime error occurred when executing the function %{self.name}: {str(exc)}" ) from exc + def _partial_resolve_conditional( + self, + resolved_variables: Dict[Variable, Resolvable], + unresolved_variables: Dict[Variable, Argument], + custom_functions: Dict[str, "VariableDependency"], + ): + """ + If the conditional partially resolvable enough to warrant evaluation, + perform it here. + """ + if self.is_subset_of( + variables=resolved_variables, custom_function_definitions=custom_functions + ): + return self.resolve( + resolved_variables=resolved_variables, + custom_functions=custom_functions, + ) + + if self.name == "if": + maybe_resolvable_arg, is_resolvable = VariableDependency.try_partial_resolve( + args=[self.args[0]], + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + if is_resolvable: + boolean_output = maybe_resolvable_arg[0] + assert isinstance(boolean_output, Boolean) + return self.args[1] if boolean_output.native else self.args[2] + + if self.name == "elif": + for idx in range(0, len(self.args), 2): + maybe_resolvable_arg, is_resolvable = VariableDependency.try_partial_resolve( + args=[self.args[idx]], + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + if is_resolvable: + boolean_output = maybe_resolvable_arg[0] + assert isinstance(boolean_output, Boolean) + if boolean_output.native: + return self.args[idx + 1] + else: + break + + if self.name == "assert_then": + maybe_resolvable_arg, is_resolvable = VariableDependency.try_partial_resolve( + args=[self.args[0]], + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + if is_resolvable: + boolean_output = maybe_resolvable_arg[0] + assert isinstance(boolean_output, Boolean) + if boolean_output.native: + return self.args[1] + + return self + + def _try_optimized_partial_resolve( + self, + resolved_variables: Dict[Variable, Resolvable], + unresolved_variables: Dict[Variable, Argument], + custom_functions: Dict[str, "VariableDependency"], + ) -> Optional[Argument]: + """ + If a function has enough (but not all) resolved parameters to warrant a return, + perform it here. + """ + if self.name == "array_at": + if ( + isinstance(self.args[0], UnresolvedArray) + and isinstance(self.args[1], Integer) + and len(self.args[0].value) >= self.args[1].value + ): + maybe_resolvable_values, _ = VariableDependency.try_partial_resolve( + args=[self.args[0].value[self.args[1].value]], + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + + return maybe_resolvable_values[0] + + return None + + def partial_resolve( + self, + resolved_variables: Dict[Variable, Resolvable], + unresolved_variables: Dict[Variable, Argument], + custom_functions: Dict[str, VariableDependency], + ) -> Argument | Resolvable: + conditional_return_args = self.function_spec.conditional_arg_indices( + num_input_args=len(self.args) + ) + + if conditional_return_args: + return self._partial_resolve_conditional( + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + + if partial_resolved := self._try_optimized_partial_resolve( + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ): + return partial_resolved + + maybe_resolvable_values, is_resolvable = VariableDependency.try_partial_resolve( + args=self.args, + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + + out = BuiltInFunction(name=self.name, args=maybe_resolvable_values) + if is_resolvable: + return out.resolve( + resolved_variables=resolved_variables, + custom_functions=custom_functions, + ) + + return out + def __hash__(self): return hash((self.name, *self.args)) diff --git a/src/ytdl_sub/script/types/map.py b/src/ytdl_sub/script/types/map.py index 0fca1cbb..d5e2eb27 100644 --- a/src/ytdl_sub/script/types/map.py +++ b/src/ytdl_sub/script/types/map.py @@ -31,7 +31,7 @@ class UnresolvedMap(_Map, VariableDependency, FutureResolvable): value: Dict[Argument, Argument] @property - def _iterable_arguments(self) -> List[Argument]: + def iterable_arguments(self) -> List[Argument]: return list(itertools.chain(*self.value.items())) def resolve( @@ -55,6 +55,35 @@ class UnresolvedMap(_Map, VariableDependency, FutureResolvable): return Map(output) + def partial_resolve( + self, + resolved_variables: Dict[Variable, Resolvable], + unresolved_variables: Dict[Variable, Argument], + custom_functions: Dict[str, VariableDependency], + ) -> Argument | Resolvable: + maybe_resolvable_keys, is_keys_resolvable = VariableDependency.try_partial_resolve( + args=self.value.keys(), + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + + maybe_resolvable_values, is_values_resolvable = VariableDependency.try_partial_resolve( + args=self.value.values(), + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + + out = UnresolvedMap(value=dict(zip(maybe_resolvable_keys, maybe_resolvable_values))) + if is_keys_resolvable and is_values_resolvable: + return out.resolve( + resolved_variables=resolved_variables, + custom_functions=custom_functions, + ) + + return out + def future_resolvable_type(self) -> Type[Resolvable]: return Map diff --git a/src/ytdl_sub/script/types/syntax_tree.py b/src/ytdl_sub/script/types/syntax_tree.py index eff39990..2a970300 100644 --- a/src/ytdl_sub/script/types/syntax_tree.py +++ b/src/ytdl_sub/script/types/syntax_tree.py @@ -3,6 +3,7 @@ from typing import Dict from typing import List from typing import Optional +from ytdl_sub.script.types.function import BuiltInFunction from ytdl_sub.script.types.resolvable import Argument from ytdl_sub.script.types.resolvable import Resolvable from ytdl_sub.script.types.resolvable import String @@ -15,7 +16,7 @@ class SyntaxTree(VariableDependency): ast: List[Argument] @property - def _iterable_arguments(self) -> List[Argument]: + def iterable_arguments(self) -> List[Argument]: return self.ast def resolve( @@ -40,6 +41,26 @@ class SyntaxTree(VariableDependency): # Otherwise, to concat multiple resolved outputs, we must concat as strings return String("".join([str(res) for res in resolved])) + def partial_resolve( + self, + resolved_variables: Dict[Variable, Resolvable], + unresolved_variables: Dict[Variable, Argument], + custom_functions: Dict[str, VariableDependency], + ) -> Argument | Resolvable: + # Ensure this does not get returned as a SyntaxTree since nesting them is not supported. + maybe_resolvable_values, _ = VariableDependency.try_partial_resolve( + args=self.ast, + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + + # Mimic the above resolve behavior + if len(maybe_resolvable_values) > 1: + return BuiltInFunction(name="concat", args=maybe_resolvable_values) + + return maybe_resolvable_values[0] + @property def maybe_resolvable(self) -> Optional[Resolvable]: """ @@ -76,3 +97,11 @@ class ResolvedSyntaxTree(SyntaxTree): @property def maybe_resolvable(self) -> Optional[Resolvable]: return self.ast[0] + + def partial_resolve( + self, + resolved_variables: Dict[Variable, Resolvable], + unresolved_variables: Dict[Variable, Argument], + custom_functions: Dict[str, VariableDependency], + ) -> Argument | Resolvable: + return self.ast[0] diff --git a/src/ytdl_sub/script/types/variable_dependency.py b/src/ytdl_sub/script/types/variable_dependency.py index 37130b7a..5cfee863 100644 --- a/src/ytdl_sub/script/types/variable_dependency.py +++ b/src/ytdl_sub/script/types/variable_dependency.py @@ -5,6 +5,7 @@ from typing import Dict from typing import Iterable from typing import List from typing import Set +from typing import Tuple from typing import Type from typing import TypeVar from typing import final @@ -27,7 +28,7 @@ TypeT = TypeVar("TypeT") class VariableDependency(ABC): @property @abstractmethod - def _iterable_arguments(self) -> List[Argument]: + def iterable_arguments(self) -> List[Argument]: """ Returns ------- @@ -38,7 +39,7 @@ class VariableDependency(ABC): self, ttype: Type[TypeT], subclass: bool = False, instance: bool = True ) -> List[TypeT]: output: List[TypeT] = [] - for arg in self._iterable_arguments: + for arg in self.iterable_arguments: if subclass and issubclass(type(arg), ttype): output.append(arg) elif instance and isinstance(arg, ttype): @@ -104,7 +105,7 @@ class VariableDependency(ABC): All CustomFunctions that this depends on. """ output: Set[ParsedCustomFunction] = set() - for arg in self._iterable_arguments: + for arg in self.iterable_arguments: if isinstance(arg, NamedCustomFunction): if not isinstance(arg, FunctionType): # A NamedCustomFunction should also always be a FunctionType @@ -138,6 +139,28 @@ class VariableDependency(ABC): Resolved value """ + @abstractmethod + def partial_resolve( + self, + resolved_variables: Dict[Variable, Resolvable], + unresolved_variables: Dict[Variable, Argument], + custom_functions: Dict[str, "VariableDependency"], + ) -> Argument | Resolvable: + """ + Parameters + ---------- + resolved_variables + Lookup of variables that have been resolved + unresolved_variables + Lookup of variables that have not been resolved + custom_functions + Lookup of any custom functions that have been parsed + + Returns + ------- + Either a fully resolved value or partially resolved value of the same type. + """ + @classmethod def _resolve_argument_type( cls, @@ -222,3 +245,43 @@ class VariableDependency(ABC): ): return True return len(self.variables.intersection(variables)) > 0 + + @classmethod + def try_partial_resolve( + cls, + args: Iterable[Argument], + resolved_variables: Dict[Variable, Resolvable], + unresolved_variables: Dict[Variable, Argument], + custom_functions: Dict[str, "VariableDependency"], + ) -> Tuple[List[Argument], bool]: + """ + Attempts to resolve a list of arguments. Returns a tuple of them post partially resolved, + and a boolean indicating whether all of them are fully resolved. + """ + maybe_resolvable_args: List[Argument] = [] + is_resolvable = True + for arg in args: + maybe_resolvable_args.append(arg) + + if isinstance(arg, Lambda) and arg.value in custom_functions: + if not custom_functions[arg.value].is_subset_of( + variables=resolved_variables, + custom_function_definitions=custom_functions, + ): + is_resolvable = False + elif isinstance(arg, VariableDependency): + maybe_resolvable_args[-1] = arg.partial_resolve( + resolved_variables=resolved_variables, + unresolved_variables=unresolved_variables, + custom_functions=custom_functions, + ) + + if not isinstance(maybe_resolvable_args[-1], Resolvable): + is_resolvable = False + elif isinstance(arg, Variable): + if arg not in resolved_variables: + is_resolvable = False + if arg in unresolved_variables: + maybe_resolvable_args[-1] = unresolved_variables[arg] + + return maybe_resolvable_args, is_resolvable diff --git a/src/ytdl_sub/utils/script.py b/src/ytdl_sub/utils/script.py index 753916f4..22fc6487 100644 --- a/src/ytdl_sub/utils/script.py +++ b/src/ytdl_sub/utils/script.py @@ -2,11 +2,14 @@ import json import re from typing import Any from typing import Dict +from typing import Optional from ytdl_sub.script.parser import parse +from ytdl_sub.script.types.array import Array from ytdl_sub.script.types.array import UnresolvedArray from ytdl_sub.script.types.function import BuiltInFunction from ytdl_sub.script.types.function import Function +from ytdl_sub.script.types.map import Map from ytdl_sub.script.types.map import UnresolvedMap from ytdl_sub.script.types.resolvable import Argument from ytdl_sub.script.types.resolvable import Boolean @@ -105,6 +108,19 @@ class ScriptUtils: raise UNREACHABLE + @classmethod + def _get_quote_char(cls, arg: str) -> str: + contains_single_quote = "'" in arg + contains_double_quote = '"' in arg + + if not contains_single_quote and not contains_double_quote: + return '"' + if not contains_single_quote and contains_double_quote: + return "'" + if contains_single_quote and not contains_double_quote: + return '"' + return "'''" + @classmethod def _to_script_code(cls, arg: Argument, top_level: bool = False) -> str: if not top_level and isinstance(arg, (Integer, Boolean, Float)): @@ -114,18 +130,7 @@ class ScriptUtils: if arg.native == "": return "" if top_level else "''" - contains_single_quote = "'" in arg.native - contains_double_quote = '"' in arg.native - - if not contains_single_quote and not contains_double_quote: - quote = '"' - elif not contains_single_quote and contains_double_quote: - quote = "'" - elif contains_single_quote and not contains_double_quote: - quote = '"' - else: - quote = "'''" - + quote = cls._get_quote_char(arg.native) return arg.native if top_level else f"{quote}{arg.native}{quote}" if isinstance(arg, Integer): @@ -134,9 +139,9 @@ class ScriptUtils: out = f"%bool({arg.native})" elif isinstance(arg, Float): out = f"%float({arg.native})" - elif isinstance(arg, UnresolvedArray): + elif isinstance(arg, (Array, UnresolvedArray)): out = f"[ {', '.join(cls._to_script_code(val) for val in arg.value)} ]" - elif isinstance(arg, UnresolvedMap): + elif isinstance(arg, (Map, UnresolvedMap)): kv_list = ( f"{cls._to_script_code(key)}: {cls._to_script_code(val)}" for key, val in arg.value.items() @@ -152,11 +157,43 @@ class ScriptUtils: raise UNREACHABLE return f"{{ {out} }}" if top_level else out + @classmethod + def _is_top_level_string(cls, tree: SyntaxTree) -> Optional[str]: + if not ( + len(tree.ast) == 1 + and isinstance(tree.ast[0], BuiltInFunction) + and tree.ast[0].name == "concat" + ): + return None + + output = "" + for arg in tree.ast[0].args: + if isinstance(arg, BuiltInFunction) and arg.name == "string" and len(arg.args) == 1: + output += cls._to_script_code(arg.args[0], top_level=True) + else: + output += cls._to_script_code(arg, top_level=True) + + return output + + @classmethod + def _syntax_tree_to_native_script(cls, tree: SyntaxTree) -> str: + + if (output := cls._is_top_level_string(tree)) is not None: + return output + + output = "" + for arg in tree.ast: + output += cls._to_script_code(arg, top_level=True) + return output + @classmethod def to_native_script(cls, value: Any) -> str: """ Converts any JSON-compatible value into equivalent script syntax """ + if isinstance(value, SyntaxTree): + return cls._syntax_tree_to_native_script(value) + return cls._to_script_code(cls._to_script_argument(value), top_level=True) @classmethod diff --git a/tests/resources.py b/tests/resources.py index c1aa18d4..a327be02 100644 --- a/tests/resources.py +++ b/tests/resources.py @@ -1,18 +1,37 @@ +import json import os import shutil from pathlib import Path +from typing import Dict DISABLE_YOUTUBE_TESTS: bool = True REGENERATE_FIXTURES: bool = False RESOURCE_PATH: Path = Path("tests") / "resources" _FILE_FIXTURE_PATH: Path = RESOURCE_PATH / "file_fixtures" +_EXPECTED_JSON_PATH: Path = RESOURCE_PATH / "expected_json" def file_fixture_path(fixture_name: str) -> Path: return _FILE_FIXTURE_PATH / fixture_name +def expected_json(input_json: Dict, json_name: str) -> Dict: + expected_json_path = _EXPECTED_JSON_PATH / json_name + os.makedirs(os.path.dirname(expected_json_path), exist_ok=True) + + if REGENERATE_FIXTURES: + with open(expected_json_path, "w", encoding="utf-8") as json_file: + json.dump(input_json, json_file, sort_keys=True, indent=2) + + return input_json + + with open(expected_json_path, "r", encoding="utf-8") as json_file: + expected_json = json.load(json_file) + + return expected_json + + def copy_file_fixture(fixture_name: str, output_file_path: Path) -> None: os.makedirs(os.path.dirname(output_file_path), exist_ok=True) shutil.copy(file_fixture_path(fixture_name), output_file_path) diff --git a/tests/resources/expected_json/music/inspect_full_overrides.json b/tests/resources/expected_json/music/inspect_full_overrides.json new file mode 100644 index 00000000..ac17630f --- /dev/null +++ b/tests/resources/expected_json/music/inspect_full_overrides.json @@ -0,0 +1,137 @@ +{ + "album_cover_path": "Lester Young/{ %concat( \"[\", %string( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ), \"] \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }/folder.jpg", + "album_dir": "[{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }] { %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "artist_dir": "Lester Young", + "avatar_uncropped_thumbnail_file_name": "", + "banner_uncropped_thumbnail_file_name": "", + "enable_resolution_assert": "{ %bool(True) }", + "enable_throttle_protection": "{ %bool(True) }", + "include_sibling_metadata": "{ %bool(True) }", + "modified_webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "music_directory": "tv_show_directory_path", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), resolution_assert_ignore_titles ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_readable": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }x{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "subscription_array": "{ [ \"https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists\" ] }", + "subscription_indent_1": "Jazz", + "subscription_value": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "subscription_value_1": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "track_album": "{ %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "track_album_artist": "Lester Young", + "track_artist": "Lester Young", + "track_date": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }", + "track_file_name": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) } - { %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }.{ ext }", + "track_full_path": "Lester Young/{ %concat( \"[\", %string( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ), \"] \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }/{ %concat( %string( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) ), \" - \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ), \".\", %string( ext ) ) }", + "track_genre": "Jazz", + "track_genre_default": "Unset", + "track_number": "{ %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) }", + "track_number_padded": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) }", + "track_original_date": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }", + "track_title": "{ %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) }", + "track_total": "{ %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) }", + "track_year": "{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }", + "url": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "url10": "", + "url100": "", + "url11": "", + "url12": "", + "url13": "", + "url14": "", + "url15": "", + "url16": "", + "url17": "", + "url18": "", + "url19": "", + "url2": "", + "url20": "", + "url21": "", + "url22": "", + "url23": "", + "url24": "", + "url25": "", + "url26": "", + "url27": "", + "url28": "", + "url29": "", + "url3": "", + "url30": "", + "url31": "", + "url32": "", + "url33": "", + "url34": "", + "url35": "", + "url36": "", + "url37": "", + "url38": "", + "url39": "", + "url4": "", + "url40": "", + "url41": "", + "url42": "", + "url43": "", + "url44": "", + "url45": "", + "url46": "", + "url47": "", + "url48": "", + "url49": "", + "url5": "", + "url50": "", + "url51": "", + "url52": "", + "url53": "", + "url54": "", + "url55": "", + "url56": "", + "url57": "", + "url58": "", + "url59": "", + "url6": "", + "url60": "", + "url61": "", + "url62": "", + "url63": "", + "url64": "", + "url65": "", + "url66": "", + "url67": "", + "url68": "", + "url69": "", + "url7": "", + "url70": "", + "url71": "", + "url72": "", + "url73": "", + "url74": "", + "url75": "", + "url76": "", + "url77": "", + "url78": "", + "url79": "", + "url8": "", + "url80": "", + "url81": "", + "url82": "", + "url83": "", + "url84": "", + "url85": "", + "url86": "", + "url87": "", + "url88": "", + "url89": "", + "url9": "", + "url90": "", + "url91": "", + "url92": "", + "url93": "", + "url94": "", + "url95": "", + "url96": "", + "url97": "", + "url98": "", + "url99": "", + "urls": "{ [ \"https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists\" ] }" +} \ No newline at end of file diff --git a/tests/resources/expected_json/music/inspect_full_variables.json b/tests/resources/expected_json/music/inspect_full_variables.json new file mode 100644 index 00000000..ca5513bf --- /dev/null +++ b/tests/resources/expected_json/music/inspect_full_variables.json @@ -0,0 +1,482 @@ +{ + "album_cover_path": "Lester Young/{ %concat( \"[\", %string( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ), \"] \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }/folder.jpg", + "album_cover_path_sanitized": "{ %sanitize( %concat( \"Lester Young\", \"/\", %string( %concat( \"[\", %string( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ), \"] \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) ), \"/folder.\", \"jpg\" ) ) }", + "album_dir": "[{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }] { %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "album_dir_sanitized": "{ %sanitize( %concat( \"[\", %string( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ), \"] \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) ) }", + "artist_dir": "Lester Young", + "artist_dir_sanitized": "Lester Young", + "avatar_uncropped_thumbnail_file_name": "", + "avatar_uncropped_thumbnail_file_name_sanitized": "", + "banner_uncropped_thumbnail_file_name": "", + "banner_uncropped_thumbnail_file_name_sanitized": "", + "channel": "{ %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "channel_id": "{ %map_get_non_empty( entry_metadata, \"channel_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "channel_id_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"channel_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "channel_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "chapters": "{ [ ] }", + "chapters_sanitized": "[]", + "comments": "{ [ ] }", + "comments_sanitized": "[]", + "creator": "{ %map_get_non_empty( entry_metadata, \"creator\", %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "creator_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"creator\", %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }", + "description": "{ %map_get_non_empty( entry_metadata, \"description\", '' ) }", + "description_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"description\", '' ) ) }", + "download_index": "{ %int(1) }", + "download_index_padded6": "000001", + "download_index_padded6_sanitized": "000001", + "download_index_sanitized": "1", + "duration": "{ %map_get_non_empty( entry_metadata, \"duration\", 0 ) }", + "duration_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"duration\", 0 ) ) }", + "enable_resolution_assert": "{ %bool(True) }", + "enable_resolution_assert_sanitized": "true", + "enable_throttle_protection": "{ %bool(True) }", + "enable_throttle_protection_sanitized": "true", + "entry_metadata": "{ { } }", + "entry_metadata_sanitized": "{ %sanitize( entry_metadata ) }", + "epoch": "{ %map_get( entry_metadata, \"epoch\" ) }", + "epoch_date": "{ %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) }", + "epoch_date_sanitized": "{ %sanitize( %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) }", + "epoch_hour": "{ %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%H\" ) }", + "epoch_hour_sanitized": "{ %sanitize( %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%H\" ) ) }", + "epoch_sanitized": "{ %sanitize( %map_get( entry_metadata, \"epoch\" ) ) }", + "ext": "{ %throw( \"Plugin variable ext has not been created yet\" ) }", + "ext_sanitized": "{ %sanitize( ext ) }", + "extractor": "{ %map_get( entry_metadata, \"extractor\" ) }", + "extractor_key": "{ %map_get( entry_metadata, \"extractor_key\" ) }", + "extractor_key_sanitized": "{ %sanitize( %map_get( entry_metadata, \"extractor_key\" ) ) }", + "extractor_sanitized": "{ %sanitize( %map_get( entry_metadata, \"extractor\" ) ) }", + "height": "{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "height_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"height\", 0 ) ) }", + "ie_key": "{ %map_get_non_empty( entry_metadata, \"ie_key\", %map_get( entry_metadata, \"extractor_key\" ) ) }", + "ie_key_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"ie_key\", %map_get( entry_metadata, \"extractor_key\" ) ) ) }", + "include_sibling_metadata": "{ %bool(True) }", + "include_sibling_metadata_sanitized": "true", + "info_json_ext": "info.json", + "info_json_ext_sanitized": "info.json", + "modified_webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "modified_webpage_url_sanitized": "{ %sanitize( %map_get( entry_metadata, \"webpage_url\" ) ) }", + "music_directory": "tv_show_directory_path", + "music_directory_sanitized": "tv_show_directory_path", + "playlist_count": "{ %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) }", + "playlist_count_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) ) }", + "playlist_description": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) }", + "playlist_description_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) ) }", + "playlist_index": "{ %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) }", + "playlist_index_padded": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) }", + "playlist_index_padded6": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 6 ) }", + "playlist_index_padded6_sanitized": "{ %sanitize( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 6 ) ) }", + "playlist_index_padded_sanitized": "{ %sanitize( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) ) }", + "playlist_index_reversed": "{ %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ) }", + "playlist_index_reversed_padded": "{ %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 2 ) }", + "playlist_index_reversed_padded6": "{ %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 6 ) }", + "playlist_index_reversed_padded6_sanitized": "{ %sanitize( %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 6 ) ) }", + "playlist_index_reversed_padded_sanitized": "{ %sanitize( %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 2 ) ) }", + "playlist_index_reversed_sanitized": "{ %sanitize( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ) ) }", + "playlist_index_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) ) }", + "playlist_max_upload_date": "{ %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) }", + "playlist_max_upload_date_sanitized": "{ %sanitize( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ) }", + "playlist_max_upload_year": "{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }", + "playlist_max_upload_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ) }", + "playlist_max_upload_year_truncated": "{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year_truncated\" ) ) }", + "playlist_max_upload_year_truncated_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year_truncated\" ) ) ) }", + "playlist_metadata": "{ %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ) }", + "playlist_metadata_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ) ) }", + "playlist_title": "{ %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "playlist_title_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "playlist_uid": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) }", + "playlist_uid_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "playlist_uploader": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "playlist_uploader_id": "{ %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "playlist_uploader_id_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "playlist_uploader_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "playlist_uploader_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) }", + "playlist_uploader_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "playlist_webpage_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) }", + "playlist_webpage_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "release_date": "{ %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) }", + "release_date_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ) }", + "release_date_standardized": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"date_standardized\" ) ) }", + "release_date_standardized_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"date_standardized\" ) ) ) }", + "release_day": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day\" ) ) }", + "release_day_of_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year\" ) ) }", + "release_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_padded\" ) ) }", + "release_day_of_year_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_padded\" ) ) ) }", + "release_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed\" ) ) }", + "release_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed_padded\" ) ) }", + "release_day_of_year_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed_padded\" ) ) ) }", + "release_day_of_year_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed\" ) ) ) }", + "release_day_of_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year\" ) ) ) }", + "release_day_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_padded\" ) ) }", + "release_day_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_padded\" ) ) ) }", + "release_day_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed\" ) ) }", + "release_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed_padded\" ) ) }", + "release_day_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed_padded\" ) ) ) }", + "release_day_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed\" ) ) ) }", + "release_day_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day\" ) ) ) }", + "release_month": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month\" ) ) }", + "release_month_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_padded\" ) ) }", + "release_month_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_padded\" ) ) ) }", + "release_month_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed\" ) ) }", + "release_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed_padded\" ) ) }", + "release_month_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed_padded\" ) ) ) }", + "release_month_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed\" ) ) ) }", + "release_month_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month\" ) ) ) }", + "release_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year\" ) ) }", + "release_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year\" ) ) ) }", + "release_year_truncated": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated\" ) ) }", + "release_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated_reversed\" ) ) }", + "release_year_truncated_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated_reversed\" ) ) ) }", + "release_year_truncated_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated\" ) ) ) }", + "requested_subtitles": "{ { } }", + "requested_subtitles_sanitized": "{}", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_height_gte_sanitized": "361", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_ignore_titles_sanitized": "[]", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), resolution_assert_ignore_titles ) ) }", + "resolution_assert_is_ignored_sanitized": "{ %sanitize( %print_if_true( %concat( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), resolution_assert_ignore_titles ) ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_assert_print_sanitized": "true", + "resolution_assert_sanitized": "{ %sanitize( %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) ) }", + "resolution_readable": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }x{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "resolution_readable_sanitized": "{ %sanitize( %concat( %string( %map_get_non_empty( entry_metadata, \"width\", 0 ) ), \"x\", %string( %map_get_non_empty( entry_metadata, \"height\", 0 ) ) ) ) }", + "sibling_metadata": "{ %map_get_non_empty( entry_metadata, \"sibling_metadata\", [ ] ) }", + "sibling_metadata_sanitized": "{ %sanitize( sibling_metadata ) }", + "source_count": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_count\", 1 ) }", + "source_count_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_count\", 1 ) ) }", + "source_description": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"description\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) ) }", + "source_description_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"description\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) ) ) }", + "source_index": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ) }", + "source_index_padded": "{ %pad_zero( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ), 2 ) }", + "source_index_padded_sanitized": "{ %sanitize( %pad_zero( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ), 2 ) ) }", + "source_index_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ) ) }", + "source_metadata": "{ %map_get_non_empty( entry_metadata, \"source_metadata\", { } ) }", + "source_metadata_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ) ) }", + "source_title": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"title\", %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "source_title_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"title\", %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "source_uid": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"id\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "source_uid_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"id\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "source_uploader": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "source_uploader_id": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_id\", %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "source_uploader_id_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_id\", %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "source_uploader_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }", + "source_uploader_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) ) }", + "source_uploader_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) ) ) }", + "source_webpage_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "source_webpage_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) ) }", + "sponsorblock_chapters": "{ [ ] }", + "sponsorblock_chapters_sanitized": "[]", + "subscription_array": "{ [ \"https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists\" ] }", + "subscription_array_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8channel\u29f8UCsItMF6_fP754ihIsSRLk5A\u29f8playlists\uff02]", + "subscription_has_download_archive": "{ %bool(False) }", + "subscription_has_download_archive_sanitized": "false", + "subscription_indent_1": "Jazz", + "subscription_indent_1_sanitized": "Jazz", + "subscription_name": "Lester Young", + "subscription_name_sanitized": "Lester Young", + "subscription_value": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "subscription_value_1": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "subscription_value_1_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8channel\u29f8UCsItMF6_fP754ihIsSRLk5A\u29f8playlists", + "subscription_value_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8channel\u29f8UCsItMF6_fP754ihIsSRLk5A\u29f8playlists", + "thumbnail_ext": "jpg", + "thumbnail_ext_sanitized": "jpg", + "title": "{ %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) }", + "title_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "title_sanitized_plex": "{ %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "title_sanitized_plex_sanitized": "{ %sanitize( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "track_album": "{ %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "track_album_artist": "Lester Young", + "track_album_artist_sanitized": "Lester Young", + "track_album_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "track_artist": "Lester Young", + "track_artist_sanitized": "Lester Young", + "track_date": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }", + "track_date_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) }", + "track_file_name": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) } - { %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }.{ ext }", + "track_file_name_sanitized": "{ %sanitize( %concat( %string( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) ), \" - \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ), \".\", %string( ext ) ) ) }", + "track_full_path": "Lester Young/{ %concat( \"[\", %string( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ), \"] \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }/{ %concat( %string( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) ), \" - \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ), \".\", %string( ext ) ) }", + "track_full_path_sanitized": "{ %sanitize( %concat( \"Lester Young\", \"/\", %string( %concat( \"[\", %string( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ), \"] \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) ), \"/\", %string( %concat( %string( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) ), \" - \", %string( %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ), \".\", %string( ext ) ) ) ) ) }", + "track_genre": "Jazz", + "track_genre_default": "Unset", + "track_genre_default_sanitized": "Unset", + "track_genre_sanitized": "Jazz", + "track_number": "{ %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) }", + "track_number_padded": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) }", + "track_number_padded_sanitized": "{ %sanitize( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) ) }", + "track_number_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) ) }", + "track_original_date": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }", + "track_original_date_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) }", + "track_title": "{ %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) }", + "track_title_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "track_total": "{ %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) }", + "track_total_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) ) }", + "track_year": "{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }", + "track_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ) }", + "uid": "{ %map_get( entry_metadata, \"id\" ) }", + "uid_sanitized": "{ %sanitize( %map_get( entry_metadata, \"id\" ) ) }", + "uid_sanitized_plex": "{ %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) }", + "uid_sanitized_plex_sanitized": "{ %sanitize( %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) ) }", + "upload_date": "{ %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) }", + "upload_date_index": "{ %int(1) }", + "upload_date_index_padded": "01", + "upload_date_index_padded_sanitized": "01", + "upload_date_index_reversed": "{ %int(99) }", + "upload_date_index_reversed_padded": "99", + "upload_date_index_reversed_padded_sanitized": "99", + "upload_date_index_reversed_sanitized": "99", + "upload_date_index_sanitized": "1", + "upload_date_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) }", + "upload_date_standardized": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }", + "upload_date_standardized_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) }", + "upload_day": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day\" ) ) }", + "upload_day_of_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year\" ) ) }", + "upload_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_padded\" ) ) }", + "upload_day_of_year_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_padded\" ) ) ) }", + "upload_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed\" ) ) }", + "upload_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed_padded\" ) ) }", + "upload_day_of_year_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed_padded\" ) ) ) }", + "upload_day_of_year_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed\" ) ) ) }", + "upload_day_of_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year\" ) ) ) }", + "upload_day_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ) }", + "upload_day_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ) ) }", + "upload_day_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed\" ) ) }", + "upload_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed_padded\" ) ) }", + "upload_day_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed_padded\" ) ) ) }", + "upload_day_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed\" ) ) ) }", + "upload_day_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day\" ) ) ) }", + "upload_month": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ) }", + "upload_month_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_padded\" ) ) }", + "upload_month_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_padded\" ) ) ) }", + "upload_month_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed\" ) ) }", + "upload_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed_padded\" ) ) }", + "upload_month_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed_padded\" ) ) ) }", + "upload_month_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed\" ) ) ) }", + "upload_month_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ) ) }", + "upload_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }", + "upload_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) }", + "upload_year_truncated": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated\" ) ) }", + "upload_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated_reversed\" ) ) }", + "upload_year_truncated_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated_reversed\" ) ) ) }", + "upload_year_truncated_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated\" ) ) ) }", + "uploader": "{ %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "uploader_id": "{ %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) }", + "uploader_id_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "uploader_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "uploader_url": "{ %map_get_non_empty( entry_metadata, \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) }", + "uploader_url_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "url": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "url10": "", + "url100": "", + "url100_sanitized": "", + "url10_sanitized": "", + "url11": "", + "url11_sanitized": "", + "url12": "", + "url12_sanitized": "", + "url13": "", + "url13_sanitized": "", + "url14": "", + "url14_sanitized": "", + "url15": "", + "url15_sanitized": "", + "url16": "", + "url16_sanitized": "", + "url17": "", + "url17_sanitized": "", + "url18": "", + "url18_sanitized": "", + "url19": "", + "url19_sanitized": "", + "url2": "", + "url20": "", + "url20_sanitized": "", + "url21": "", + "url21_sanitized": "", + "url22": "", + "url22_sanitized": "", + "url23": "", + "url23_sanitized": "", + "url24": "", + "url24_sanitized": "", + "url25": "", + "url25_sanitized": "", + "url26": "", + "url26_sanitized": "", + "url27": "", + "url27_sanitized": "", + "url28": "", + "url28_sanitized": "", + "url29": "", + "url29_sanitized": "", + "url2_sanitized": "", + "url3": "", + "url30": "", + "url30_sanitized": "", + "url31": "", + "url31_sanitized": "", + "url32": "", + "url32_sanitized": "", + "url33": "", + "url33_sanitized": "", + "url34": "", + "url34_sanitized": "", + "url35": "", + "url35_sanitized": "", + "url36": "", + "url36_sanitized": "", + "url37": "", + "url37_sanitized": "", + "url38": "", + "url38_sanitized": "", + "url39": "", + "url39_sanitized": "", + "url3_sanitized": "", + "url4": "", + "url40": "", + "url40_sanitized": "", + "url41": "", + "url41_sanitized": "", + "url42": "", + "url42_sanitized": "", + "url43": "", + "url43_sanitized": "", + "url44": "", + "url44_sanitized": "", + "url45": "", + "url45_sanitized": "", + "url46": "", + "url46_sanitized": "", + "url47": "", + "url47_sanitized": "", + "url48": "", + "url48_sanitized": "", + "url49": "", + "url49_sanitized": "", + "url4_sanitized": "", + "url5": "", + "url50": "", + "url50_sanitized": "", + "url51": "", + "url51_sanitized": "", + "url52": "", + "url52_sanitized": "", + "url53": "", + "url53_sanitized": "", + "url54": "", + "url54_sanitized": "", + "url55": "", + "url55_sanitized": "", + "url56": "", + "url56_sanitized": "", + "url57": "", + "url57_sanitized": "", + "url58": "", + "url58_sanitized": "", + "url59": "", + "url59_sanitized": "", + "url5_sanitized": "", + "url6": "", + "url60": "", + "url60_sanitized": "", + "url61": "", + "url61_sanitized": "", + "url62": "", + "url62_sanitized": "", + "url63": "", + "url63_sanitized": "", + "url64": "", + "url64_sanitized": "", + "url65": "", + "url65_sanitized": "", + "url66": "", + "url66_sanitized": "", + "url67": "", + "url67_sanitized": "", + "url68": "", + "url68_sanitized": "", + "url69": "", + "url69_sanitized": "", + "url6_sanitized": "", + "url7": "", + "url70": "", + "url70_sanitized": "", + "url71": "", + "url71_sanitized": "", + "url72": "", + "url72_sanitized": "", + "url73": "", + "url73_sanitized": "", + "url74": "", + "url74_sanitized": "", + "url75": "", + "url75_sanitized": "", + "url76": "", + "url76_sanitized": "", + "url77": "", + "url77_sanitized": "", + "url78": "", + "url78_sanitized": "", + "url79": "", + "url79_sanitized": "", + "url7_sanitized": "", + "url8": "", + "url80": "", + "url80_sanitized": "", + "url81": "", + "url81_sanitized": "", + "url82": "", + "url82_sanitized": "", + "url83": "", + "url83_sanitized": "", + "url84": "", + "url84_sanitized": "", + "url85": "", + "url85_sanitized": "", + "url86": "", + "url86_sanitized": "", + "url87": "", + "url87_sanitized": "", + "url88": "", + "url88_sanitized": "", + "url89": "", + "url89_sanitized": "", + "url8_sanitized": "", + "url9": "", + "url90": "", + "url90_sanitized": "", + "url91": "", + "url91_sanitized": "", + "url92": "", + "url92_sanitized": "", + "url93": "", + "url93_sanitized": "", + "url94": "", + "url94_sanitized": "", + "url95": "", + "url95_sanitized": "", + "url96": "", + "url96_sanitized": "", + "url97": "", + "url97_sanitized": "", + "url98": "", + "url98_sanitized": "", + "url99": "", + "url99_sanitized": "", + "url9_sanitized": "", + "url_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8channel\u29f8UCsItMF6_fP754ihIsSRLk5A\u29f8playlists", + "urls": "{ [ \"https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists\" ] }", + "urls_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8channel\u29f8UCsItMF6_fP754ihIsSRLk5A\u29f8playlists\uff02]", + "webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "webpage_url_sanitized": "{ %sanitize( %map_get( entry_metadata, \"webpage_url\" ) ) }", + "width": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }", + "width_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"width\", 0 ) ) }", + "ytdl_sub_entry_date_eval": "{ %string( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) }", + "ytdl_sub_entry_date_eval_sanitized": "{ %sanitize( %string( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) ) }", + "ytdl_sub_input_url": "", + "ytdl_sub_input_url_count": "{ %int(0) }", + "ytdl_sub_input_url_count_sanitized": "0", + "ytdl_sub_input_url_index": "{ %int(-1) }", + "ytdl_sub_input_url_index_sanitized": "-1", + "ytdl_sub_input_url_sanitized": "" +} \ No newline at end of file diff --git a/tests/resources/expected_json/music/inspect_overrides.json b/tests/resources/expected_json/music/inspect_overrides.json new file mode 100644 index 00000000..19490f00 --- /dev/null +++ b/tests/resources/expected_json/music/inspect_overrides.json @@ -0,0 +1,137 @@ +{ + "album_cover_path": "Lester Young/{ %concat( \"[\", %string( playlist_max_upload_year ), \"] \", %string( %sanitize( playlist_title ) ) ) }/folder.{ thumbnail_ext }", + "album_dir": "[{ playlist_max_upload_year }] { %sanitize( playlist_title ) }", + "artist_dir": "Lester Young", + "avatar_uncropped_thumbnail_file_name": "", + "banner_uncropped_thumbnail_file_name": "", + "enable_resolution_assert": "{ %bool(True) }", + "enable_throttle_protection": "{ %bool(True) }", + "include_sibling_metadata": "{ %bool(True) }", + "modified_webpage_url": "{ webpage_url }", + "music_directory": "tv_show_directory_path", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( title, \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( title, resolution_assert_ignore_titles ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_readable": "{ width }x{ height }", + "subscription_array": "{ [ \"https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists\" ] }", + "subscription_indent_1": "Jazz", + "subscription_value": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "subscription_value_1": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "track_album": "{ playlist_title }", + "track_album_artist": "Lester Young", + "track_artist": "Lester Young", + "track_date": "{ upload_date_standardized }", + "track_file_name": "{ playlist_index_padded } - { %sanitize( title ) }.{ ext }", + "track_full_path": "Lester Young/{ %concat( \"[\", %string( playlist_max_upload_year ), \"] \", %string( %sanitize( playlist_title ) ) ) }/{ %concat( %string( playlist_index_padded ), \" - \", %string( %sanitize( title ) ), \".\", %string( ext ) ) }", + "track_genre": "Jazz", + "track_genre_default": "Unset", + "track_number": "{ playlist_index }", + "track_number_padded": "{ playlist_index_padded }", + "track_original_date": "{ upload_date_standardized }", + "track_title": "{ title }", + "track_total": "{ playlist_count }", + "track_year": "{ playlist_max_upload_year }", + "url": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "url10": "", + "url100": "", + "url11": "", + "url12": "", + "url13": "", + "url14": "", + "url15": "", + "url16": "", + "url17": "", + "url18": "", + "url19": "", + "url2": "", + "url20": "", + "url21": "", + "url22": "", + "url23": "", + "url24": "", + "url25": "", + "url26": "", + "url27": "", + "url28": "", + "url29": "", + "url3": "", + "url30": "", + "url31": "", + "url32": "", + "url33": "", + "url34": "", + "url35": "", + "url36": "", + "url37": "", + "url38": "", + "url39": "", + "url4": "", + "url40": "", + "url41": "", + "url42": "", + "url43": "", + "url44": "", + "url45": "", + "url46": "", + "url47": "", + "url48": "", + "url49": "", + "url5": "", + "url50": "", + "url51": "", + "url52": "", + "url53": "", + "url54": "", + "url55": "", + "url56": "", + "url57": "", + "url58": "", + "url59": "", + "url6": "", + "url60": "", + "url61": "", + "url62": "", + "url63": "", + "url64": "", + "url65": "", + "url66": "", + "url67": "", + "url68": "", + "url69": "", + "url7": "", + "url70": "", + "url71": "", + "url72": "", + "url73": "", + "url74": "", + "url75": "", + "url76": "", + "url77": "", + "url78": "", + "url79": "", + "url8": "", + "url80": "", + "url81": "", + "url82": "", + "url83": "", + "url84": "", + "url85": "", + "url86": "", + "url87": "", + "url88": "", + "url89": "", + "url9": "", + "url90": "", + "url91": "", + "url92": "", + "url93": "", + "url94": "", + "url95": "", + "url96": "", + "url97": "", + "url98": "", + "url99": "", + "urls": "{ [ \"https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists\" ] }" +} \ No newline at end of file diff --git a/tests/resources/expected_json/music/inspect_variables.json b/tests/resources/expected_json/music/inspect_variables.json new file mode 100644 index 00000000..131629d8 --- /dev/null +++ b/tests/resources/expected_json/music/inspect_variables.json @@ -0,0 +1,482 @@ +{ + "album_cover_path": "Lester Young/{ %concat( \"[\", %string( playlist_max_upload_year ), \"] \", %string( %sanitize( playlist_title ) ) ) }/folder.{ thumbnail_ext }", + "album_cover_path_sanitized": "{ %sanitize( %concat( \"Lester Young\", \"/\", %string( %concat( \"[\", %string( playlist_max_upload_year ), \"] \", %string( %sanitize( playlist_title ) ) ) ), \"/folder.\", %string( thumbnail_ext ) ) ) }", + "album_dir": "[{ playlist_max_upload_year }] { %sanitize( playlist_title ) }", + "album_dir_sanitized": "{ %sanitize( %concat( \"[\", %string( playlist_max_upload_year ), \"] \", %string( %sanitize( playlist_title ) ) ) ) }", + "artist_dir": "Lester Young", + "artist_dir_sanitized": "Lester Young", + "avatar_uncropped_thumbnail_file_name": "", + "avatar_uncropped_thumbnail_file_name_sanitized": "", + "banner_uncropped_thumbnail_file_name": "", + "banner_uncropped_thumbnail_file_name_sanitized": "", + "channel": "{ %map_get_non_empty( entry_metadata, \"channel\", uploader ) }", + "channel_id": "{ %map_get_non_empty( entry_metadata, \"channel_id\", uploader_id ) }", + "channel_id_sanitized": "{ %sanitize( channel_id ) }", + "channel_sanitized": "{ %sanitize( channel ) }", + "chapters": "{ [ ] }", + "chapters_sanitized": "{ %sanitize( chapters ) }", + "comments": "{ [ ] }", + "comments_sanitized": "{ %sanitize( comments ) }", + "creator": "{ %map_get_non_empty( entry_metadata, \"creator\", channel ) }", + "creator_sanitized": "{ %sanitize( creator ) }", + "description": "{ %map_get_non_empty( entry_metadata, \"description\", '' ) }", + "description_sanitized": "{ %sanitize( description ) }", + "download_index": "{ %int( 1 ) }", + "download_index_padded6": "{ %pad_zero( download_index, 6 ) }", + "download_index_padded6_sanitized": "{ %sanitize( download_index_padded6 ) }", + "download_index_sanitized": "{ %sanitize( download_index ) }", + "duration": "{ %map_get_non_empty( entry_metadata, \"duration\", 0 ) }", + "duration_sanitized": "{ %sanitize( duration ) }", + "enable_resolution_assert": "{ %bool(True) }", + "enable_resolution_assert_sanitized": "true", + "enable_throttle_protection": "{ %bool(True) }", + "enable_throttle_protection_sanitized": "true", + "entry_metadata": "{ { } }", + "entry_metadata_sanitized": "{ %sanitize( entry_metadata ) }", + "epoch": "{ %map_get( entry_metadata, \"epoch\" ) }", + "epoch_date": "{ %datetime_strftime( epoch, \"%Y%m%d\" ) }", + "epoch_date_sanitized": "{ %sanitize( epoch_date ) }", + "epoch_hour": "{ %datetime_strftime( epoch, \"%H\" ) }", + "epoch_hour_sanitized": "{ %sanitize( epoch_hour ) }", + "epoch_sanitized": "{ %sanitize( epoch ) }", + "ext": "{ %throw( \"Plugin variable ext has not been created yet\" ) }", + "ext_sanitized": "{ %sanitize( ext ) }", + "extractor": "{ %map_get( entry_metadata, \"extractor\" ) }", + "extractor_key": "{ %map_get( entry_metadata, \"extractor_key\" ) }", + "extractor_key_sanitized": "{ %sanitize( extractor_key ) }", + "extractor_sanitized": "{ %sanitize( extractor ) }", + "height": "{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "height_sanitized": "{ %sanitize( height ) }", + "ie_key": "{ %map_get_non_empty( entry_metadata, \"ie_key\", extractor_key ) }", + "ie_key_sanitized": "{ %sanitize( ie_key ) }", + "include_sibling_metadata": "{ %bool(True) }", + "include_sibling_metadata_sanitized": "true", + "info_json_ext": "info.json", + "info_json_ext_sanitized": "info.json", + "modified_webpage_url": "{ webpage_url }", + "modified_webpage_url_sanitized": "{ %sanitize( webpage_url ) }", + "music_directory": "tv_show_directory_path", + "music_directory_sanitized": "tv_show_directory_path", + "playlist_count": "{ %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) }", + "playlist_count_sanitized": "{ %sanitize( playlist_count ) }", + "playlist_description": "{ %map_get_non_empty( playlist_metadata, \"description\", description ) }", + "playlist_description_sanitized": "{ %sanitize( playlist_description ) }", + "playlist_index": "{ %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) }", + "playlist_index_padded": "{ %pad_zero( playlist_index, 2 ) }", + "playlist_index_padded6": "{ %pad_zero( playlist_index, 6 ) }", + "playlist_index_padded6_sanitized": "{ %sanitize( playlist_index_padded6 ) }", + "playlist_index_padded_sanitized": "{ %sanitize( playlist_index_padded ) }", + "playlist_index_reversed": "{ %sub( playlist_count, playlist_index, -1 ) }", + "playlist_index_reversed_padded": "{ %pad_zero( playlist_index_reversed, 2 ) }", + "playlist_index_reversed_padded6": "{ %pad_zero( playlist_index_reversed, 6 ) }", + "playlist_index_reversed_padded6_sanitized": "{ %sanitize( playlist_index_reversed_padded6 ) }", + "playlist_index_reversed_padded_sanitized": "{ %sanitize( playlist_index_reversed_padded ) }", + "playlist_index_reversed_sanitized": "{ %sanitize( playlist_index_reversed ) }", + "playlist_index_sanitized": "{ %sanitize( playlist_index ) }", + "playlist_max_upload_date": "{ %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) }", + "playlist_max_upload_date_sanitized": "{ %sanitize( playlist_max_upload_date ) }", + "playlist_max_upload_year": "{ %int( %map_get( %to_date_metadata( playlist_max_upload_date ), \"year\" ) ) }", + "playlist_max_upload_year_sanitized": "{ %sanitize( playlist_max_upload_year ) }", + "playlist_max_upload_year_truncated": "{ %int( %map_get( %to_date_metadata( playlist_max_upload_date ), \"year_truncated\" ) ) }", + "playlist_max_upload_year_truncated_sanitized": "{ %sanitize( playlist_max_upload_year_truncated ) }", + "playlist_metadata": "{ %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ) }", + "playlist_metadata_sanitized": "{ %sanitize( playlist_metadata ) }", + "playlist_title": "{ %map_get_non_empty( entry_metadata, \"playlist_title\", title ) }", + "playlist_title_sanitized": "{ %sanitize( playlist_title ) }", + "playlist_uid": "{ %map_get_non_empty( playlist_metadata, \"playlist_id\", uid ) }", + "playlist_uid_sanitized": "{ %sanitize( playlist_uid ) }", + "playlist_uploader": "{ %map_get_non_empty( playlist_metadata, \"uploader\", uploader ) }", + "playlist_uploader_id": "{ %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", uploader_id ) }", + "playlist_uploader_id_sanitized": "{ %sanitize( playlist_uploader_id ) }", + "playlist_uploader_sanitized": "{ %sanitize( playlist_uploader ) }", + "playlist_uploader_url": "{ %map_get_non_empty( playlist_metadata, \"uploader_url\", webpage_url ) }", + "playlist_uploader_url_sanitized": "{ %sanitize( playlist_uploader_url ) }", + "playlist_webpage_url": "{ %map_get_non_empty( playlist_metadata, \"webpage_url\", webpage_url ) }", + "playlist_webpage_url_sanitized": "{ %sanitize( playlist_webpage_url ) }", + "release_date": "{ %map_get_non_empty( entry_metadata, \"release_date\", upload_date ) }", + "release_date_sanitized": "{ %sanitize( release_date ) }", + "release_date_standardized": "{ %string( %map_get( %to_date_metadata( release_date ), \"date_standardized\" ) ) }", + "release_date_standardized_sanitized": "{ %sanitize( release_date_standardized ) }", + "release_day": "{ %int( %map_get( %to_date_metadata( release_date ), \"day\" ) ) }", + "release_day_of_year": "{ %int( %map_get( %to_date_metadata( release_date ), \"day_of_year\" ) ) }", + "release_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_of_year_padded\" ) ) }", + "release_day_of_year_padded_sanitized": "{ %sanitize( release_day_of_year_padded ) }", + "release_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"day_of_year_reversed\" ) ) }", + "release_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_of_year_reversed_padded\" ) ) }", + "release_day_of_year_reversed_padded_sanitized": "{ %sanitize( release_day_of_year_reversed_padded ) }", + "release_day_of_year_reversed_sanitized": "{ %sanitize( release_day_of_year_reversed ) }", + "release_day_of_year_sanitized": "{ %sanitize( release_day_of_year ) }", + "release_day_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_padded\" ) ) }", + "release_day_padded_sanitized": "{ %sanitize( release_day_padded ) }", + "release_day_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"day_reversed\" ) ) }", + "release_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_reversed_padded\" ) ) }", + "release_day_reversed_padded_sanitized": "{ %sanitize( release_day_reversed_padded ) }", + "release_day_reversed_sanitized": "{ %sanitize( release_day_reversed ) }", + "release_day_sanitized": "{ %sanitize( release_day ) }", + "release_month": "{ %int( %map_get( %to_date_metadata( release_date ), \"month\" ) ) }", + "release_month_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"month_padded\" ) ) }", + "release_month_padded_sanitized": "{ %sanitize( release_month_padded ) }", + "release_month_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"month_reversed\" ) ) }", + "release_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"month_reversed_padded\" ) ) }", + "release_month_reversed_padded_sanitized": "{ %sanitize( release_month_reversed_padded ) }", + "release_month_reversed_sanitized": "{ %sanitize( release_month_reversed ) }", + "release_month_sanitized": "{ %sanitize( release_month ) }", + "release_year": "{ %int( %map_get( %to_date_metadata( release_date ), \"year\" ) ) }", + "release_year_sanitized": "{ %sanitize( release_year ) }", + "release_year_truncated": "{ %int( %map_get( %to_date_metadata( release_date ), \"year_truncated\" ) ) }", + "release_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"year_truncated_reversed\" ) ) }", + "release_year_truncated_reversed_sanitized": "{ %sanitize( release_year_truncated_reversed ) }", + "release_year_truncated_sanitized": "{ %sanitize( release_year_truncated ) }", + "requested_subtitles": "{ { } }", + "requested_subtitles_sanitized": "{ %sanitize( requested_subtitles ) }", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_height_gte_sanitized": "361", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_ignore_titles_sanitized": "[]", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( title, \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( title, resolution_assert_ignore_titles ) ) }", + "resolution_assert_is_ignored_sanitized": "{ %sanitize( %print_if_true( %concat( title, \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( title, resolution_assert_ignore_titles ) ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_assert_print_sanitized": "true", + "resolution_assert_sanitized": "{ %sanitize( %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) ) }", + "resolution_readable": "{ width }x{ height }", + "resolution_readable_sanitized": "{ %sanitize( %concat( %string( width ), \"x\", %string( height ) ) ) }", + "sibling_metadata": "{ %map_get_non_empty( entry_metadata, \"sibling_metadata\", [ ] ) }", + "sibling_metadata_sanitized": "{ %sanitize( sibling_metadata ) }", + "source_count": "{ %map_get_non_empty( playlist_metadata, \"playlist_count\", 1 ) }", + "source_count_sanitized": "{ %sanitize( source_count ) }", + "source_description": "{ %map_get_non_empty( source_metadata, \"description\", playlist_description ) }", + "source_description_sanitized": "{ %sanitize( source_description ) }", + "source_index": "{ %map_get_non_empty( playlist_metadata, \"playlist_index\", 1 ) }", + "source_index_padded": "{ %pad_zero( source_index, 2 ) }", + "source_index_padded_sanitized": "{ %sanitize( source_index_padded ) }", + "source_index_sanitized": "{ %sanitize( source_index ) }", + "source_metadata": "{ %map_get_non_empty( entry_metadata, \"source_metadata\", { } ) }", + "source_metadata_sanitized": "{ %sanitize( source_metadata ) }", + "source_title": "{ %map_get_non_empty( source_metadata, \"title\", playlist_title ) }", + "source_title_sanitized": "{ %sanitize( source_title ) }", + "source_uid": "{ %map_get_non_empty( source_metadata, \"id\", playlist_uid ) }", + "source_uid_sanitized": "{ %sanitize( source_uid ) }", + "source_uploader": "{ %map_get_non_empty( source_metadata, \"uploader\", playlist_uploader ) }", + "source_uploader_id": "{ %map_get_non_empty( source_metadata, \"uploader_id\", playlist_uploader_id ) }", + "source_uploader_id_sanitized": "{ %sanitize( source_uploader_id ) }", + "source_uploader_sanitized": "{ %sanitize( source_uploader ) }", + "source_uploader_url": "{ %map_get_non_empty( source_metadata, \"uploader_url\", source_webpage_url ) }", + "source_uploader_url_sanitized": "{ %sanitize( source_uploader_url ) }", + "source_webpage_url": "{ %map_get_non_empty( source_metadata, \"webpage_url\", playlist_webpage_url ) }", + "source_webpage_url_sanitized": "{ %sanitize( source_webpage_url ) }", + "sponsorblock_chapters": "{ [ ] }", + "sponsorblock_chapters_sanitized": "{ %sanitize( sponsorblock_chapters ) }", + "subscription_array": "{ [ \"https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists\" ] }", + "subscription_array_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8channel\u29f8UCsItMF6_fP754ihIsSRLk5A\u29f8playlists\uff02]", + "subscription_has_download_archive": "{ %bool(False) }", + "subscription_has_download_archive_sanitized": "false", + "subscription_indent_1": "Jazz", + "subscription_indent_1_sanitized": "Jazz", + "subscription_name": "Lester Young", + "subscription_name_sanitized": "Lester Young", + "subscription_value": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "subscription_value_1": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "subscription_value_1_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8channel\u29f8UCsItMF6_fP754ihIsSRLk5A\u29f8playlists", + "subscription_value_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8channel\u29f8UCsItMF6_fP754ihIsSRLk5A\u29f8playlists", + "thumbnail_ext": "jpg", + "thumbnail_ext_sanitized": "jpg", + "title": "{ %map_get_non_empty( entry_metadata, \"title\", uid ) }", + "title_sanitized": "{ %sanitize( title ) }", + "title_sanitized_plex": "{ %sanitize_plex_episode( title ) }", + "title_sanitized_plex_sanitized": "{ %sanitize( title_sanitized_plex ) }", + "track_album": "{ playlist_title }", + "track_album_artist": "Lester Young", + "track_album_artist_sanitized": "Lester Young", + "track_album_sanitized": "{ %sanitize( playlist_title ) }", + "track_artist": "Lester Young", + "track_artist_sanitized": "Lester Young", + "track_date": "{ upload_date_standardized }", + "track_date_sanitized": "{ %sanitize( upload_date_standardized ) }", + "track_file_name": "{ playlist_index_padded } - { %sanitize( title ) }.{ ext }", + "track_file_name_sanitized": "{ %sanitize( %concat( %string( playlist_index_padded ), \" - \", %string( %sanitize( title ) ), \".\", %string( ext ) ) ) }", + "track_full_path": "Lester Young/{ %concat( \"[\", %string( playlist_max_upload_year ), \"] \", %string( %sanitize( playlist_title ) ) ) }/{ %concat( %string( playlist_index_padded ), \" - \", %string( %sanitize( title ) ), \".\", %string( ext ) ) }", + "track_full_path_sanitized": "{ %sanitize( %concat( \"Lester Young\", \"/\", %string( %concat( \"[\", %string( playlist_max_upload_year ), \"] \", %string( %sanitize( playlist_title ) ) ) ), \"/\", %string( %concat( %string( playlist_index_padded ), \" - \", %string( %sanitize( title ) ), \".\", %string( ext ) ) ) ) ) }", + "track_genre": "Jazz", + "track_genre_default": "Unset", + "track_genre_default_sanitized": "Unset", + "track_genre_sanitized": "Jazz", + "track_number": "{ playlist_index }", + "track_number_padded": "{ playlist_index_padded }", + "track_number_padded_sanitized": "{ %sanitize( playlist_index_padded ) }", + "track_number_sanitized": "{ %sanitize( playlist_index ) }", + "track_original_date": "{ upload_date_standardized }", + "track_original_date_sanitized": "{ %sanitize( upload_date_standardized ) }", + "track_title": "{ title }", + "track_title_sanitized": "{ %sanitize( title ) }", + "track_total": "{ playlist_count }", + "track_total_sanitized": "{ %sanitize( playlist_count ) }", + "track_year": "{ playlist_max_upload_year }", + "track_year_sanitized": "{ %sanitize( playlist_max_upload_year ) }", + "uid": "{ %map_get( entry_metadata, \"id\" ) }", + "uid_sanitized": "{ %sanitize( uid ) }", + "uid_sanitized_plex": "{ %sanitize_plex_episode( uid ) }", + "uid_sanitized_plex_sanitized": "{ %sanitize( uid_sanitized_plex ) }", + "upload_date": "{ %map_get_non_empty( entry_metadata, \"upload_date\", epoch_date ) }", + "upload_date_index": "{ %int( 1 ) }", + "upload_date_index_padded": "{ %pad_zero( upload_date_index, 2 ) }", + "upload_date_index_padded_sanitized": "{ %sanitize( upload_date_index_padded ) }", + "upload_date_index_reversed": "{ %sub( 100, upload_date_index ) }", + "upload_date_index_reversed_padded": "{ %pad_zero( upload_date_index_reversed, 2 ) }", + "upload_date_index_reversed_padded_sanitized": "{ %sanitize( upload_date_index_reversed_padded ) }", + "upload_date_index_reversed_sanitized": "{ %sanitize( upload_date_index_reversed ) }", + "upload_date_index_sanitized": "{ %sanitize( upload_date_index ) }", + "upload_date_sanitized": "{ %sanitize( upload_date ) }", + "upload_date_standardized": "{ %string( %map_get( %to_date_metadata( upload_date ), \"date_standardized\" ) ) }", + "upload_date_standardized_sanitized": "{ %sanitize( upload_date_standardized ) }", + "upload_day": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day\" ) ) }", + "upload_day_of_year": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day_of_year\" ) ) }", + "upload_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_of_year_padded\" ) ) }", + "upload_day_of_year_padded_sanitized": "{ %sanitize( upload_day_of_year_padded ) }", + "upload_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day_of_year_reversed\" ) ) }", + "upload_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_of_year_reversed_padded\" ) ) }", + "upload_day_of_year_reversed_padded_sanitized": "{ %sanitize( upload_day_of_year_reversed_padded ) }", + "upload_day_of_year_reversed_sanitized": "{ %sanitize( upload_day_of_year_reversed ) }", + "upload_day_of_year_sanitized": "{ %sanitize( upload_day_of_year ) }", + "upload_day_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_padded\" ) ) }", + "upload_day_padded_sanitized": "{ %sanitize( upload_day_padded ) }", + "upload_day_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day_reversed\" ) ) }", + "upload_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_reversed_padded\" ) ) }", + "upload_day_reversed_padded_sanitized": "{ %sanitize( upload_day_reversed_padded ) }", + "upload_day_reversed_sanitized": "{ %sanitize( upload_day_reversed ) }", + "upload_day_sanitized": "{ %sanitize( upload_day ) }", + "upload_month": "{ %int( %map_get( %to_date_metadata( upload_date ), \"month\" ) ) }", + "upload_month_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"month_padded\" ) ) }", + "upload_month_padded_sanitized": "{ %sanitize( upload_month_padded ) }", + "upload_month_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"month_reversed\" ) ) }", + "upload_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"month_reversed_padded\" ) ) }", + "upload_month_reversed_padded_sanitized": "{ %sanitize( upload_month_reversed_padded ) }", + "upload_month_reversed_sanitized": "{ %sanitize( upload_month_reversed ) }", + "upload_month_sanitized": "{ %sanitize( upload_month ) }", + "upload_year": "{ %int( %map_get( %to_date_metadata( upload_date ), \"year\" ) ) }", + "upload_year_sanitized": "{ %sanitize( upload_year ) }", + "upload_year_truncated": "{ %int( %map_get( %to_date_metadata( upload_date ), \"year_truncated\" ) ) }", + "upload_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"year_truncated_reversed\" ) ) }", + "upload_year_truncated_reversed_sanitized": "{ %sanitize( upload_year_truncated_reversed ) }", + "upload_year_truncated_sanitized": "{ %sanitize( upload_year_truncated ) }", + "uploader": "{ %map_get_non_empty( entry_metadata, \"uploader\", uploader_id ) }", + "uploader_id": "{ %map_get_non_empty( entry_metadata, \"uploader_id\", uid ) }", + "uploader_id_sanitized": "{ %sanitize( uploader_id ) }", + "uploader_sanitized": "{ %sanitize( uploader ) }", + "uploader_url": "{ %map_get_non_empty( entry_metadata, \"uploader_url\", webpage_url ) }", + "uploader_url_sanitized": "{ %sanitize( uploader_url ) }", + "url": "https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists", + "url10": "", + "url100": "", + "url100_sanitized": "", + "url10_sanitized": "", + "url11": "", + "url11_sanitized": "", + "url12": "", + "url12_sanitized": "", + "url13": "", + "url13_sanitized": "", + "url14": "", + "url14_sanitized": "", + "url15": "", + "url15_sanitized": "", + "url16": "", + "url16_sanitized": "", + "url17": "", + "url17_sanitized": "", + "url18": "", + "url18_sanitized": "", + "url19": "", + "url19_sanitized": "", + "url2": "", + "url20": "", + "url20_sanitized": "", + "url21": "", + "url21_sanitized": "", + "url22": "", + "url22_sanitized": "", + "url23": "", + "url23_sanitized": "", + "url24": "", + "url24_sanitized": "", + "url25": "", + "url25_sanitized": "", + "url26": "", + "url26_sanitized": "", + "url27": "", + "url27_sanitized": "", + "url28": "", + "url28_sanitized": "", + "url29": "", + "url29_sanitized": "", + "url2_sanitized": "", + "url3": "", + "url30": "", + "url30_sanitized": "", + "url31": "", + "url31_sanitized": "", + "url32": "", + "url32_sanitized": "", + "url33": "", + "url33_sanitized": "", + "url34": "", + "url34_sanitized": "", + "url35": "", + "url35_sanitized": "", + "url36": "", + "url36_sanitized": "", + "url37": "", + "url37_sanitized": "", + "url38": "", + "url38_sanitized": "", + "url39": "", + "url39_sanitized": "", + "url3_sanitized": "", + "url4": "", + "url40": "", + "url40_sanitized": "", + "url41": "", + "url41_sanitized": "", + "url42": "", + "url42_sanitized": "", + "url43": "", + "url43_sanitized": "", + "url44": "", + "url44_sanitized": "", + "url45": "", + "url45_sanitized": "", + "url46": "", + "url46_sanitized": "", + "url47": "", + "url47_sanitized": "", + "url48": "", + "url48_sanitized": "", + "url49": "", + "url49_sanitized": "", + "url4_sanitized": "", + "url5": "", + "url50": "", + "url50_sanitized": "", + "url51": "", + "url51_sanitized": "", + "url52": "", + "url52_sanitized": "", + "url53": "", + "url53_sanitized": "", + "url54": "", + "url54_sanitized": "", + "url55": "", + "url55_sanitized": "", + "url56": "", + "url56_sanitized": "", + "url57": "", + "url57_sanitized": "", + "url58": "", + "url58_sanitized": "", + "url59": "", + "url59_sanitized": "", + "url5_sanitized": "", + "url6": "", + "url60": "", + "url60_sanitized": "", + "url61": "", + "url61_sanitized": "", + "url62": "", + "url62_sanitized": "", + "url63": "", + "url63_sanitized": "", + "url64": "", + "url64_sanitized": "", + "url65": "", + "url65_sanitized": "", + "url66": "", + "url66_sanitized": "", + "url67": "", + "url67_sanitized": "", + "url68": "", + "url68_sanitized": "", + "url69": "", + "url69_sanitized": "", + "url6_sanitized": "", + "url7": "", + "url70": "", + "url70_sanitized": "", + "url71": "", + "url71_sanitized": "", + "url72": "", + "url72_sanitized": "", + "url73": "", + "url73_sanitized": "", + "url74": "", + "url74_sanitized": "", + "url75": "", + "url75_sanitized": "", + "url76": "", + "url76_sanitized": "", + "url77": "", + "url77_sanitized": "", + "url78": "", + "url78_sanitized": "", + "url79": "", + "url79_sanitized": "", + "url7_sanitized": "", + "url8": "", + "url80": "", + "url80_sanitized": "", + "url81": "", + "url81_sanitized": "", + "url82": "", + "url82_sanitized": "", + "url83": "", + "url83_sanitized": "", + "url84": "", + "url84_sanitized": "", + "url85": "", + "url85_sanitized": "", + "url86": "", + "url86_sanitized": "", + "url87": "", + "url87_sanitized": "", + "url88": "", + "url88_sanitized": "", + "url89": "", + "url89_sanitized": "", + "url8_sanitized": "", + "url9": "", + "url90": "", + "url90_sanitized": "", + "url91": "", + "url91_sanitized": "", + "url92": "", + "url92_sanitized": "", + "url93": "", + "url93_sanitized": "", + "url94": "", + "url94_sanitized": "", + "url95": "", + "url95_sanitized": "", + "url96": "", + "url96_sanitized": "", + "url97": "", + "url97_sanitized": "", + "url98": "", + "url98_sanitized": "", + "url99": "", + "url99_sanitized": "", + "url9_sanitized": "", + "url_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8channel\u29f8UCsItMF6_fP754ihIsSRLk5A\u29f8playlists", + "urls": "{ [ \"https://www.youtube.com/channel/UCsItMF6_fP754ihIsSRLk5A/playlists\" ] }", + "urls_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8channel\u29f8UCsItMF6_fP754ihIsSRLk5A\u29f8playlists\uff02]", + "webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "webpage_url_sanitized": "{ %sanitize( webpage_url ) }", + "width": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }", + "width_sanitized": "{ %sanitize( width ) }", + "ytdl_sub_entry_date_eval": "{ %string( upload_date_standardized ) }", + "ytdl_sub_entry_date_eval_sanitized": "{ %sanitize( ytdl_sub_entry_date_eval ) }", + "ytdl_sub_input_url": "{ %string( '' ) }", + "ytdl_sub_input_url_count": "{ %int( 0 ) }", + "ytdl_sub_input_url_count_sanitized": "{ %sanitize( ytdl_sub_input_url_count ) }", + "ytdl_sub_input_url_index": "{ %int( -1 ) }", + "ytdl_sub_input_url_index_sanitized": "{ %sanitize( ytdl_sub_input_url_index ) }", + "ytdl_sub_input_url_sanitized": "{ %sanitize( ytdl_sub_input_url ) }" +} \ No newline at end of file diff --git a/tests/resources/expected_json/music_video/inspect_full_overrides.json b/tests/resources/expected_json/music_video/inspect_full_overrides.json new file mode 100644 index 00000000..0ad15d9a --- /dev/null +++ b/tests/resources/expected_json/music_video/inspect_full_overrides.json @@ -0,0 +1,136 @@ +{ + "avatar_uncropped_thumbnail_file_name": "", + "banner_uncropped_thumbnail_file_name": "", + "category_url_array": "{ [ ] }", + "category_url_map": "{ [ ] }", + "enable_bilateral_scraping": "{ %bool(True) }", + "enable_resolution_assert": "{ %bool(True) }", + "enable_throttle_protection": "{ %bool(True) }", + "file_title": "{ %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "file_uid": "{ %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) }", + "include_sibling_metadata": "{ %bool(False) }", + "modified_webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "music_video_album": "{ %get_url_field( \"category\", music_video_album_default ) }", + "music_video_album_default": "Music Videos", + "music_video_artist": "Rick Astley", + "music_video_date": "{ %elif( %contains_url_field( \"date\" ), %get_url_field( \"date\", upload_date_standardized ), %contains_url_field( \"year\" ), %concat( %get_url_field( \"date\", upload_year ), \"-01-01\" ), upload_date_standardized ) }", + "music_video_directory": "tv_show_directory_path", + "music_video_file_name": "Rick Astley/{ %sanitize( %get_url_field( \"title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "music_video_file_name_suffix": "", + "music_video_genre": "Pop", + "music_video_genre_default": "ytdl-sub", + "music_video_title": "{ %get_url_field( \"title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "music_video_year": "{ %int( %elif( %contains_url_field( \"date\" ), %slice( %get_url_field( \"date\", upload_date_standardized ), 0, 4 ), %contains_url_field( \"year\" ), %get_url_field( \"date\", upload_year ), upload_year ) ) }", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), resolution_assert_ignore_titles ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_readable": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }x{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "subscription_array": "{ [ \"https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\" ] }", + "subscription_indent_1": "Pop", + "subscription_map": "{ { } }", + "subscription_value": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "subscription_value_1": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "url": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "url10": "", + "url100": "", + "url11": "", + "url12": "", + "url13": "", + "url14": "", + "url15": "", + "url16": "", + "url17": "", + "url18": "", + "url19": "", + "url2": "", + "url20": "", + "url21": "", + "url22": "", + "url23": "", + "url24": "", + "url25": "", + "url26": "", + "url27": "", + "url28": "", + "url29": "", + "url3": "", + "url30": "", + "url31": "", + "url32": "", + "url33": "", + "url34": "", + "url35": "", + "url36": "", + "url37": "", + "url38": "", + "url39": "", + "url4": "", + "url40": "", + "url41": "", + "url42": "", + "url43": "", + "url44": "", + "url45": "", + "url46": "", + "url47": "", + "url48": "", + "url49": "", + "url5": "", + "url50": "", + "url51": "", + "url52": "", + "url53": "", + "url54": "", + "url55": "", + "url56": "", + "url57": "", + "url58": "", + "url59": "", + "url6": "", + "url60": "", + "url61": "", + "url62": "", + "url63": "", + "url64": "", + "url65": "", + "url66": "", + "url67": "", + "url68": "", + "url69": "", + "url7": "", + "url70": "", + "url71": "", + "url72": "", + "url73": "", + "url74": "", + "url75": "", + "url76": "", + "url77": "", + "url78": "", + "url79": "", + "url8": "", + "url80": "", + "url81": "", + "url82": "", + "url83": "", + "url84": "", + "url85": "", + "url86": "", + "url87": "", + "url88": "", + "url89": "", + "url9": "", + "url90": "", + "url91": "", + "url92": "", + "url93": "", + "url94": "", + "url95": "", + "url96": "", + "url97": "", + "url98": "", + "url99": "", + "urls": "{ [ \"https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\", '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '' ] }" +} \ No newline at end of file diff --git a/tests/resources/expected_json/music_video/inspect_full_variables.json b/tests/resources/expected_json/music_video/inspect_full_variables.json new file mode 100644 index 00000000..fa8b5c85 --- /dev/null +++ b/tests/resources/expected_json/music_video/inspect_full_variables.json @@ -0,0 +1,480 @@ +{ + "avatar_uncropped_thumbnail_file_name": "", + "avatar_uncropped_thumbnail_file_name_sanitized": "", + "banner_uncropped_thumbnail_file_name": "", + "banner_uncropped_thumbnail_file_name_sanitized": "", + "category_url_array": "{ [ ] }", + "category_url_array_sanitized": "[]", + "category_url_map": "{ [ ] }", + "category_url_map_sanitized": "[]", + "channel": "{ %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "channel_id": "{ %map_get_non_empty( entry_metadata, \"channel_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "channel_id_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"channel_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "channel_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "chapters": "{ [ ] }", + "chapters_sanitized": "[]", + "comments": "{ [ ] }", + "comments_sanitized": "[]", + "creator": "{ %map_get_non_empty( entry_metadata, \"creator\", %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "creator_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"creator\", %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }", + "description": "{ %map_get_non_empty( entry_metadata, \"description\", '' ) }", + "description_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"description\", '' ) ) }", + "download_index": "{ %int(1) }", + "download_index_padded6": "000001", + "download_index_padded6_sanitized": "000001", + "download_index_sanitized": "1", + "duration": "{ %map_get_non_empty( entry_metadata, \"duration\", 0 ) }", + "duration_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"duration\", 0 ) ) }", + "enable_bilateral_scraping": "{ %bool(True) }", + "enable_bilateral_scraping_sanitized": "true", + "enable_resolution_assert": "{ %bool(True) }", + "enable_resolution_assert_sanitized": "true", + "enable_throttle_protection": "{ %bool(True) }", + "enable_throttle_protection_sanitized": "true", + "entry_metadata": "{ { } }", + "entry_metadata_sanitized": "{ %sanitize( entry_metadata ) }", + "epoch": "{ %map_get( entry_metadata, \"epoch\" ) }", + "epoch_date": "{ %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) }", + "epoch_date_sanitized": "{ %sanitize( %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) }", + "epoch_hour": "{ %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%H\" ) }", + "epoch_hour_sanitized": "{ %sanitize( %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%H\" ) ) }", + "epoch_sanitized": "{ %sanitize( %map_get( entry_metadata, \"epoch\" ) ) }", + "ext": "{ %map_get( entry_metadata, \"ext\" ) }", + "ext_sanitized": "{ %sanitize( %map_get( entry_metadata, \"ext\" ) ) }", + "extractor": "{ %map_get( entry_metadata, \"extractor\" ) }", + "extractor_key": "{ %map_get( entry_metadata, \"extractor_key\" ) }", + "extractor_key_sanitized": "{ %sanitize( %map_get( entry_metadata, \"extractor_key\" ) ) }", + "extractor_sanitized": "{ %sanitize( %map_get( entry_metadata, \"extractor\" ) ) }", + "file_title": "{ %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "file_title_sanitized": "{ %sanitize( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "file_uid": "{ %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) }", + "file_uid_sanitized": "{ %sanitize( %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) ) }", + "height": "{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "height_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"height\", 0 ) ) }", + "ie_key": "{ %map_get_non_empty( entry_metadata, \"ie_key\", %map_get( entry_metadata, \"extractor_key\" ) ) }", + "ie_key_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"ie_key\", %map_get( entry_metadata, \"extractor_key\" ) ) ) }", + "include_sibling_metadata": "{ %bool(False) }", + "include_sibling_metadata_sanitized": "false", + "info_json_ext": "info.json", + "info_json_ext_sanitized": "info.json", + "modified_webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "modified_webpage_url_sanitized": "{ %sanitize( %map_get( entry_metadata, \"webpage_url\" ) ) }", + "music_video_album": "{ %get_url_field( \"category\", music_video_album_default ) }", + "music_video_album_default": "Music Videos", + "music_video_album_default_sanitized": "Music Videos", + "music_video_album_sanitized": "{ %sanitize( %get_url_field( \"category\", music_video_album_default ) ) }", + "music_video_artist": "Rick Astley", + "music_video_artist_sanitized": "Rick Astley", + "music_video_date": "{ %elif( %contains_url_field( \"date\" ), %get_url_field( \"date\", upload_date_standardized ), %contains_url_field( \"year\" ), %concat( %get_url_field( \"date\", upload_year ), \"-01-01\" ), upload_date_standardized ) }", + "music_video_date_sanitized": "{ %sanitize( %elif( %contains_url_field( \"date\" ), %get_url_field( \"date\", upload_date_standardized ), %contains_url_field( \"year\" ), %concat( %get_url_field( \"date\", upload_year ), \"-01-01\" ), upload_date_standardized ) ) }", + "music_video_directory": "tv_show_directory_path", + "music_video_directory_sanitized": "tv_show_directory_path", + "music_video_file_name": "Rick Astley/{ %sanitize( %get_url_field( \"title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "music_video_file_name_sanitized": "{ %sanitize( %concat( \"Rick Astley\", \"/\", %string( %sanitize( %get_url_field( \"title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ), '' ) ) }", + "music_video_file_name_suffix": "", + "music_video_file_name_suffix_sanitized": "", + "music_video_genre": "Pop", + "music_video_genre_default": "ytdl-sub", + "music_video_genre_default_sanitized": "ytdl-sub", + "music_video_genre_sanitized": "Pop", + "music_video_title": "{ %get_url_field( \"title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "music_video_title_sanitized": "{ %sanitize( %get_url_field( \"title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "music_video_year": "{ %int( %elif( %contains_url_field( \"date\" ), %slice( %get_url_field( \"date\", upload_date_standardized ), 0, 4 ), %contains_url_field( \"year\" ), %get_url_field( \"date\", upload_year ), upload_year ) ) }", + "music_video_year_sanitized": "{ %sanitize( %int( %elif( %contains_url_field( \"date\" ), %slice( %get_url_field( \"date\", upload_date_standardized ), 0, 4 ), %contains_url_field( \"year\" ), %get_url_field( \"date\", upload_year ), upload_year ) ) ) }", + "playlist_count": "{ %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) }", + "playlist_count_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) ) }", + "playlist_description": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) }", + "playlist_description_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) ) }", + "playlist_index": "{ %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) }", + "playlist_index_padded": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) }", + "playlist_index_padded6": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 6 ) }", + "playlist_index_padded6_sanitized": "{ %sanitize( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 6 ) ) }", + "playlist_index_padded_sanitized": "{ %sanitize( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) ) }", + "playlist_index_reversed": "{ %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ) }", + "playlist_index_reversed_padded": "{ %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 2 ) }", + "playlist_index_reversed_padded6": "{ %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 6 ) }", + "playlist_index_reversed_padded6_sanitized": "{ %sanitize( %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 6 ) ) }", + "playlist_index_reversed_padded_sanitized": "{ %sanitize( %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 2 ) ) }", + "playlist_index_reversed_sanitized": "{ %sanitize( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ) ) }", + "playlist_index_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) ) }", + "playlist_max_upload_date": "{ %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) }", + "playlist_max_upload_date_sanitized": "{ %sanitize( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ) }", + "playlist_max_upload_year": "{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }", + "playlist_max_upload_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ) }", + "playlist_max_upload_year_truncated": "{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year_truncated\" ) ) }", + "playlist_max_upload_year_truncated_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year_truncated\" ) ) ) }", + "playlist_metadata": "{ %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ) }", + "playlist_metadata_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ) ) }", + "playlist_title": "{ %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "playlist_title_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "playlist_uid": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) }", + "playlist_uid_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "playlist_uploader": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "playlist_uploader_id": "{ %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "playlist_uploader_id_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "playlist_uploader_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "playlist_uploader_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) }", + "playlist_uploader_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "playlist_webpage_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) }", + "playlist_webpage_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "release_date": "{ %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) }", + "release_date_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ) }", + "release_date_standardized": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"date_standardized\" ) ) }", + "release_date_standardized_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"date_standardized\" ) ) ) }", + "release_day": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day\" ) ) }", + "release_day_of_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year\" ) ) }", + "release_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_padded\" ) ) }", + "release_day_of_year_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_padded\" ) ) ) }", + "release_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed\" ) ) }", + "release_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed_padded\" ) ) }", + "release_day_of_year_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed_padded\" ) ) ) }", + "release_day_of_year_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed\" ) ) ) }", + "release_day_of_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year\" ) ) ) }", + "release_day_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_padded\" ) ) }", + "release_day_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_padded\" ) ) ) }", + "release_day_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed\" ) ) }", + "release_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed_padded\" ) ) }", + "release_day_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed_padded\" ) ) ) }", + "release_day_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed\" ) ) ) }", + "release_day_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day\" ) ) ) }", + "release_month": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month\" ) ) }", + "release_month_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_padded\" ) ) }", + "release_month_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_padded\" ) ) ) }", + "release_month_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed\" ) ) }", + "release_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed_padded\" ) ) }", + "release_month_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed_padded\" ) ) ) }", + "release_month_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed\" ) ) ) }", + "release_month_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month\" ) ) ) }", + "release_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year\" ) ) }", + "release_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year\" ) ) ) }", + "release_year_truncated": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated\" ) ) }", + "release_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated_reversed\" ) ) }", + "release_year_truncated_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated_reversed\" ) ) ) }", + "release_year_truncated_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated\" ) ) ) }", + "requested_subtitles": "{ { } }", + "requested_subtitles_sanitized": "{}", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_height_gte_sanitized": "361", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_ignore_titles_sanitized": "[]", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), resolution_assert_ignore_titles ) ) }", + "resolution_assert_is_ignored_sanitized": "{ %sanitize( %print_if_true( %concat( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), resolution_assert_ignore_titles ) ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_assert_print_sanitized": "true", + "resolution_assert_sanitized": "{ %sanitize( %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) ) }", + "resolution_readable": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }x{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "resolution_readable_sanitized": "{ %sanitize( %concat( %string( %map_get_non_empty( entry_metadata, \"width\", 0 ) ), \"x\", %string( %map_get_non_empty( entry_metadata, \"height\", 0 ) ) ) ) }", + "sibling_metadata": "{ %map_get_non_empty( entry_metadata, \"sibling_metadata\", [ ] ) }", + "sibling_metadata_sanitized": "{ %sanitize( sibling_metadata ) }", + "source_count": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_count\", 1 ) }", + "source_count_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_count\", 1 ) ) }", + "source_description": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"description\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) ) }", + "source_description_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"description\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) ) ) }", + "source_index": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ) }", + "source_index_padded": "{ %pad_zero( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ), 2 ) }", + "source_index_padded_sanitized": "{ %sanitize( %pad_zero( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ), 2 ) ) }", + "source_index_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ) ) }", + "source_metadata": "{ %map_get_non_empty( entry_metadata, \"source_metadata\", { } ) }", + "source_metadata_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ) ) }", + "source_title": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"title\", %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "source_title_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"title\", %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "source_uid": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"id\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "source_uid_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"id\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "source_uploader": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "source_uploader_id": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_id\", %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "source_uploader_id_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_id\", %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "source_uploader_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }", + "source_uploader_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) ) }", + "source_uploader_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) ) ) }", + "source_webpage_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "source_webpage_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) ) }", + "sponsorblock_chapters": "{ [ ] }", + "sponsorblock_chapters_sanitized": "[]", + "subscription_array": "{ [ \"https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\" ] }", + "subscription_array_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8playlist\uff1flist=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\uff02]", + "subscription_has_download_archive": "{ %bool(False) }", + "subscription_has_download_archive_sanitized": "false", + "subscription_indent_1": "Pop", + "subscription_indent_1_sanitized": "Pop", + "subscription_map": "{ { } }", + "subscription_map_sanitized": "{}", + "subscription_name": "Rick Astley", + "subscription_name_sanitized": "Rick Astley", + "subscription_value": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "subscription_value_1": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "subscription_value_1_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8playlist\uff1flist=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "subscription_value_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8playlist\uff1flist=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "thumbnail_ext": "jpg", + "thumbnail_ext_sanitized": "jpg", + "title": "{ %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) }", + "title_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "title_sanitized_plex": "{ %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "title_sanitized_plex_sanitized": "{ %sanitize( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "uid": "{ %map_get( entry_metadata, \"id\" ) }", + "uid_sanitized": "{ %sanitize( %map_get( entry_metadata, \"id\" ) ) }", + "uid_sanitized_plex": "{ %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) }", + "uid_sanitized_plex_sanitized": "{ %sanitize( %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) ) }", + "upload_date": "{ %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) }", + "upload_date_index": "{ %int(1) }", + "upload_date_index_padded": "01", + "upload_date_index_padded_sanitized": "01", + "upload_date_index_reversed": "{ %int(99) }", + "upload_date_index_reversed_padded": "99", + "upload_date_index_reversed_padded_sanitized": "99", + "upload_date_index_reversed_sanitized": "99", + "upload_date_index_sanitized": "1", + "upload_date_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) }", + "upload_date_standardized": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }", + "upload_date_standardized_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) }", + "upload_day": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day\" ) ) }", + "upload_day_of_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year\" ) ) }", + "upload_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_padded\" ) ) }", + "upload_day_of_year_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_padded\" ) ) ) }", + "upload_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed\" ) ) }", + "upload_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed_padded\" ) ) }", + "upload_day_of_year_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed_padded\" ) ) ) }", + "upload_day_of_year_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed\" ) ) ) }", + "upload_day_of_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year\" ) ) ) }", + "upload_day_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ) }", + "upload_day_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ) ) }", + "upload_day_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed\" ) ) }", + "upload_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed_padded\" ) ) }", + "upload_day_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed_padded\" ) ) ) }", + "upload_day_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed\" ) ) ) }", + "upload_day_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day\" ) ) ) }", + "upload_month": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ) }", + "upload_month_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_padded\" ) ) }", + "upload_month_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_padded\" ) ) ) }", + "upload_month_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed\" ) ) }", + "upload_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed_padded\" ) ) }", + "upload_month_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed_padded\" ) ) ) }", + "upload_month_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed\" ) ) ) }", + "upload_month_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ) ) }", + "upload_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }", + "upload_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) }", + "upload_year_truncated": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated\" ) ) }", + "upload_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated_reversed\" ) ) }", + "upload_year_truncated_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated_reversed\" ) ) ) }", + "upload_year_truncated_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated\" ) ) ) }", + "uploader": "{ %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "uploader_id": "{ %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) }", + "uploader_id_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "uploader_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "uploader_url": "{ %map_get_non_empty( entry_metadata, \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) }", + "uploader_url_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "url": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "url10": "", + "url100": "", + "url100_sanitized": "", + "url10_sanitized": "", + "url11": "", + "url11_sanitized": "", + "url12": "", + "url12_sanitized": "", + "url13": "", + "url13_sanitized": "", + "url14": "", + "url14_sanitized": "", + "url15": "", + "url15_sanitized": "", + "url16": "", + "url16_sanitized": "", + "url17": "", + "url17_sanitized": "", + "url18": "", + "url18_sanitized": "", + "url19": "", + "url19_sanitized": "", + "url2": "", + "url20": "", + "url20_sanitized": "", + "url21": "", + "url21_sanitized": "", + "url22": "", + "url22_sanitized": "", + "url23": "", + "url23_sanitized": "", + "url24": "", + "url24_sanitized": "", + "url25": "", + "url25_sanitized": "", + "url26": "", + "url26_sanitized": "", + "url27": "", + "url27_sanitized": "", + "url28": "", + "url28_sanitized": "", + "url29": "", + "url29_sanitized": "", + "url2_sanitized": "", + "url3": "", + "url30": "", + "url30_sanitized": "", + "url31": "", + "url31_sanitized": "", + "url32": "", + "url32_sanitized": "", + "url33": "", + "url33_sanitized": "", + "url34": "", + "url34_sanitized": "", + "url35": "", + "url35_sanitized": "", + "url36": "", + "url36_sanitized": "", + "url37": "", + "url37_sanitized": "", + "url38": "", + "url38_sanitized": "", + "url39": "", + "url39_sanitized": "", + "url3_sanitized": "", + "url4": "", + "url40": "", + "url40_sanitized": "", + "url41": "", + "url41_sanitized": "", + "url42": "", + "url42_sanitized": "", + "url43": "", + "url43_sanitized": "", + "url44": "", + "url44_sanitized": "", + "url45": "", + "url45_sanitized": "", + "url46": "", + "url46_sanitized": "", + "url47": "", + "url47_sanitized": "", + "url48": "", + "url48_sanitized": "", + "url49": "", + "url49_sanitized": "", + "url4_sanitized": "", + "url5": "", + "url50": "", + "url50_sanitized": "", + "url51": "", + "url51_sanitized": "", + "url52": "", + "url52_sanitized": "", + "url53": "", + "url53_sanitized": "", + "url54": "", + "url54_sanitized": "", + "url55": "", + "url55_sanitized": "", + "url56": "", + "url56_sanitized": "", + "url57": "", + "url57_sanitized": "", + "url58": "", + "url58_sanitized": "", + "url59": "", + "url59_sanitized": "", + "url5_sanitized": "", + "url6": "", + "url60": "", + "url60_sanitized": "", + "url61": "", + "url61_sanitized": "", + "url62": "", + "url62_sanitized": "", + "url63": "", + "url63_sanitized": "", + "url64": "", + "url64_sanitized": "", + "url65": "", + "url65_sanitized": "", + "url66": "", + "url66_sanitized": "", + "url67": "", + "url67_sanitized": "", + "url68": "", + "url68_sanitized": "", + "url69": "", + "url69_sanitized": "", + "url6_sanitized": "", + "url7": "", + "url70": "", + "url70_sanitized": "", + "url71": "", + "url71_sanitized": "", + "url72": "", + "url72_sanitized": "", + "url73": "", + "url73_sanitized": "", + "url74": "", + "url74_sanitized": "", + "url75": "", + "url75_sanitized": "", + "url76": "", + "url76_sanitized": "", + "url77": "", + "url77_sanitized": "", + "url78": "", + "url78_sanitized": "", + "url79": "", + "url79_sanitized": "", + "url7_sanitized": "", + "url8": "", + "url80": "", + "url80_sanitized": "", + "url81": "", + "url81_sanitized": "", + "url82": "", + "url82_sanitized": "", + "url83": "", + "url83_sanitized": "", + "url84": "", + "url84_sanitized": "", + "url85": "", + "url85_sanitized": "", + "url86": "", + "url86_sanitized": "", + "url87": "", + "url87_sanitized": "", + "url88": "", + "url88_sanitized": "", + "url89": "", + "url89_sanitized": "", + "url8_sanitized": "", + "url9": "", + "url90": "", + "url90_sanitized": "", + "url91": "", + "url91_sanitized": "", + "url92": "", + "url92_sanitized": "", + "url93": "", + "url93_sanitized": "", + "url94": "", + "url94_sanitized": "", + "url95": "", + "url95_sanitized": "", + "url96": "", + "url96_sanitized": "", + "url97": "", + "url97_sanitized": "", + "url98": "", + "url98_sanitized": "", + "url99": "", + "url99_sanitized": "", + "url9_sanitized": "", + "url_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8playlist\uff1flist=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "urls": "{ [ \"https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\", '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '' ] }", + "urls_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8playlist\uff1flist=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02]", + "webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "webpage_url_sanitized": "{ %sanitize( %map_get( entry_metadata, \"webpage_url\" ) ) }", + "width": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }", + "width_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"width\", 0 ) ) }", + "ytdl_sub_entry_date_eval": "{ %string( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) }", + "ytdl_sub_entry_date_eval_sanitized": "{ %sanitize( %string( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) ) }", + "ytdl_sub_input_url": "", + "ytdl_sub_input_url_count": "{ %int(0) }", + "ytdl_sub_input_url_count_sanitized": "0", + "ytdl_sub_input_url_index": "{ %int(-1) }", + "ytdl_sub_input_url_index_sanitized": "-1", + "ytdl_sub_input_url_sanitized": "" +} \ No newline at end of file diff --git a/tests/resources/expected_json/music_video/inspect_overrides.json b/tests/resources/expected_json/music_video/inspect_overrides.json new file mode 100644 index 00000000..a0b3c3a1 --- /dev/null +++ b/tests/resources/expected_json/music_video/inspect_overrides.json @@ -0,0 +1,136 @@ +{ + "avatar_uncropped_thumbnail_file_name": "", + "banner_uncropped_thumbnail_file_name": "", + "category_url_array": "{ [ ] }", + "category_url_map": "{ [ ] }", + "enable_bilateral_scraping": "{ %bool(True) }", + "enable_resolution_assert": "{ %bool(True) }", + "enable_throttle_protection": "{ %bool(True) }", + "file_title": "{ title_sanitized_plex }", + "file_uid": "{ uid_sanitized_plex }", + "include_sibling_metadata": "{ %bool(False) }", + "modified_webpage_url": "{ webpage_url }", + "music_video_album": "{ %get_url_field( \"category\", music_video_album_default ) }", + "music_video_album_default": "Music Videos", + "music_video_artist": "Rick Astley", + "music_video_date": "{ %elif( %contains_url_field( \"date\" ), %get_url_field( \"date\", upload_date_standardized ), %contains_url_field( \"year\" ), %concat( %get_url_field( \"date\", upload_year ), \"-01-01\" ), upload_date_standardized ) }", + "music_video_directory": "tv_show_directory_path", + "music_video_file_name": "Rick Astley/{ %sanitize( %get_url_field( \"title\", title ) ) }", + "music_video_file_name_suffix": "", + "music_video_genre": "Pop", + "music_video_genre_default": "ytdl-sub", + "music_video_title": "{ %get_url_field( \"title\", title ) }", + "music_video_year": "{ %int( %elif( %contains_url_field( \"date\" ), %slice( %get_url_field( \"date\", upload_date_standardized ), 0, 4 ), %contains_url_field( \"year\" ), %get_url_field( \"date\", upload_year ), upload_year ) ) }", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( title, \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( title, resolution_assert_ignore_titles ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_readable": "{ width }x{ height }", + "subscription_array": "{ [ \"https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\" ] }", + "subscription_indent_1": "Pop", + "subscription_map": "{ { } }", + "subscription_value": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "subscription_value_1": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "url": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "url10": "", + "url100": "", + "url11": "", + "url12": "", + "url13": "", + "url14": "", + "url15": "", + "url16": "", + "url17": "", + "url18": "", + "url19": "", + "url2": "", + "url20": "", + "url21": "", + "url22": "", + "url23": "", + "url24": "", + "url25": "", + "url26": "", + "url27": "", + "url28": "", + "url29": "", + "url3": "", + "url30": "", + "url31": "", + "url32": "", + "url33": "", + "url34": "", + "url35": "", + "url36": "", + "url37": "", + "url38": "", + "url39": "", + "url4": "", + "url40": "", + "url41": "", + "url42": "", + "url43": "", + "url44": "", + "url45": "", + "url46": "", + "url47": "", + "url48": "", + "url49": "", + "url5": "", + "url50": "", + "url51": "", + "url52": "", + "url53": "", + "url54": "", + "url55": "", + "url56": "", + "url57": "", + "url58": "", + "url59": "", + "url6": "", + "url60": "", + "url61": "", + "url62": "", + "url63": "", + "url64": "", + "url65": "", + "url66": "", + "url67": "", + "url68": "", + "url69": "", + "url7": "", + "url70": "", + "url71": "", + "url72": "", + "url73": "", + "url74": "", + "url75": "", + "url76": "", + "url77": "", + "url78": "", + "url79": "", + "url8": "", + "url80": "", + "url81": "", + "url82": "", + "url83": "", + "url84": "", + "url85": "", + "url86": "", + "url87": "", + "url88": "", + "url89": "", + "url9": "", + "url90": "", + "url91": "", + "url92": "", + "url93": "", + "url94": "", + "url95": "", + "url96": "", + "url97": "", + "url98": "", + "url99": "", + "urls": "{ [ \"https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\", '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '' ] }" +} \ No newline at end of file diff --git a/tests/resources/expected_json/music_video/inspect_variables.json b/tests/resources/expected_json/music_video/inspect_variables.json new file mode 100644 index 00000000..318f2685 --- /dev/null +++ b/tests/resources/expected_json/music_video/inspect_variables.json @@ -0,0 +1,480 @@ +{ + "avatar_uncropped_thumbnail_file_name": "", + "avatar_uncropped_thumbnail_file_name_sanitized": "", + "banner_uncropped_thumbnail_file_name": "", + "banner_uncropped_thumbnail_file_name_sanitized": "", + "category_url_array": "{ [ ] }", + "category_url_array_sanitized": "[]", + "category_url_map": "{ [ ] }", + "category_url_map_sanitized": "[]", + "channel": "{ %map_get_non_empty( entry_metadata, \"channel\", uploader ) }", + "channel_id": "{ %map_get_non_empty( entry_metadata, \"channel_id\", uploader_id ) }", + "channel_id_sanitized": "{ %sanitize( channel_id ) }", + "channel_sanitized": "{ %sanitize( channel ) }", + "chapters": "{ [ ] }", + "chapters_sanitized": "{ %sanitize( chapters ) }", + "comments": "{ [ ] }", + "comments_sanitized": "{ %sanitize( comments ) }", + "creator": "{ %map_get_non_empty( entry_metadata, \"creator\", channel ) }", + "creator_sanitized": "{ %sanitize( creator ) }", + "description": "{ %map_get_non_empty( entry_metadata, \"description\", '' ) }", + "description_sanitized": "{ %sanitize( description ) }", + "download_index": "{ %int( 1 ) }", + "download_index_padded6": "{ %pad_zero( download_index, 6 ) }", + "download_index_padded6_sanitized": "{ %sanitize( download_index_padded6 ) }", + "download_index_sanitized": "{ %sanitize( download_index ) }", + "duration": "{ %map_get_non_empty( entry_metadata, \"duration\", 0 ) }", + "duration_sanitized": "{ %sanitize( duration ) }", + "enable_bilateral_scraping": "{ %bool(True) }", + "enable_bilateral_scraping_sanitized": "true", + "enable_resolution_assert": "{ %bool(True) }", + "enable_resolution_assert_sanitized": "true", + "enable_throttle_protection": "{ %bool(True) }", + "enable_throttle_protection_sanitized": "true", + "entry_metadata": "{ { } }", + "entry_metadata_sanitized": "{ %sanitize( entry_metadata ) }", + "epoch": "{ %map_get( entry_metadata, \"epoch\" ) }", + "epoch_date": "{ %datetime_strftime( epoch, \"%Y%m%d\" ) }", + "epoch_date_sanitized": "{ %sanitize( epoch_date ) }", + "epoch_hour": "{ %datetime_strftime( epoch, \"%H\" ) }", + "epoch_hour_sanitized": "{ %sanitize( epoch_hour ) }", + "epoch_sanitized": "{ %sanitize( epoch ) }", + "ext": "{ %map_get( entry_metadata, \"ext\" ) }", + "ext_sanitized": "{ %sanitize( ext ) }", + "extractor": "{ %map_get( entry_metadata, \"extractor\" ) }", + "extractor_key": "{ %map_get( entry_metadata, \"extractor_key\" ) }", + "extractor_key_sanitized": "{ %sanitize( extractor_key ) }", + "extractor_sanitized": "{ %sanitize( extractor ) }", + "file_title": "{ title_sanitized_plex }", + "file_title_sanitized": "{ %sanitize( title_sanitized_plex ) }", + "file_uid": "{ uid_sanitized_plex }", + "file_uid_sanitized": "{ %sanitize( uid_sanitized_plex ) }", + "height": "{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "height_sanitized": "{ %sanitize( height ) }", + "ie_key": "{ %map_get_non_empty( entry_metadata, \"ie_key\", extractor_key ) }", + "ie_key_sanitized": "{ %sanitize( ie_key ) }", + "include_sibling_metadata": "{ %bool(False) }", + "include_sibling_metadata_sanitized": "false", + "info_json_ext": "info.json", + "info_json_ext_sanitized": "info.json", + "modified_webpage_url": "{ webpage_url }", + "modified_webpage_url_sanitized": "{ %sanitize( webpage_url ) }", + "music_video_album": "{ %get_url_field( \"category\", music_video_album_default ) }", + "music_video_album_default": "Music Videos", + "music_video_album_default_sanitized": "Music Videos", + "music_video_album_sanitized": "{ %sanitize( %get_url_field( \"category\", music_video_album_default ) ) }", + "music_video_artist": "Rick Astley", + "music_video_artist_sanitized": "Rick Astley", + "music_video_date": "{ %elif( %contains_url_field( \"date\" ), %get_url_field( \"date\", upload_date_standardized ), %contains_url_field( \"year\" ), %concat( %get_url_field( \"date\", upload_year ), \"-01-01\" ), upload_date_standardized ) }", + "music_video_date_sanitized": "{ %sanitize( %elif( %contains_url_field( \"date\" ), %get_url_field( \"date\", upload_date_standardized ), %contains_url_field( \"year\" ), %concat( %get_url_field( \"date\", upload_year ), \"-01-01\" ), upload_date_standardized ) ) }", + "music_video_directory": "tv_show_directory_path", + "music_video_directory_sanitized": "tv_show_directory_path", + "music_video_file_name": "Rick Astley/{ %sanitize( %get_url_field( \"title\", title ) ) }", + "music_video_file_name_sanitized": "{ %sanitize( %concat( \"Rick Astley\", \"/\", %string( %sanitize( %get_url_field( \"title\", title ) ) ), '' ) ) }", + "music_video_file_name_suffix": "", + "music_video_file_name_suffix_sanitized": "", + "music_video_genre": "Pop", + "music_video_genre_default": "ytdl-sub", + "music_video_genre_default_sanitized": "ytdl-sub", + "music_video_genre_sanitized": "Pop", + "music_video_title": "{ %get_url_field( \"title\", title ) }", + "music_video_title_sanitized": "{ %sanitize( %get_url_field( \"title\", title ) ) }", + "music_video_year": "{ %int( %elif( %contains_url_field( \"date\" ), %slice( %get_url_field( \"date\", upload_date_standardized ), 0, 4 ), %contains_url_field( \"year\" ), %get_url_field( \"date\", upload_year ), upload_year ) ) }", + "music_video_year_sanitized": "{ %sanitize( %int( %elif( %contains_url_field( \"date\" ), %slice( %get_url_field( \"date\", upload_date_standardized ), 0, 4 ), %contains_url_field( \"year\" ), %get_url_field( \"date\", upload_year ), upload_year ) ) ) }", + "playlist_count": "{ %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) }", + "playlist_count_sanitized": "{ %sanitize( playlist_count ) }", + "playlist_description": "{ %map_get_non_empty( playlist_metadata, \"description\", description ) }", + "playlist_description_sanitized": "{ %sanitize( playlist_description ) }", + "playlist_index": "{ %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) }", + "playlist_index_padded": "{ %pad_zero( playlist_index, 2 ) }", + "playlist_index_padded6": "{ %pad_zero( playlist_index, 6 ) }", + "playlist_index_padded6_sanitized": "{ %sanitize( playlist_index_padded6 ) }", + "playlist_index_padded_sanitized": "{ %sanitize( playlist_index_padded ) }", + "playlist_index_reversed": "{ %sub( playlist_count, playlist_index, -1 ) }", + "playlist_index_reversed_padded": "{ %pad_zero( playlist_index_reversed, 2 ) }", + "playlist_index_reversed_padded6": "{ %pad_zero( playlist_index_reversed, 6 ) }", + "playlist_index_reversed_padded6_sanitized": "{ %sanitize( playlist_index_reversed_padded6 ) }", + "playlist_index_reversed_padded_sanitized": "{ %sanitize( playlist_index_reversed_padded ) }", + "playlist_index_reversed_sanitized": "{ %sanitize( playlist_index_reversed ) }", + "playlist_index_sanitized": "{ %sanitize( playlist_index ) }", + "playlist_max_upload_date": "{ %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) }", + "playlist_max_upload_date_sanitized": "{ %sanitize( playlist_max_upload_date ) }", + "playlist_max_upload_year": "{ %int( %map_get( %to_date_metadata( playlist_max_upload_date ), \"year\" ) ) }", + "playlist_max_upload_year_sanitized": "{ %sanitize( playlist_max_upload_year ) }", + "playlist_max_upload_year_truncated": "{ %int( %map_get( %to_date_metadata( playlist_max_upload_date ), \"year_truncated\" ) ) }", + "playlist_max_upload_year_truncated_sanitized": "{ %sanitize( playlist_max_upload_year_truncated ) }", + "playlist_metadata": "{ %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ) }", + "playlist_metadata_sanitized": "{ %sanitize( playlist_metadata ) }", + "playlist_title": "{ %map_get_non_empty( entry_metadata, \"playlist_title\", title ) }", + "playlist_title_sanitized": "{ %sanitize( playlist_title ) }", + "playlist_uid": "{ %map_get_non_empty( playlist_metadata, \"playlist_id\", uid ) }", + "playlist_uid_sanitized": "{ %sanitize( playlist_uid ) }", + "playlist_uploader": "{ %map_get_non_empty( playlist_metadata, \"uploader\", uploader ) }", + "playlist_uploader_id": "{ %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", uploader_id ) }", + "playlist_uploader_id_sanitized": "{ %sanitize( playlist_uploader_id ) }", + "playlist_uploader_sanitized": "{ %sanitize( playlist_uploader ) }", + "playlist_uploader_url": "{ %map_get_non_empty( playlist_metadata, \"uploader_url\", webpage_url ) }", + "playlist_uploader_url_sanitized": "{ %sanitize( playlist_uploader_url ) }", + "playlist_webpage_url": "{ %map_get_non_empty( playlist_metadata, \"webpage_url\", webpage_url ) }", + "playlist_webpage_url_sanitized": "{ %sanitize( playlist_webpage_url ) }", + "release_date": "{ %map_get_non_empty( entry_metadata, \"release_date\", upload_date ) }", + "release_date_sanitized": "{ %sanitize( release_date ) }", + "release_date_standardized": "{ %string( %map_get( %to_date_metadata( release_date ), \"date_standardized\" ) ) }", + "release_date_standardized_sanitized": "{ %sanitize( release_date_standardized ) }", + "release_day": "{ %int( %map_get( %to_date_metadata( release_date ), \"day\" ) ) }", + "release_day_of_year": "{ %int( %map_get( %to_date_metadata( release_date ), \"day_of_year\" ) ) }", + "release_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_of_year_padded\" ) ) }", + "release_day_of_year_padded_sanitized": "{ %sanitize( release_day_of_year_padded ) }", + "release_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"day_of_year_reversed\" ) ) }", + "release_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_of_year_reversed_padded\" ) ) }", + "release_day_of_year_reversed_padded_sanitized": "{ %sanitize( release_day_of_year_reversed_padded ) }", + "release_day_of_year_reversed_sanitized": "{ %sanitize( release_day_of_year_reversed ) }", + "release_day_of_year_sanitized": "{ %sanitize( release_day_of_year ) }", + "release_day_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_padded\" ) ) }", + "release_day_padded_sanitized": "{ %sanitize( release_day_padded ) }", + "release_day_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"day_reversed\" ) ) }", + "release_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_reversed_padded\" ) ) }", + "release_day_reversed_padded_sanitized": "{ %sanitize( release_day_reversed_padded ) }", + "release_day_reversed_sanitized": "{ %sanitize( release_day_reversed ) }", + "release_day_sanitized": "{ %sanitize( release_day ) }", + "release_month": "{ %int( %map_get( %to_date_metadata( release_date ), \"month\" ) ) }", + "release_month_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"month_padded\" ) ) }", + "release_month_padded_sanitized": "{ %sanitize( release_month_padded ) }", + "release_month_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"month_reversed\" ) ) }", + "release_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"month_reversed_padded\" ) ) }", + "release_month_reversed_padded_sanitized": "{ %sanitize( release_month_reversed_padded ) }", + "release_month_reversed_sanitized": "{ %sanitize( release_month_reversed ) }", + "release_month_sanitized": "{ %sanitize( release_month ) }", + "release_year": "{ %int( %map_get( %to_date_metadata( release_date ), \"year\" ) ) }", + "release_year_sanitized": "{ %sanitize( release_year ) }", + "release_year_truncated": "{ %int( %map_get( %to_date_metadata( release_date ), \"year_truncated\" ) ) }", + "release_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"year_truncated_reversed\" ) ) }", + "release_year_truncated_reversed_sanitized": "{ %sanitize( release_year_truncated_reversed ) }", + "release_year_truncated_sanitized": "{ %sanitize( release_year_truncated ) }", + "requested_subtitles": "{ { } }", + "requested_subtitles_sanitized": "{ %sanitize( requested_subtitles ) }", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_height_gte_sanitized": "361", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_ignore_titles_sanitized": "[]", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( title, \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( title, resolution_assert_ignore_titles ) ) }", + "resolution_assert_is_ignored_sanitized": "{ %sanitize( %print_if_true( %concat( title, \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( title, resolution_assert_ignore_titles ) ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_assert_print_sanitized": "true", + "resolution_assert_sanitized": "{ %sanitize( %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) ) }", + "resolution_readable": "{ width }x{ height }", + "resolution_readable_sanitized": "{ %sanitize( %concat( %string( width ), \"x\", %string( height ) ) ) }", + "sibling_metadata": "{ %map_get_non_empty( entry_metadata, \"sibling_metadata\", [ ] ) }", + "sibling_metadata_sanitized": "{ %sanitize( sibling_metadata ) }", + "source_count": "{ %map_get_non_empty( playlist_metadata, \"playlist_count\", 1 ) }", + "source_count_sanitized": "{ %sanitize( source_count ) }", + "source_description": "{ %map_get_non_empty( source_metadata, \"description\", playlist_description ) }", + "source_description_sanitized": "{ %sanitize( source_description ) }", + "source_index": "{ %map_get_non_empty( playlist_metadata, \"playlist_index\", 1 ) }", + "source_index_padded": "{ %pad_zero( source_index, 2 ) }", + "source_index_padded_sanitized": "{ %sanitize( source_index_padded ) }", + "source_index_sanitized": "{ %sanitize( source_index ) }", + "source_metadata": "{ %map_get_non_empty( entry_metadata, \"source_metadata\", { } ) }", + "source_metadata_sanitized": "{ %sanitize( source_metadata ) }", + "source_title": "{ %map_get_non_empty( source_metadata, \"title\", playlist_title ) }", + "source_title_sanitized": "{ %sanitize( source_title ) }", + "source_uid": "{ %map_get_non_empty( source_metadata, \"id\", playlist_uid ) }", + "source_uid_sanitized": "{ %sanitize( source_uid ) }", + "source_uploader": "{ %map_get_non_empty( source_metadata, \"uploader\", playlist_uploader ) }", + "source_uploader_id": "{ %map_get_non_empty( source_metadata, \"uploader_id\", playlist_uploader_id ) }", + "source_uploader_id_sanitized": "{ %sanitize( source_uploader_id ) }", + "source_uploader_sanitized": "{ %sanitize( source_uploader ) }", + "source_uploader_url": "{ %map_get_non_empty( source_metadata, \"uploader_url\", source_webpage_url ) }", + "source_uploader_url_sanitized": "{ %sanitize( source_uploader_url ) }", + "source_webpage_url": "{ %map_get_non_empty( source_metadata, \"webpage_url\", playlist_webpage_url ) }", + "source_webpage_url_sanitized": "{ %sanitize( source_webpage_url ) }", + "sponsorblock_chapters": "{ [ ] }", + "sponsorblock_chapters_sanitized": "{ %sanitize( sponsorblock_chapters ) }", + "subscription_array": "{ [ \"https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\" ] }", + "subscription_array_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8playlist\uff1flist=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\uff02]", + "subscription_has_download_archive": "{ %bool(False) }", + "subscription_has_download_archive_sanitized": "false", + "subscription_indent_1": "Pop", + "subscription_indent_1_sanitized": "Pop", + "subscription_map": "{ { } }", + "subscription_map_sanitized": "{}", + "subscription_name": "Rick Astley", + "subscription_name_sanitized": "Rick Astley", + "subscription_value": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "subscription_value_1": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "subscription_value_1_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8playlist\uff1flist=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "subscription_value_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8playlist\uff1flist=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "thumbnail_ext": "jpg", + "thumbnail_ext_sanitized": "jpg", + "title": "{ %map_get_non_empty( entry_metadata, \"title\", uid ) }", + "title_sanitized": "{ %sanitize( title ) }", + "title_sanitized_plex": "{ %sanitize_plex_episode( title ) }", + "title_sanitized_plex_sanitized": "{ %sanitize( title_sanitized_plex ) }", + "uid": "{ %map_get( entry_metadata, \"id\" ) }", + "uid_sanitized": "{ %sanitize( uid ) }", + "uid_sanitized_plex": "{ %sanitize_plex_episode( uid ) }", + "uid_sanitized_plex_sanitized": "{ %sanitize( uid_sanitized_plex ) }", + "upload_date": "{ %map_get_non_empty( entry_metadata, \"upload_date\", epoch_date ) }", + "upload_date_index": "{ %int( 1 ) }", + "upload_date_index_padded": "{ %pad_zero( upload_date_index, 2 ) }", + "upload_date_index_padded_sanitized": "{ %sanitize( upload_date_index_padded ) }", + "upload_date_index_reversed": "{ %sub( 100, upload_date_index ) }", + "upload_date_index_reversed_padded": "{ %pad_zero( upload_date_index_reversed, 2 ) }", + "upload_date_index_reversed_padded_sanitized": "{ %sanitize( upload_date_index_reversed_padded ) }", + "upload_date_index_reversed_sanitized": "{ %sanitize( upload_date_index_reversed ) }", + "upload_date_index_sanitized": "{ %sanitize( upload_date_index ) }", + "upload_date_sanitized": "{ %sanitize( upload_date ) }", + "upload_date_standardized": "{ %string( %map_get( %to_date_metadata( upload_date ), \"date_standardized\" ) ) }", + "upload_date_standardized_sanitized": "{ %sanitize( upload_date_standardized ) }", + "upload_day": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day\" ) ) }", + "upload_day_of_year": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day_of_year\" ) ) }", + "upload_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_of_year_padded\" ) ) }", + "upload_day_of_year_padded_sanitized": "{ %sanitize( upload_day_of_year_padded ) }", + "upload_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day_of_year_reversed\" ) ) }", + "upload_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_of_year_reversed_padded\" ) ) }", + "upload_day_of_year_reversed_padded_sanitized": "{ %sanitize( upload_day_of_year_reversed_padded ) }", + "upload_day_of_year_reversed_sanitized": "{ %sanitize( upload_day_of_year_reversed ) }", + "upload_day_of_year_sanitized": "{ %sanitize( upload_day_of_year ) }", + "upload_day_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_padded\" ) ) }", + "upload_day_padded_sanitized": "{ %sanitize( upload_day_padded ) }", + "upload_day_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day_reversed\" ) ) }", + "upload_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_reversed_padded\" ) ) }", + "upload_day_reversed_padded_sanitized": "{ %sanitize( upload_day_reversed_padded ) }", + "upload_day_reversed_sanitized": "{ %sanitize( upload_day_reversed ) }", + "upload_day_sanitized": "{ %sanitize( upload_day ) }", + "upload_month": "{ %int( %map_get( %to_date_metadata( upload_date ), \"month\" ) ) }", + "upload_month_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"month_padded\" ) ) }", + "upload_month_padded_sanitized": "{ %sanitize( upload_month_padded ) }", + "upload_month_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"month_reversed\" ) ) }", + "upload_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"month_reversed_padded\" ) ) }", + "upload_month_reversed_padded_sanitized": "{ %sanitize( upload_month_reversed_padded ) }", + "upload_month_reversed_sanitized": "{ %sanitize( upload_month_reversed ) }", + "upload_month_sanitized": "{ %sanitize( upload_month ) }", + "upload_year": "{ %int( %map_get( %to_date_metadata( upload_date ), \"year\" ) ) }", + "upload_year_sanitized": "{ %sanitize( upload_year ) }", + "upload_year_truncated": "{ %int( %map_get( %to_date_metadata( upload_date ), \"year_truncated\" ) ) }", + "upload_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"year_truncated_reversed\" ) ) }", + "upload_year_truncated_reversed_sanitized": "{ %sanitize( upload_year_truncated_reversed ) }", + "upload_year_truncated_sanitized": "{ %sanitize( upload_year_truncated ) }", + "uploader": "{ %map_get_non_empty( entry_metadata, \"uploader\", uploader_id ) }", + "uploader_id": "{ %map_get_non_empty( entry_metadata, \"uploader_id\", uid ) }", + "uploader_id_sanitized": "{ %sanitize( uploader_id ) }", + "uploader_sanitized": "{ %sanitize( uploader ) }", + "uploader_url": "{ %map_get_non_empty( entry_metadata, \"uploader_url\", webpage_url ) }", + "uploader_url_sanitized": "{ %sanitize( uploader_url ) }", + "url": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "url10": "", + "url100": "", + "url100_sanitized": "", + "url10_sanitized": "", + "url11": "", + "url11_sanitized": "", + "url12": "", + "url12_sanitized": "", + "url13": "", + "url13_sanitized": "", + "url14": "", + "url14_sanitized": "", + "url15": "", + "url15_sanitized": "", + "url16": "", + "url16_sanitized": "", + "url17": "", + "url17_sanitized": "", + "url18": "", + "url18_sanitized": "", + "url19": "", + "url19_sanitized": "", + "url2": "", + "url20": "", + "url20_sanitized": "", + "url21": "", + "url21_sanitized": "", + "url22": "", + "url22_sanitized": "", + "url23": "", + "url23_sanitized": "", + "url24": "", + "url24_sanitized": "", + "url25": "", + "url25_sanitized": "", + "url26": "", + "url26_sanitized": "", + "url27": "", + "url27_sanitized": "", + "url28": "", + "url28_sanitized": "", + "url29": "", + "url29_sanitized": "", + "url2_sanitized": "", + "url3": "", + "url30": "", + "url30_sanitized": "", + "url31": "", + "url31_sanitized": "", + "url32": "", + "url32_sanitized": "", + "url33": "", + "url33_sanitized": "", + "url34": "", + "url34_sanitized": "", + "url35": "", + "url35_sanitized": "", + "url36": "", + "url36_sanitized": "", + "url37": "", + "url37_sanitized": "", + "url38": "", + "url38_sanitized": "", + "url39": "", + "url39_sanitized": "", + "url3_sanitized": "", + "url4": "", + "url40": "", + "url40_sanitized": "", + "url41": "", + "url41_sanitized": "", + "url42": "", + "url42_sanitized": "", + "url43": "", + "url43_sanitized": "", + "url44": "", + "url44_sanitized": "", + "url45": "", + "url45_sanitized": "", + "url46": "", + "url46_sanitized": "", + "url47": "", + "url47_sanitized": "", + "url48": "", + "url48_sanitized": "", + "url49": "", + "url49_sanitized": "", + "url4_sanitized": "", + "url5": "", + "url50": "", + "url50_sanitized": "", + "url51": "", + "url51_sanitized": "", + "url52": "", + "url52_sanitized": "", + "url53": "", + "url53_sanitized": "", + "url54": "", + "url54_sanitized": "", + "url55": "", + "url55_sanitized": "", + "url56": "", + "url56_sanitized": "", + "url57": "", + "url57_sanitized": "", + "url58": "", + "url58_sanitized": "", + "url59": "", + "url59_sanitized": "", + "url5_sanitized": "", + "url6": "", + "url60": "", + "url60_sanitized": "", + "url61": "", + "url61_sanitized": "", + "url62": "", + "url62_sanitized": "", + "url63": "", + "url63_sanitized": "", + "url64": "", + "url64_sanitized": "", + "url65": "", + "url65_sanitized": "", + "url66": "", + "url66_sanitized": "", + "url67": "", + "url67_sanitized": "", + "url68": "", + "url68_sanitized": "", + "url69": "", + "url69_sanitized": "", + "url6_sanitized": "", + "url7": "", + "url70": "", + "url70_sanitized": "", + "url71": "", + "url71_sanitized": "", + "url72": "", + "url72_sanitized": "", + "url73": "", + "url73_sanitized": "", + "url74": "", + "url74_sanitized": "", + "url75": "", + "url75_sanitized": "", + "url76": "", + "url76_sanitized": "", + "url77": "", + "url77_sanitized": "", + "url78": "", + "url78_sanitized": "", + "url79": "", + "url79_sanitized": "", + "url7_sanitized": "", + "url8": "", + "url80": "", + "url80_sanitized": "", + "url81": "", + "url81_sanitized": "", + "url82": "", + "url82_sanitized": "", + "url83": "", + "url83_sanitized": "", + "url84": "", + "url84_sanitized": "", + "url85": "", + "url85_sanitized": "", + "url86": "", + "url86_sanitized": "", + "url87": "", + "url87_sanitized": "", + "url88": "", + "url88_sanitized": "", + "url89": "", + "url89_sanitized": "", + "url8_sanitized": "", + "url9": "", + "url90": "", + "url90_sanitized": "", + "url91": "", + "url91_sanitized": "", + "url92": "", + "url92_sanitized": "", + "url93": "", + "url93_sanitized": "", + "url94": "", + "url94_sanitized": "", + "url95": "", + "url95_sanitized": "", + "url96": "", + "url96_sanitized": "", + "url97": "", + "url97_sanitized": "", + "url98": "", + "url98_sanitized": "", + "url99": "", + "url99_sanitized": "", + "url9_sanitized": "", + "url_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8playlist\uff1flist=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc", + "urls": "{ [ \"https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\", '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '' ] }", + "urls_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8playlist\uff1flist=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02, \uff02\uff02]", + "webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "webpage_url_sanitized": "{ %sanitize( webpage_url ) }", + "width": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }", + "width_sanitized": "{ %sanitize( width ) }", + "ytdl_sub_entry_date_eval": "{ %string( upload_date_standardized ) }", + "ytdl_sub_entry_date_eval_sanitized": "{ %sanitize( ytdl_sub_entry_date_eval ) }", + "ytdl_sub_input_url": "{ %string( '' ) }", + "ytdl_sub_input_url_count": "{ %int( 0 ) }", + "ytdl_sub_input_url_count_sanitized": "{ %sanitize( ytdl_sub_input_url_count ) }", + "ytdl_sub_input_url_index": "{ %int( -1 ) }", + "ytdl_sub_input_url_index_sanitized": "{ %sanitize( ytdl_sub_input_url_index ) }", + "ytdl_sub_input_url_sanitized": "{ %sanitize( ytdl_sub_input_url ) }" +} \ No newline at end of file diff --git a/tests/resources/expected_json/tv_show/inspect_full_overrides.json b/tests/resources/expected_json/tv_show/inspect_full_overrides.json new file mode 100644 index 00000000..179d4e11 --- /dev/null +++ b/tests/resources/expected_json/tv_show/inspect_full_overrides.json @@ -0,0 +1,155 @@ +{ + "assert_not_collection": "{ %bool(True) }", + "avatar_uncropped_thumbnail_file_name": "poster.jpg", + "banner_uncropped_thumbnail_file_name": "fanart.jpg", + "enable_bilateral_scraping": "{ %bool(True) }", + "enable_resolution_assert": "{ %bool(True) }", + "enable_throttle_protection": "{ %bool(True) }", + "episode_content_rating": "TV-14", + "episode_date_standardized": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }", + "episode_file_name": "s{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }.e{ %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) } - { %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "episode_file_path": "{ %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) }/{ %sanitize( %concat( \"s\", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ), \".e\", %string( %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) ), \" - \", %string( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }", + "episode_number": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ) }{ %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) }{ upload_date_index_padded }", + "episode_number_and_padded_": "{ [ %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ), 6 ] }", + "episode_number_padded": "{ %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) }", + "episode_plot": "{ %map_get( entry_metadata, \"webpage_url\" ) }\n\n{ %map_get_non_empty( entry_metadata, \"description\", '' ) }", + "episode_title": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) } - { %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) }", + "episode_year": "{ %slice( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ), 0, 4 ) }", + "file_title": "{ %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "file_uid": "{ %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) }", + "include_sibling_metadata": "{ %bool(False) }", + "modified_webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "only_recent_date_range": "2months", + "only_recent_max_files": "{ %int(30) }", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), resolution_assert_ignore_titles ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_readable": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }x{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "s01_name": "", + "s01_url": "", + "season_directory_name": "Season { %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }", + "season_number": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }", + "season_number_padded": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }", + "season_poster_file_name": "{ %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) }/Season{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }.jpg", + "subscription_array": "{ [ \"https://www.youtube.com/@novapbs\" ] }", + "subscription_indent_1": "Documentaries", + "subscription_indent_2": "TV-14", + "subscription_value": "https://www.youtube.com/@novapbs", + "subscription_value_1": "https://www.youtube.com/@novapbs", + "thumbnail_file_name": "{ %concat( %string( %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ), \".e\", %string( %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) ), \" - \", %string( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) ) ) }-thumb.jpg", + "tv_show_by_date_episode_ordering": "upload-month-day", + "tv_show_by_date_ordering_pair_validation_": "{ [ %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ), 6 ] }", + "tv_show_by_date_season_ordering": "upload-year", + "tv_show_content_rating": "TV-14", + "tv_show_content_rating_default": "TV-14", + "tv_show_date_range_type": "upload_date", + "tv_show_directory": "tv_show_directory_path", + "tv_show_fanart_file_name": "fanart.jpg", + "tv_show_genre": "Documentaries", + "tv_show_genre_default": "ytdl-sub", + "tv_show_name": "NOVA PBS", + "tv_show_poster_file_name": "poster.jpg", + "url": "https://www.youtube.com/@novapbs", + "url10": "", + "url100": "", + "url11": "", + "url12": "", + "url13": "", + "url14": "", + "url15": "", + "url16": "", + "url17": "", + "url18": "", + "url19": "", + "url2": "", + "url20": "", + "url21": "", + "url22": "", + "url23": "", + "url24": "", + "url25": "", + "url26": "", + "url27": "", + "url28": "", + "url29": "", + "url3": "", + "url30": "", + "url31": "", + "url32": "", + "url33": "", + "url34": "", + "url35": "", + "url36": "", + "url37": "", + "url38": "", + "url39": "", + "url4": "", + "url40": "", + "url41": "", + "url42": "", + "url43": "", + "url44": "", + "url45": "", + "url46": "", + "url47": "", + "url48": "", + "url49": "", + "url5": "", + "url50": "", + "url51": "", + "url52": "", + "url53": "", + "url54": "", + "url55": "", + "url56": "", + "url57": "", + "url58": "", + "url59": "", + "url6": "", + "url60": "", + "url61": "", + "url62": "", + "url63": "", + "url64": "", + "url65": "", + "url66": "", + "url67": "", + "url68": "", + "url69": "", + "url7": "", + "url70": "", + "url71": "", + "url72": "", + "url73": "", + "url74": "", + "url75": "", + "url76": "", + "url77": "", + "url78": "", + "url79": "", + "url8": "", + "url80": "", + "url81": "", + "url82": "", + "url83": "", + "url84": "", + "url85": "", + "url86": "", + "url87": "", + "url88": "", + "url89": "", + "url9": "", + "url90": "", + "url91": "", + "url92": "", + "url93": "", + "url94": "", + "url95": "", + "url96": "", + "url97": "", + "url98": "", + "url99": "", + "urls": "{ [ \"https://www.youtube.com/@novapbs\" ] }" +} \ No newline at end of file diff --git a/tests/resources/expected_json/tv_show/inspect_full_variables.json b/tests/resources/expected_json/tv_show/inspect_full_variables.json new file mode 100644 index 00000000..bfb834bf --- /dev/null +++ b/tests/resources/expected_json/tv_show/inspect_full_variables.json @@ -0,0 +1,520 @@ +{ + "assert_not_collection": "{ %bool(True) }", + "assert_not_collection_sanitized": "true", + "avatar_uncropped_thumbnail_file_name": "poster.jpg", + "avatar_uncropped_thumbnail_file_name_sanitized": "poster.jpg", + "banner_uncropped_thumbnail_file_name": "fanart.jpg", + "banner_uncropped_thumbnail_file_name_sanitized": "fanart.jpg", + "channel": "{ %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "channel_id": "{ %map_get_non_empty( entry_metadata, \"channel_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "channel_id_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"channel_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "channel_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "chapters": "{ [ ] }", + "chapters_sanitized": "[]", + "comments": "{ [ ] }", + "comments_sanitized": "[]", + "creator": "{ %map_get_non_empty( entry_metadata, \"creator\", %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "creator_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"creator\", %map_get_non_empty( entry_metadata, \"channel\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }", + "description": "{ %map_get_non_empty( entry_metadata, \"description\", '' ) }", + "description_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"description\", '' ) ) }", + "download_index": "{ %int(1) }", + "download_index_padded6": "000001", + "download_index_padded6_sanitized": "000001", + "download_index_sanitized": "1", + "duration": "{ %map_get_non_empty( entry_metadata, \"duration\", 0 ) }", + "duration_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"duration\", 0 ) ) }", + "enable_bilateral_scraping": "{ %bool(True) }", + "enable_bilateral_scraping_sanitized": "true", + "enable_resolution_assert": "{ %bool(True) }", + "enable_resolution_assert_sanitized": "true", + "enable_throttle_protection": "{ %bool(True) }", + "enable_throttle_protection_sanitized": "true", + "entry_metadata": "{ { } }", + "entry_metadata_sanitized": "{ %sanitize( entry_metadata ) }", + "episode_content_rating": "TV-14", + "episode_content_rating_sanitized": "TV-14", + "episode_date_standardized": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }", + "episode_date_standardized_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) }", + "episode_file_name": "s{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }.e{ %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) } - { %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "episode_file_name_sanitized": "{ %sanitize( %concat( \"s\", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ), \".e\", %string( %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) ), \" - \", %string( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }", + "episode_file_path": "{ %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) }/{ %sanitize( %concat( \"s\", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ), \".e\", %string( %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) ), \" - \", %string( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }", + "episode_file_path_sanitized": "{ %sanitize( %concat( %string( %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ), \".e\", %string( %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) ), \" - \", %string( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) ) ) ) }", + "episode_number": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ) }{ %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) }{ upload_date_index_padded }", + "episode_number_and_padded_": "{ [ %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ), 6 ] }", + "episode_number_and_padded__sanitized": "{ %sanitize( [ %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ), 6 ] ) }", + "episode_number_padded": "{ %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) }", + "episode_number_padded_sanitized": "{ %sanitize( %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) ) }", + "episode_number_sanitized": "{ %sanitize( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ) }", + "episode_plot": "{ %map_get( entry_metadata, \"webpage_url\" ) }\n\n{ %map_get_non_empty( entry_metadata, \"description\", '' ) }", + "episode_plot_sanitized": "{ %sanitize( %concat( %string( %map_get( entry_metadata, \"webpage_url\" ) ), \"\n\n\", %string( %map_get_non_empty( entry_metadata, \"description\", '' ) ) ) ) }", + "episode_title": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) } - { %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) }", + "episode_title_sanitized": "{ %sanitize( %concat( %string( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ), \" - \", %string( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "episode_year": "{ %slice( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ), 0, 4 ) }", + "episode_year_sanitized": "{ %sanitize( %slice( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ), 0, 4 ) ) }", + "epoch": "{ %map_get( entry_metadata, \"epoch\" ) }", + "epoch_date": "{ %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) }", + "epoch_date_sanitized": "{ %sanitize( %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) }", + "epoch_hour": "{ %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%H\" ) }", + "epoch_hour_sanitized": "{ %sanitize( %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%H\" ) ) }", + "epoch_sanitized": "{ %sanitize( %map_get( entry_metadata, \"epoch\" ) ) }", + "ext": "{ %throw( \"Plugin variable ext has not been created yet\" ) }", + "ext_sanitized": "{ %sanitize( ext ) }", + "extractor": "{ %map_get( entry_metadata, \"extractor\" ) }", + "extractor_key": "{ %map_get( entry_metadata, \"extractor_key\" ) }", + "extractor_key_sanitized": "{ %sanitize( %map_get( entry_metadata, \"extractor_key\" ) ) }", + "extractor_sanitized": "{ %sanitize( %map_get( entry_metadata, \"extractor\" ) ) }", + "file_title": "{ %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "file_title_sanitized": "{ %sanitize( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "file_uid": "{ %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) }", + "file_uid_sanitized": "{ %sanitize( %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) ) }", + "height": "{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "height_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"height\", 0 ) ) }", + "ie_key": "{ %map_get_non_empty( entry_metadata, \"ie_key\", %map_get( entry_metadata, \"extractor_key\" ) ) }", + "ie_key_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"ie_key\", %map_get( entry_metadata, \"extractor_key\" ) ) ) }", + "include_sibling_metadata": "{ %bool(False) }", + "include_sibling_metadata_sanitized": "false", + "info_json_ext": "info.json", + "info_json_ext_sanitized": "info.json", + "modified_webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "modified_webpage_url_sanitized": "{ %sanitize( %map_get( entry_metadata, \"webpage_url\" ) ) }", + "only_recent_date_range": "2months", + "only_recent_date_range_sanitized": "2months", + "only_recent_max_files": "{ %int(30) }", + "only_recent_max_files_sanitized": "30", + "playlist_count": "{ %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) }", + "playlist_count_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) ) }", + "playlist_description": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) }", + "playlist_description_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) ) }", + "playlist_index": "{ %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) }", + "playlist_index_padded": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) }", + "playlist_index_padded6": "{ %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 6 ) }", + "playlist_index_padded6_sanitized": "{ %sanitize( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 6 ) ) }", + "playlist_index_padded_sanitized": "{ %sanitize( %pad_zero( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), 2 ) ) }", + "playlist_index_reversed": "{ %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ) }", + "playlist_index_reversed_padded": "{ %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 2 ) }", + "playlist_index_reversed_padded6": "{ %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 6 ) }", + "playlist_index_reversed_padded6_sanitized": "{ %sanitize( %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 6 ) ) }", + "playlist_index_reversed_padded_sanitized": "{ %sanitize( %pad_zero( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ), 2 ) ) }", + "playlist_index_reversed_sanitized": "{ %sanitize( %sub( %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ), %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ), -1 ) ) }", + "playlist_index_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) ) }", + "playlist_max_upload_date": "{ %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) }", + "playlist_max_upload_date_sanitized": "{ %sanitize( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ) }", + "playlist_max_upload_year": "{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) }", + "playlist_max_upload_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year\" ) ) ) }", + "playlist_max_upload_year_truncated": "{ %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year_truncated\" ) ) }", + "playlist_max_upload_year_truncated_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) ), \"year_truncated\" ) ) ) }", + "playlist_metadata": "{ %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ) }", + "playlist_metadata_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ) ) }", + "playlist_title": "{ %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "playlist_title_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "playlist_uid": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) }", + "playlist_uid_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "playlist_uploader": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "playlist_uploader_id": "{ %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "playlist_uploader_id_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "playlist_uploader_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "playlist_uploader_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) }", + "playlist_uploader_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "playlist_webpage_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) }", + "playlist_webpage_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "release_date": "{ %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) }", + "release_date_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ) }", + "release_date_standardized": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"date_standardized\" ) ) }", + "release_date_standardized_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"date_standardized\" ) ) ) }", + "release_day": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day\" ) ) }", + "release_day_of_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year\" ) ) }", + "release_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_padded\" ) ) }", + "release_day_of_year_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_padded\" ) ) ) }", + "release_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed\" ) ) }", + "release_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed_padded\" ) ) }", + "release_day_of_year_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed_padded\" ) ) ) }", + "release_day_of_year_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year_reversed\" ) ) ) }", + "release_day_of_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_of_year\" ) ) ) }", + "release_day_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_padded\" ) ) }", + "release_day_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_padded\" ) ) ) }", + "release_day_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed\" ) ) }", + "release_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed_padded\" ) ) }", + "release_day_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed_padded\" ) ) ) }", + "release_day_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day_reversed\" ) ) ) }", + "release_day_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"day\" ) ) ) }", + "release_month": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month\" ) ) }", + "release_month_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_padded\" ) ) }", + "release_month_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_padded\" ) ) ) }", + "release_month_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed\" ) ) }", + "release_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed_padded\" ) ) }", + "release_month_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed_padded\" ) ) ) }", + "release_month_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month_reversed\" ) ) ) }", + "release_month_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"month\" ) ) ) }", + "release_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year\" ) ) }", + "release_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year\" ) ) ) }", + "release_year_truncated": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated\" ) ) }", + "release_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated_reversed\" ) ) }", + "release_year_truncated_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated_reversed\" ) ) ) }", + "release_year_truncated_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"release_date\", %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) ), \"year_truncated\" ) ) ) }", + "requested_subtitles": "{ { } }", + "requested_subtitles_sanitized": "{}", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_height_gte_sanitized": "361", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_ignore_titles_sanitized": "[]", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), resolution_assert_ignore_titles ) ) }", + "resolution_assert_is_ignored_sanitized": "{ %sanitize( %print_if_true( %concat( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ), resolution_assert_ignore_titles ) ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_assert_print_sanitized": "true", + "resolution_assert_sanitized": "{ %sanitize( %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) ) }", + "resolution_readable": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }x{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "resolution_readable_sanitized": "{ %sanitize( %concat( %string( %map_get_non_empty( entry_metadata, \"width\", 0 ) ), \"x\", %string( %map_get_non_empty( entry_metadata, \"height\", 0 ) ) ) ) }", + "s01_name": "", + "s01_name_sanitized": "", + "s01_url": "", + "s01_url_sanitized": "", + "season_directory_name": "Season { %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }", + "season_directory_name_sanitized": "{ %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) }", + "season_number": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }", + "season_number_padded": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }", + "season_number_padded_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) }", + "season_number_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) }", + "season_poster_file_name": "{ %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) }/Season{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }.jpg", + "season_poster_file_name_sanitized": "{ %sanitize( %concat( %string( %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) ), \"/Season\", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ), \".jpg\" ) ) }", + "sibling_metadata": "{ %map_get_non_empty( entry_metadata, \"sibling_metadata\", [ ] ) }", + "sibling_metadata_sanitized": "{ %sanitize( sibling_metadata ) }", + "source_count": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_count\", 1 ) }", + "source_count_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_count\", 1 ) ) }", + "source_description": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"description\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) ) }", + "source_description_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"description\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"description\", %map_get_non_empty( entry_metadata, \"description\", '' ) ) ) ) }", + "source_index": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ) }", + "source_index_padded": "{ %pad_zero( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ), 2 ) }", + "source_index_padded_sanitized": "{ %sanitize( %pad_zero( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ), 2 ) ) }", + "source_index_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_index\", 1 ) ) }", + "source_metadata": "{ %map_get_non_empty( entry_metadata, \"source_metadata\", { } ) }", + "source_metadata_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ) ) }", + "source_title": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"title\", %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "source_title_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"title\", %map_get_non_empty( entry_metadata, \"playlist_title\", %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "source_uid": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"id\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "source_uid_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"id\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"playlist_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "source_uploader": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "source_uploader_id": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_id\", %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "source_uploader_id_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_id\", %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) }", + "source_uploader_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"uploader\", %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) }", + "source_uploader_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) ) }", + "source_uploader_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"uploader_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) ) ) }", + "source_webpage_url": "{ %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "source_webpage_url_sanitized": "{ %sanitize( %map_get_non_empty( %map_get_non_empty( entry_metadata, \"source_metadata\", { } ), \"webpage_url\", %map_get_non_empty( %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ), \"webpage_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) ) }", + "sponsorblock_chapters": "{ [ ] }", + "sponsorblock_chapters_sanitized": "[]", + "subscription_array": "{ [ \"https://www.youtube.com/@novapbs\" ] }", + "subscription_array_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8@novapbs\uff02]", + "subscription_has_download_archive": "{ %bool(False) }", + "subscription_has_download_archive_sanitized": "false", + "subscription_indent_1": "Documentaries", + "subscription_indent_1_sanitized": "Documentaries", + "subscription_indent_2": "TV-14", + "subscription_indent_2_sanitized": "TV-14", + "subscription_name": "NOVA PBS", + "subscription_name_sanitized": "NOVA PBS", + "subscription_value": "https://www.youtube.com/@novapbs", + "subscription_value_1": "https://www.youtube.com/@novapbs", + "subscription_value_1_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8@novapbs", + "subscription_value_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8@novapbs", + "thumbnail_ext": "jpg", + "thumbnail_ext_sanitized": "jpg", + "thumbnail_file_name": "{ %concat( %string( %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ), \".e\", %string( %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) ), \" - \", %string( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) ) ) }-thumb.jpg", + "thumbnail_file_name_sanitized": "{ %sanitize( %concat( %string( %concat( %string( %sanitize( %concat( \"Season \", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ), \".e\", %string( %pad_zero( %int( %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ) ), 6 ) ), \" - \", %string( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) ) ) ) ) ), \"-thumb.jpg\" ) ) }", + "title": "{ %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) }", + "title_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "title_sanitized_plex": "{ %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) }", + "title_sanitized_plex_sanitized": "{ %sanitize( %sanitize_plex_episode( %map_get_non_empty( entry_metadata, \"title\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "tv_show_by_date_episode_ordering": "upload-month-day", + "tv_show_by_date_episode_ordering_sanitized": "upload-month-day", + "tv_show_by_date_ordering_pair_validation_": "{ [ %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ), 6 ] }", + "tv_show_by_date_ordering_pair_validation__sanitized": "{ %sanitize( [ %concat( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ), %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ), upload_date_index_padded ), 6 ] ) }", + "tv_show_by_date_season_ordering": "upload-year", + "tv_show_by_date_season_ordering_sanitized": "upload-year", + "tv_show_content_rating": "TV-14", + "tv_show_content_rating_default": "TV-14", + "tv_show_content_rating_default_sanitized": "TV-14", + "tv_show_content_rating_sanitized": "TV-14", + "tv_show_date_range_type": "upload_date", + "tv_show_date_range_type_sanitized": "upload_date", + "tv_show_directory": "tv_show_directory_path", + "tv_show_directory_sanitized": "tv_show_directory_path", + "tv_show_fanart_file_name": "fanart.jpg", + "tv_show_fanart_file_name_sanitized": "fanart.jpg", + "tv_show_genre": "Documentaries", + "tv_show_genre_default": "ytdl-sub", + "tv_show_genre_default_sanitized": "ytdl-sub", + "tv_show_genre_sanitized": "Documentaries", + "tv_show_name": "NOVA PBS", + "tv_show_name_sanitized": "NOVA PBS", + "tv_show_poster_file_name": "poster.jpg", + "tv_show_poster_file_name_sanitized": "poster.jpg", + "uid": "{ %map_get( entry_metadata, \"id\" ) }", + "uid_sanitized": "{ %sanitize( %map_get( entry_metadata, \"id\" ) ) }", + "uid_sanitized_plex": "{ %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) }", + "uid_sanitized_plex_sanitized": "{ %sanitize( %sanitize_plex_episode( %map_get( entry_metadata, \"id\" ) ) ) }", + "upload_date": "{ %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) }", + "upload_date_index": "{ %int(1) }", + "upload_date_index_padded": "01", + "upload_date_index_padded_sanitized": "01", + "upload_date_index_reversed": "{ %int(99) }", + "upload_date_index_reversed_padded": "99", + "upload_date_index_reversed_padded_sanitized": "99", + "upload_date_index_reversed_sanitized": "99", + "upload_date_index_sanitized": "1", + "upload_date_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ) }", + "upload_date_standardized": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) }", + "upload_date_standardized_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) }", + "upload_day": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day\" ) ) }", + "upload_day_of_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year\" ) ) }", + "upload_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_padded\" ) ) }", + "upload_day_of_year_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_padded\" ) ) ) }", + "upload_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed\" ) ) }", + "upload_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed_padded\" ) ) }", + "upload_day_of_year_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed_padded\" ) ) ) }", + "upload_day_of_year_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year_reversed\" ) ) ) }", + "upload_day_of_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_of_year\" ) ) ) }", + "upload_day_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ) }", + "upload_day_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_padded\" ) ) ) }", + "upload_day_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed\" ) ) }", + "upload_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed_padded\" ) ) }", + "upload_day_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed_padded\" ) ) ) }", + "upload_day_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day_reversed\" ) ) ) }", + "upload_day_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"day\" ) ) ) }", + "upload_month": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ) }", + "upload_month_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_padded\" ) ) }", + "upload_month_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_padded\" ) ) ) }", + "upload_month_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed\" ) ) }", + "upload_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed_padded\" ) ) }", + "upload_month_reversed_padded_sanitized": "{ %sanitize( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed_padded\" ) ) ) }", + "upload_month_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month_reversed\" ) ) ) }", + "upload_month_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"month\" ) ) ) }", + "upload_year": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) }", + "upload_year_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year\" ) ) ) }", + "upload_year_truncated": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated\" ) ) }", + "upload_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated_reversed\" ) ) }", + "upload_year_truncated_reversed_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated_reversed\" ) ) ) }", + "upload_year_truncated_sanitized": "{ %sanitize( %int( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"year_truncated\" ) ) ) }", + "uploader": "{ %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "uploader_id": "{ %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) }", + "uploader_id_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) }", + "uploader_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"uploader\", %map_get_non_empty( entry_metadata, \"uploader_id\", %map_get( entry_metadata, \"id\" ) ) ) ) }", + "uploader_url": "{ %map_get_non_empty( entry_metadata, \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) }", + "uploader_url_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"uploader_url\", %map_get( entry_metadata, \"webpage_url\" ) ) ) }", + "url": "https://www.youtube.com/@novapbs", + "url10": "", + "url100": "", + "url100_sanitized": "", + "url10_sanitized": "", + "url11": "", + "url11_sanitized": "", + "url12": "", + "url12_sanitized": "", + "url13": "", + "url13_sanitized": "", + "url14": "", + "url14_sanitized": "", + "url15": "", + "url15_sanitized": "", + "url16": "", + "url16_sanitized": "", + "url17": "", + "url17_sanitized": "", + "url18": "", + "url18_sanitized": "", + "url19": "", + "url19_sanitized": "", + "url2": "", + "url20": "", + "url20_sanitized": "", + "url21": "", + "url21_sanitized": "", + "url22": "", + "url22_sanitized": "", + "url23": "", + "url23_sanitized": "", + "url24": "", + "url24_sanitized": "", + "url25": "", + "url25_sanitized": "", + "url26": "", + "url26_sanitized": "", + "url27": "", + "url27_sanitized": "", + "url28": "", + "url28_sanitized": "", + "url29": "", + "url29_sanitized": "", + "url2_sanitized": "", + "url3": "", + "url30": "", + "url30_sanitized": "", + "url31": "", + "url31_sanitized": "", + "url32": "", + "url32_sanitized": "", + "url33": "", + "url33_sanitized": "", + "url34": "", + "url34_sanitized": "", + "url35": "", + "url35_sanitized": "", + "url36": "", + "url36_sanitized": "", + "url37": "", + "url37_sanitized": "", + "url38": "", + "url38_sanitized": "", + "url39": "", + "url39_sanitized": "", + "url3_sanitized": "", + "url4": "", + "url40": "", + "url40_sanitized": "", + "url41": "", + "url41_sanitized": "", + "url42": "", + "url42_sanitized": "", + "url43": "", + "url43_sanitized": "", + "url44": "", + "url44_sanitized": "", + "url45": "", + "url45_sanitized": "", + "url46": "", + "url46_sanitized": "", + "url47": "", + "url47_sanitized": "", + "url48": "", + "url48_sanitized": "", + "url49": "", + "url49_sanitized": "", + "url4_sanitized": "", + "url5": "", + "url50": "", + "url50_sanitized": "", + "url51": "", + "url51_sanitized": "", + "url52": "", + "url52_sanitized": "", + "url53": "", + "url53_sanitized": "", + "url54": "", + "url54_sanitized": "", + "url55": "", + "url55_sanitized": "", + "url56": "", + "url56_sanitized": "", + "url57": "", + "url57_sanitized": "", + "url58": "", + "url58_sanitized": "", + "url59": "", + "url59_sanitized": "", + "url5_sanitized": "", + "url6": "", + "url60": "", + "url60_sanitized": "", + "url61": "", + "url61_sanitized": "", + "url62": "", + "url62_sanitized": "", + "url63": "", + "url63_sanitized": "", + "url64": "", + "url64_sanitized": "", + "url65": "", + "url65_sanitized": "", + "url66": "", + "url66_sanitized": "", + "url67": "", + "url67_sanitized": "", + "url68": "", + "url68_sanitized": "", + "url69": "", + "url69_sanitized": "", + "url6_sanitized": "", + "url7": "", + "url70": "", + "url70_sanitized": "", + "url71": "", + "url71_sanitized": "", + "url72": "", + "url72_sanitized": "", + "url73": "", + "url73_sanitized": "", + "url74": "", + "url74_sanitized": "", + "url75": "", + "url75_sanitized": "", + "url76": "", + "url76_sanitized": "", + "url77": "", + "url77_sanitized": "", + "url78": "", + "url78_sanitized": "", + "url79": "", + "url79_sanitized": "", + "url7_sanitized": "", + "url8": "", + "url80": "", + "url80_sanitized": "", + "url81": "", + "url81_sanitized": "", + "url82": "", + "url82_sanitized": "", + "url83": "", + "url83_sanitized": "", + "url84": "", + "url84_sanitized": "", + "url85": "", + "url85_sanitized": "", + "url86": "", + "url86_sanitized": "", + "url87": "", + "url87_sanitized": "", + "url88": "", + "url88_sanitized": "", + "url89": "", + "url89_sanitized": "", + "url8_sanitized": "", + "url9": "", + "url90": "", + "url90_sanitized": "", + "url91": "", + "url91_sanitized": "", + "url92": "", + "url92_sanitized": "", + "url93": "", + "url93_sanitized": "", + "url94": "", + "url94_sanitized": "", + "url95": "", + "url95_sanitized": "", + "url96": "", + "url96_sanitized": "", + "url97": "", + "url97_sanitized": "", + "url98": "", + "url98_sanitized": "", + "url99": "", + "url99_sanitized": "", + "url9_sanitized": "", + "url_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8@novapbs", + "urls": "{ [ \"https://www.youtube.com/@novapbs\" ] }", + "urls_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8@novapbs\uff02]", + "webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "webpage_url_sanitized": "{ %sanitize( %map_get( entry_metadata, \"webpage_url\" ) ) }", + "width": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }", + "width_sanitized": "{ %sanitize( %map_get_non_empty( entry_metadata, \"width\", 0 ) ) }", + "ytdl_sub_chapters_from_comments": "{ %throw( \"Plugin variable ytdl_sub_chapters_from_comments has not been created yet\" ) }", + "ytdl_sub_chapters_from_comments_sanitized": "{ %sanitize( ytdl_sub_chapters_from_comments ) }", + "ytdl_sub_entry_date_eval": "{ %string( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) }", + "ytdl_sub_entry_date_eval_sanitized": "{ %sanitize( %string( %string( %map_get( %to_date_metadata( %map_get_non_empty( entry_metadata, \"upload_date\", %datetime_strftime( %map_get( entry_metadata, \"epoch\" ), \"%Y%m%d\" ) ) ), \"date_standardized\" ) ) ) ) }", + "ytdl_sub_input_url": "", + "ytdl_sub_input_url_count": "{ %int(0) }", + "ytdl_sub_input_url_count_sanitized": "0", + "ytdl_sub_input_url_index": "{ %int(-1) }", + "ytdl_sub_input_url_index_sanitized": "-1", + "ytdl_sub_input_url_sanitized": "" +} \ No newline at end of file diff --git a/tests/resources/expected_json/tv_show/inspect_overrides.json b/tests/resources/expected_json/tv_show/inspect_overrides.json new file mode 100644 index 00000000..faf71281 --- /dev/null +++ b/tests/resources/expected_json/tv_show/inspect_overrides.json @@ -0,0 +1,155 @@ +{ + "assert_not_collection": "{ %bool(True) }", + "avatar_uncropped_thumbnail_file_name": "poster.jpg", + "banner_uncropped_thumbnail_file_name": "fanart.jpg", + "enable_bilateral_scraping": "{ %bool(True) }", + "enable_resolution_assert": "{ %bool(True) }", + "enable_throttle_protection": "{ %bool(True) }", + "episode_content_rating": "TV-14", + "episode_date_standardized": "{ upload_date_standardized }", + "episode_file_name": "s{ upload_year }.e{ %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) } - { title_sanitized_plex }", + "episode_file_path": "{ %sanitize( %concat( \"Season \", %string( upload_year ) ) ) }/{ %sanitize( %concat( \"s\", %string( upload_year ), \".e\", %string( %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) ), \" - \", %string( title_sanitized_plex ) ) ) }", + "episode_number": "{ upload_month }{ upload_day_padded }{ upload_date_index_padded }", + "episode_number_and_padded_": "{ [ %concat( upload_month, upload_day_padded, upload_date_index_padded ), 6 ] }", + "episode_number_padded": "{ %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) }", + "episode_plot": "{ webpage_url }\n\n{ description }", + "episode_title": "{ upload_date_standardized } - { title }", + "episode_year": "{ %slice( upload_date_standardized, 0, 4 ) }", + "file_title": "{ title_sanitized_plex }", + "file_uid": "{ uid_sanitized_plex }", + "include_sibling_metadata": "{ %bool(False) }", + "modified_webpage_url": "{ webpage_url }", + "only_recent_date_range": "2months", + "only_recent_max_files": "{ %int(30) }", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( title, \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( title, resolution_assert_ignore_titles ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_readable": "{ width }x{ height }", + "s01_name": "", + "s01_url": "", + "season_directory_name": "Season { upload_year }", + "season_number": "{ upload_year }", + "season_number_padded": "{ upload_year }", + "season_poster_file_name": "{ %sanitize( %concat( \"Season \", %string( upload_year ) ) ) }/Season{ upload_year }.jpg", + "subscription_array": "{ [ \"https://www.youtube.com/@novapbs\" ] }", + "subscription_indent_1": "Documentaries", + "subscription_indent_2": "TV-14", + "subscription_value": "https://www.youtube.com/@novapbs", + "subscription_value_1": "https://www.youtube.com/@novapbs", + "thumbnail_file_name": "{ %concat( %string( %sanitize( %concat( \"Season \", %string( upload_year ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( upload_year ), \".e\", %string( %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) ), \" - \", %string( title_sanitized_plex ) ) ) ) ) }-thumb.jpg", + "tv_show_by_date_episode_ordering": "upload-month-day", + "tv_show_by_date_ordering_pair_validation_": "{ [ %concat( upload_month, upload_day_padded, upload_date_index_padded ), 6 ] }", + "tv_show_by_date_season_ordering": "upload-year", + "tv_show_content_rating": "TV-14", + "tv_show_content_rating_default": "TV-14", + "tv_show_date_range_type": "upload_date", + "tv_show_directory": "tv_show_directory_path", + "tv_show_fanart_file_name": "fanart.jpg", + "tv_show_genre": "Documentaries", + "tv_show_genre_default": "ytdl-sub", + "tv_show_name": "NOVA PBS", + "tv_show_poster_file_name": "poster.jpg", + "url": "https://www.youtube.com/@novapbs", + "url10": "", + "url100": "", + "url11": "", + "url12": "", + "url13": "", + "url14": "", + "url15": "", + "url16": "", + "url17": "", + "url18": "", + "url19": "", + "url2": "", + "url20": "", + "url21": "", + "url22": "", + "url23": "", + "url24": "", + "url25": "", + "url26": "", + "url27": "", + "url28": "", + "url29": "", + "url3": "", + "url30": "", + "url31": "", + "url32": "", + "url33": "", + "url34": "", + "url35": "", + "url36": "", + "url37": "", + "url38": "", + "url39": "", + "url4": "", + "url40": "", + "url41": "", + "url42": "", + "url43": "", + "url44": "", + "url45": "", + "url46": "", + "url47": "", + "url48": "", + "url49": "", + "url5": "", + "url50": "", + "url51": "", + "url52": "", + "url53": "", + "url54": "", + "url55": "", + "url56": "", + "url57": "", + "url58": "", + "url59": "", + "url6": "", + "url60": "", + "url61": "", + "url62": "", + "url63": "", + "url64": "", + "url65": "", + "url66": "", + "url67": "", + "url68": "", + "url69": "", + "url7": "", + "url70": "", + "url71": "", + "url72": "", + "url73": "", + "url74": "", + "url75": "", + "url76": "", + "url77": "", + "url78": "", + "url79": "", + "url8": "", + "url80": "", + "url81": "", + "url82": "", + "url83": "", + "url84": "", + "url85": "", + "url86": "", + "url87": "", + "url88": "", + "url89": "", + "url9": "", + "url90": "", + "url91": "", + "url92": "", + "url93": "", + "url94": "", + "url95": "", + "url96": "", + "url97": "", + "url98": "", + "url99": "", + "urls": "{ [ \"https://www.youtube.com/@novapbs\" ] }" +} \ No newline at end of file diff --git a/tests/resources/expected_json/tv_show/inspect_variables.json b/tests/resources/expected_json/tv_show/inspect_variables.json new file mode 100644 index 00000000..77659a4b --- /dev/null +++ b/tests/resources/expected_json/tv_show/inspect_variables.json @@ -0,0 +1,520 @@ +{ + "assert_not_collection": "{ %bool(True) }", + "assert_not_collection_sanitized": "true", + "avatar_uncropped_thumbnail_file_name": "poster.jpg", + "avatar_uncropped_thumbnail_file_name_sanitized": "poster.jpg", + "banner_uncropped_thumbnail_file_name": "fanart.jpg", + "banner_uncropped_thumbnail_file_name_sanitized": "fanart.jpg", + "channel": "{ %map_get_non_empty( entry_metadata, \"channel\", uploader ) }", + "channel_id": "{ %map_get_non_empty( entry_metadata, \"channel_id\", uploader_id ) }", + "channel_id_sanitized": "{ %sanitize( channel_id ) }", + "channel_sanitized": "{ %sanitize( channel ) }", + "chapters": "{ [ ] }", + "chapters_sanitized": "{ %sanitize( chapters ) }", + "comments": "{ [ ] }", + "comments_sanitized": "{ %sanitize( comments ) }", + "creator": "{ %map_get_non_empty( entry_metadata, \"creator\", channel ) }", + "creator_sanitized": "{ %sanitize( creator ) }", + "description": "{ %map_get_non_empty( entry_metadata, \"description\", '' ) }", + "description_sanitized": "{ %sanitize( description ) }", + "download_index": "{ %int( 1 ) }", + "download_index_padded6": "{ %pad_zero( download_index, 6 ) }", + "download_index_padded6_sanitized": "{ %sanitize( download_index_padded6 ) }", + "download_index_sanitized": "{ %sanitize( download_index ) }", + "duration": "{ %map_get_non_empty( entry_metadata, \"duration\", 0 ) }", + "duration_sanitized": "{ %sanitize( duration ) }", + "enable_bilateral_scraping": "{ %bool(True) }", + "enable_bilateral_scraping_sanitized": "true", + "enable_resolution_assert": "{ %bool(True) }", + "enable_resolution_assert_sanitized": "true", + "enable_throttle_protection": "{ %bool(True) }", + "enable_throttle_protection_sanitized": "true", + "entry_metadata": "{ { } }", + "entry_metadata_sanitized": "{ %sanitize( entry_metadata ) }", + "episode_content_rating": "TV-14", + "episode_content_rating_sanitized": "TV-14", + "episode_date_standardized": "{ upload_date_standardized }", + "episode_date_standardized_sanitized": "{ %sanitize( upload_date_standardized ) }", + "episode_file_name": "s{ upload_year }.e{ %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) } - { title_sanitized_plex }", + "episode_file_name_sanitized": "{ %sanitize( %concat( \"s\", %string( upload_year ), \".e\", %string( %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) ), \" - \", %string( title_sanitized_plex ) ) ) }", + "episode_file_path": "{ %sanitize( %concat( \"Season \", %string( upload_year ) ) ) }/{ %sanitize( %concat( \"s\", %string( upload_year ), \".e\", %string( %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) ), \" - \", %string( title_sanitized_plex ) ) ) }", + "episode_file_path_sanitized": "{ %sanitize( %concat( %string( %sanitize( %concat( \"Season \", %string( upload_year ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( upload_year ), \".e\", %string( %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) ), \" - \", %string( title_sanitized_plex ) ) ) ) ) ) }", + "episode_number": "{ upload_month }{ upload_day_padded }{ upload_date_index_padded }", + "episode_number_and_padded_": "{ [ %concat( upload_month, upload_day_padded, upload_date_index_padded ), 6 ] }", + "episode_number_and_padded__sanitized": "{ %sanitize( [ %concat( upload_month, upload_day_padded, upload_date_index_padded ), 6 ] ) }", + "episode_number_padded": "{ %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) }", + "episode_number_padded_sanitized": "{ %sanitize( %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) ) }", + "episode_number_sanitized": "{ %sanitize( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ) }", + "episode_plot": "{ webpage_url }\n\n{ description }", + "episode_plot_sanitized": "{ %sanitize( %concat( %string( webpage_url ), \"\n\n\", %string( description ) ) ) }", + "episode_title": "{ upload_date_standardized } - { title }", + "episode_title_sanitized": "{ %sanitize( %concat( %string( upload_date_standardized ), \" - \", %string( title ) ) ) }", + "episode_year": "{ %slice( upload_date_standardized, 0, 4 ) }", + "episode_year_sanitized": "{ %sanitize( %slice( upload_date_standardized, 0, 4 ) ) }", + "epoch": "{ %map_get( entry_metadata, \"epoch\" ) }", + "epoch_date": "{ %datetime_strftime( epoch, \"%Y%m%d\" ) }", + "epoch_date_sanitized": "{ %sanitize( epoch_date ) }", + "epoch_hour": "{ %datetime_strftime( epoch, \"%H\" ) }", + "epoch_hour_sanitized": "{ %sanitize( epoch_hour ) }", + "epoch_sanitized": "{ %sanitize( epoch ) }", + "ext": "{ %throw( \"Plugin variable ext has not been created yet\" ) }", + "ext_sanitized": "{ %sanitize( ext ) }", + "extractor": "{ %map_get( entry_metadata, \"extractor\" ) }", + "extractor_key": "{ %map_get( entry_metadata, \"extractor_key\" ) }", + "extractor_key_sanitized": "{ %sanitize( extractor_key ) }", + "extractor_sanitized": "{ %sanitize( extractor ) }", + "file_title": "{ title_sanitized_plex }", + "file_title_sanitized": "{ %sanitize( title_sanitized_plex ) }", + "file_uid": "{ uid_sanitized_plex }", + "file_uid_sanitized": "{ %sanitize( uid_sanitized_plex ) }", + "height": "{ %map_get_non_empty( entry_metadata, \"height\", 0 ) }", + "height_sanitized": "{ %sanitize( height ) }", + "ie_key": "{ %map_get_non_empty( entry_metadata, \"ie_key\", extractor_key ) }", + "ie_key_sanitized": "{ %sanitize( ie_key ) }", + "include_sibling_metadata": "{ %bool(False) }", + "include_sibling_metadata_sanitized": "false", + "info_json_ext": "info.json", + "info_json_ext_sanitized": "info.json", + "modified_webpage_url": "{ webpage_url }", + "modified_webpage_url_sanitized": "{ %sanitize( webpage_url ) }", + "only_recent_date_range": "2months", + "only_recent_date_range_sanitized": "2months", + "only_recent_max_files": "{ %int(30) }", + "only_recent_max_files_sanitized": "30", + "playlist_count": "{ %map_get_non_empty( entry_metadata, \"playlist_count\", 1 ) }", + "playlist_count_sanitized": "{ %sanitize( playlist_count ) }", + "playlist_description": "{ %map_get_non_empty( playlist_metadata, \"description\", description ) }", + "playlist_description_sanitized": "{ %sanitize( playlist_description ) }", + "playlist_index": "{ %map_get_non_empty( entry_metadata, \"playlist_index\", 1 ) }", + "playlist_index_padded": "{ %pad_zero( playlist_index, 2 ) }", + "playlist_index_padded6": "{ %pad_zero( playlist_index, 6 ) }", + "playlist_index_padded6_sanitized": "{ %sanitize( playlist_index_padded6 ) }", + "playlist_index_padded_sanitized": "{ %sanitize( playlist_index_padded ) }", + "playlist_index_reversed": "{ %sub( playlist_count, playlist_index, -1 ) }", + "playlist_index_reversed_padded": "{ %pad_zero( playlist_index_reversed, 2 ) }", + "playlist_index_reversed_padded6": "{ %pad_zero( playlist_index_reversed, 6 ) }", + "playlist_index_reversed_padded6_sanitized": "{ %sanitize( playlist_index_reversed_padded6 ) }", + "playlist_index_reversed_padded_sanitized": "{ %sanitize( playlist_index_reversed_padded ) }", + "playlist_index_reversed_sanitized": "{ %sanitize( playlist_index_reversed ) }", + "playlist_index_sanitized": "{ %sanitize( playlist_index ) }", + "playlist_max_upload_date": "{ %array_reduce( %if_passthrough( %extract_field_from_siblings( \"upload_date\" ), [ upload_date ] ), %max ) }", + "playlist_max_upload_date_sanitized": "{ %sanitize( playlist_max_upload_date ) }", + "playlist_max_upload_year": "{ %int( %map_get( %to_date_metadata( playlist_max_upload_date ), \"year\" ) ) }", + "playlist_max_upload_year_sanitized": "{ %sanitize( playlist_max_upload_year ) }", + "playlist_max_upload_year_truncated": "{ %int( %map_get( %to_date_metadata( playlist_max_upload_date ), \"year_truncated\" ) ) }", + "playlist_max_upload_year_truncated_sanitized": "{ %sanitize( playlist_max_upload_year_truncated ) }", + "playlist_metadata": "{ %map_get_non_empty( entry_metadata, \"playlist_metadata\", { } ) }", + "playlist_metadata_sanitized": "{ %sanitize( playlist_metadata ) }", + "playlist_title": "{ %map_get_non_empty( entry_metadata, \"playlist_title\", title ) }", + "playlist_title_sanitized": "{ %sanitize( playlist_title ) }", + "playlist_uid": "{ %map_get_non_empty( playlist_metadata, \"playlist_id\", uid ) }", + "playlist_uid_sanitized": "{ %sanitize( playlist_uid ) }", + "playlist_uploader": "{ %map_get_non_empty( playlist_metadata, \"uploader\", uploader ) }", + "playlist_uploader_id": "{ %map_get_non_empty( entry_metadata, \"playlist_uploader_id\", uploader_id ) }", + "playlist_uploader_id_sanitized": "{ %sanitize( playlist_uploader_id ) }", + "playlist_uploader_sanitized": "{ %sanitize( playlist_uploader ) }", + "playlist_uploader_url": "{ %map_get_non_empty( playlist_metadata, \"uploader_url\", webpage_url ) }", + "playlist_uploader_url_sanitized": "{ %sanitize( playlist_uploader_url ) }", + "playlist_webpage_url": "{ %map_get_non_empty( playlist_metadata, \"webpage_url\", webpage_url ) }", + "playlist_webpage_url_sanitized": "{ %sanitize( playlist_webpage_url ) }", + "release_date": "{ %map_get_non_empty( entry_metadata, \"release_date\", upload_date ) }", + "release_date_sanitized": "{ %sanitize( release_date ) }", + "release_date_standardized": "{ %string( %map_get( %to_date_metadata( release_date ), \"date_standardized\" ) ) }", + "release_date_standardized_sanitized": "{ %sanitize( release_date_standardized ) }", + "release_day": "{ %int( %map_get( %to_date_metadata( release_date ), \"day\" ) ) }", + "release_day_of_year": "{ %int( %map_get( %to_date_metadata( release_date ), \"day_of_year\" ) ) }", + "release_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_of_year_padded\" ) ) }", + "release_day_of_year_padded_sanitized": "{ %sanitize( release_day_of_year_padded ) }", + "release_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"day_of_year_reversed\" ) ) }", + "release_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_of_year_reversed_padded\" ) ) }", + "release_day_of_year_reversed_padded_sanitized": "{ %sanitize( release_day_of_year_reversed_padded ) }", + "release_day_of_year_reversed_sanitized": "{ %sanitize( release_day_of_year_reversed ) }", + "release_day_of_year_sanitized": "{ %sanitize( release_day_of_year ) }", + "release_day_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_padded\" ) ) }", + "release_day_padded_sanitized": "{ %sanitize( release_day_padded ) }", + "release_day_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"day_reversed\" ) ) }", + "release_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"day_reversed_padded\" ) ) }", + "release_day_reversed_padded_sanitized": "{ %sanitize( release_day_reversed_padded ) }", + "release_day_reversed_sanitized": "{ %sanitize( release_day_reversed ) }", + "release_day_sanitized": "{ %sanitize( release_day ) }", + "release_month": "{ %int( %map_get( %to_date_metadata( release_date ), \"month\" ) ) }", + "release_month_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"month_padded\" ) ) }", + "release_month_padded_sanitized": "{ %sanitize( release_month_padded ) }", + "release_month_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"month_reversed\" ) ) }", + "release_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( release_date ), \"month_reversed_padded\" ) ) }", + "release_month_reversed_padded_sanitized": "{ %sanitize( release_month_reversed_padded ) }", + "release_month_reversed_sanitized": "{ %sanitize( release_month_reversed ) }", + "release_month_sanitized": "{ %sanitize( release_month ) }", + "release_year": "{ %int( %map_get( %to_date_metadata( release_date ), \"year\" ) ) }", + "release_year_sanitized": "{ %sanitize( release_year ) }", + "release_year_truncated": "{ %int( %map_get( %to_date_metadata( release_date ), \"year_truncated\" ) ) }", + "release_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( release_date ), \"year_truncated_reversed\" ) ) }", + "release_year_truncated_reversed_sanitized": "{ %sanitize( release_year_truncated_reversed ) }", + "release_year_truncated_sanitized": "{ %sanitize( release_year_truncated ) }", + "requested_subtitles": "{ { } }", + "requested_subtitles_sanitized": "{ %sanitize( requested_subtitles ) }", + "resolution_assert": "{ %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) }", + "resolution_assert_height_gte": "{ %int(361) }", + "resolution_assert_height_gte_sanitized": "361", + "resolution_assert_ignore_titles": "{ [ ] }", + "resolution_assert_ignore_titles_sanitized": "[]", + "resolution_assert_is_ignored": "{ %print_if_true( %concat( title, \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( title, resolution_assert_ignore_titles ) ) }", + "resolution_assert_is_ignored_sanitized": "{ %sanitize( %print_if_true( %concat( title, \" has a match in resolution_assert_ignore_titles, skipping resolution assert.\" ), %contains_any( title, resolution_assert_ignore_titles ) ) ) }", + "resolution_assert_print": "{ %bool(True) }", + "resolution_assert_print_sanitized": "true", + "resolution_assert_sanitized": "{ %sanitize( %if( %and( enable_resolution_assert, %ne( height, 0 ), %not( resolution_assert_is_ignored ) ), %assert( %gte( height, resolution_assert_height_gte ), %concat( \"Entry \", title, \" downloaded at a low resolution (\", resolution_readable, \"), you've probably been throttled. \", \"Stopping further downloads, wait a few hours and try again. \", \"Disable using the override variable `enable_resolution_assert: False`.\" ) ), \"false is no-op\" ) ) }", + "resolution_readable": "{ width }x{ height }", + "resolution_readable_sanitized": "{ %sanitize( %concat( %string( width ), \"x\", %string( height ) ) ) }", + "s01_name": "", + "s01_name_sanitized": "", + "s01_url": "", + "s01_url_sanitized": "", + "season_directory_name": "Season { upload_year }", + "season_directory_name_sanitized": "{ %sanitize( %concat( \"Season \", %string( upload_year ) ) ) }", + "season_number": "{ upload_year }", + "season_number_padded": "{ upload_year }", + "season_number_padded_sanitized": "{ %sanitize( upload_year ) }", + "season_number_sanitized": "{ %sanitize( upload_year ) }", + "season_poster_file_name": "{ %sanitize( %concat( \"Season \", %string( upload_year ) ) ) }/Season{ upload_year }.jpg", + "season_poster_file_name_sanitized": "{ %sanitize( %concat( %string( %sanitize( %concat( \"Season \", %string( upload_year ) ) ) ), \"/Season\", %string( upload_year ), \".jpg\" ) ) }", + "sibling_metadata": "{ %map_get_non_empty( entry_metadata, \"sibling_metadata\", [ ] ) }", + "sibling_metadata_sanitized": "{ %sanitize( sibling_metadata ) }", + "source_count": "{ %map_get_non_empty( playlist_metadata, \"playlist_count\", 1 ) }", + "source_count_sanitized": "{ %sanitize( source_count ) }", + "source_description": "{ %map_get_non_empty( source_metadata, \"description\", playlist_description ) }", + "source_description_sanitized": "{ %sanitize( source_description ) }", + "source_index": "{ %map_get_non_empty( playlist_metadata, \"playlist_index\", 1 ) }", + "source_index_padded": "{ %pad_zero( source_index, 2 ) }", + "source_index_padded_sanitized": "{ %sanitize( source_index_padded ) }", + "source_index_sanitized": "{ %sanitize( source_index ) }", + "source_metadata": "{ %map_get_non_empty( entry_metadata, \"source_metadata\", { } ) }", + "source_metadata_sanitized": "{ %sanitize( source_metadata ) }", + "source_title": "{ %map_get_non_empty( source_metadata, \"title\", playlist_title ) }", + "source_title_sanitized": "{ %sanitize( source_title ) }", + "source_uid": "{ %map_get_non_empty( source_metadata, \"id\", playlist_uid ) }", + "source_uid_sanitized": "{ %sanitize( source_uid ) }", + "source_uploader": "{ %map_get_non_empty( source_metadata, \"uploader\", playlist_uploader ) }", + "source_uploader_id": "{ %map_get_non_empty( source_metadata, \"uploader_id\", playlist_uploader_id ) }", + "source_uploader_id_sanitized": "{ %sanitize( source_uploader_id ) }", + "source_uploader_sanitized": "{ %sanitize( source_uploader ) }", + "source_uploader_url": "{ %map_get_non_empty( source_metadata, \"uploader_url\", source_webpage_url ) }", + "source_uploader_url_sanitized": "{ %sanitize( source_uploader_url ) }", + "source_webpage_url": "{ %map_get_non_empty( source_metadata, \"webpage_url\", playlist_webpage_url ) }", + "source_webpage_url_sanitized": "{ %sanitize( source_webpage_url ) }", + "sponsorblock_chapters": "{ [ ] }", + "sponsorblock_chapters_sanitized": "{ %sanitize( sponsorblock_chapters ) }", + "subscription_array": "{ [ \"https://www.youtube.com/@novapbs\" ] }", + "subscription_array_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8@novapbs\uff02]", + "subscription_has_download_archive": "{ %bool(False) }", + "subscription_has_download_archive_sanitized": "false", + "subscription_indent_1": "Documentaries", + "subscription_indent_1_sanitized": "Documentaries", + "subscription_indent_2": "TV-14", + "subscription_indent_2_sanitized": "TV-14", + "subscription_name": "NOVA PBS", + "subscription_name_sanitized": "NOVA PBS", + "subscription_value": "https://www.youtube.com/@novapbs", + "subscription_value_1": "https://www.youtube.com/@novapbs", + "subscription_value_1_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8@novapbs", + "subscription_value_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8@novapbs", + "thumbnail_ext": "jpg", + "thumbnail_ext_sanitized": "jpg", + "thumbnail_file_name": "{ %concat( %string( %sanitize( %concat( \"Season \", %string( upload_year ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( upload_year ), \".e\", %string( %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) ), \" - \", %string( title_sanitized_plex ) ) ) ) ) }-thumb.jpg", + "thumbnail_file_name_sanitized": "{ %sanitize( %concat( %string( %concat( %string( %sanitize( %concat( \"Season \", %string( upload_year ) ) ) ), \"/\", %string( %sanitize( %concat( \"s\", %string( upload_year ), \".e\", %string( %pad_zero( %int( %concat( upload_month, upload_day_padded, upload_date_index_padded ) ), 6 ) ), \" - \", %string( title_sanitized_plex ) ) ) ) ) ), \"-thumb.jpg\" ) ) }", + "title": "{ %map_get_non_empty( entry_metadata, \"title\", uid ) }", + "title_sanitized": "{ %sanitize( title ) }", + "title_sanitized_plex": "{ %sanitize_plex_episode( title ) }", + "title_sanitized_plex_sanitized": "{ %sanitize( title_sanitized_plex ) }", + "tv_show_by_date_episode_ordering": "upload-month-day", + "tv_show_by_date_episode_ordering_sanitized": "upload-month-day", + "tv_show_by_date_ordering_pair_validation_": "{ [ %concat( upload_month, upload_day_padded, upload_date_index_padded ), 6 ] }", + "tv_show_by_date_ordering_pair_validation__sanitized": "{ %sanitize( [ %concat( upload_month, upload_day_padded, upload_date_index_padded ), 6 ] ) }", + "tv_show_by_date_season_ordering": "upload-year", + "tv_show_by_date_season_ordering_sanitized": "upload-year", + "tv_show_content_rating": "TV-14", + "tv_show_content_rating_default": "TV-14", + "tv_show_content_rating_default_sanitized": "TV-14", + "tv_show_content_rating_sanitized": "TV-14", + "tv_show_date_range_type": "upload_date", + "tv_show_date_range_type_sanitized": "upload_date", + "tv_show_directory": "tv_show_directory_path", + "tv_show_directory_sanitized": "tv_show_directory_path", + "tv_show_fanart_file_name": "fanart.jpg", + "tv_show_fanart_file_name_sanitized": "fanart.jpg", + "tv_show_genre": "Documentaries", + "tv_show_genre_default": "ytdl-sub", + "tv_show_genre_default_sanitized": "ytdl-sub", + "tv_show_genre_sanitized": "Documentaries", + "tv_show_name": "NOVA PBS", + "tv_show_name_sanitized": "NOVA PBS", + "tv_show_poster_file_name": "poster.jpg", + "tv_show_poster_file_name_sanitized": "poster.jpg", + "uid": "{ %map_get( entry_metadata, \"id\" ) }", + "uid_sanitized": "{ %sanitize( uid ) }", + "uid_sanitized_plex": "{ %sanitize_plex_episode( uid ) }", + "uid_sanitized_plex_sanitized": "{ %sanitize( uid_sanitized_plex ) }", + "upload_date": "{ %map_get_non_empty( entry_metadata, \"upload_date\", epoch_date ) }", + "upload_date_index": "{ %int( 1 ) }", + "upload_date_index_padded": "{ %pad_zero( upload_date_index, 2 ) }", + "upload_date_index_padded_sanitized": "{ %sanitize( upload_date_index_padded ) }", + "upload_date_index_reversed": "{ %sub( 100, upload_date_index ) }", + "upload_date_index_reversed_padded": "{ %pad_zero( upload_date_index_reversed, 2 ) }", + "upload_date_index_reversed_padded_sanitized": "{ %sanitize( upload_date_index_reversed_padded ) }", + "upload_date_index_reversed_sanitized": "{ %sanitize( upload_date_index_reversed ) }", + "upload_date_index_sanitized": "{ %sanitize( upload_date_index ) }", + "upload_date_sanitized": "{ %sanitize( upload_date ) }", + "upload_date_standardized": "{ %string( %map_get( %to_date_metadata( upload_date ), \"date_standardized\" ) ) }", + "upload_date_standardized_sanitized": "{ %sanitize( upload_date_standardized ) }", + "upload_day": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day\" ) ) }", + "upload_day_of_year": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day_of_year\" ) ) }", + "upload_day_of_year_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_of_year_padded\" ) ) }", + "upload_day_of_year_padded_sanitized": "{ %sanitize( upload_day_of_year_padded ) }", + "upload_day_of_year_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day_of_year_reversed\" ) ) }", + "upload_day_of_year_reversed_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_of_year_reversed_padded\" ) ) }", + "upload_day_of_year_reversed_padded_sanitized": "{ %sanitize( upload_day_of_year_reversed_padded ) }", + "upload_day_of_year_reversed_sanitized": "{ %sanitize( upload_day_of_year_reversed ) }", + "upload_day_of_year_sanitized": "{ %sanitize( upload_day_of_year ) }", + "upload_day_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_padded\" ) ) }", + "upload_day_padded_sanitized": "{ %sanitize( upload_day_padded ) }", + "upload_day_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"day_reversed\" ) ) }", + "upload_day_reversed_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"day_reversed_padded\" ) ) }", + "upload_day_reversed_padded_sanitized": "{ %sanitize( upload_day_reversed_padded ) }", + "upload_day_reversed_sanitized": "{ %sanitize( upload_day_reversed ) }", + "upload_day_sanitized": "{ %sanitize( upload_day ) }", + "upload_month": "{ %int( %map_get( %to_date_metadata( upload_date ), \"month\" ) ) }", + "upload_month_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"month_padded\" ) ) }", + "upload_month_padded_sanitized": "{ %sanitize( upload_month_padded ) }", + "upload_month_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"month_reversed\" ) ) }", + "upload_month_reversed_padded": "{ %string( %map_get( %to_date_metadata( upload_date ), \"month_reversed_padded\" ) ) }", + "upload_month_reversed_padded_sanitized": "{ %sanitize( upload_month_reversed_padded ) }", + "upload_month_reversed_sanitized": "{ %sanitize( upload_month_reversed ) }", + "upload_month_sanitized": "{ %sanitize( upload_month ) }", + "upload_year": "{ %int( %map_get( %to_date_metadata( upload_date ), \"year\" ) ) }", + "upload_year_sanitized": "{ %sanitize( upload_year ) }", + "upload_year_truncated": "{ %int( %map_get( %to_date_metadata( upload_date ), \"year_truncated\" ) ) }", + "upload_year_truncated_reversed": "{ %int( %map_get( %to_date_metadata( upload_date ), \"year_truncated_reversed\" ) ) }", + "upload_year_truncated_reversed_sanitized": "{ %sanitize( upload_year_truncated_reversed ) }", + "upload_year_truncated_sanitized": "{ %sanitize( upload_year_truncated ) }", + "uploader": "{ %map_get_non_empty( entry_metadata, \"uploader\", uploader_id ) }", + "uploader_id": "{ %map_get_non_empty( entry_metadata, \"uploader_id\", uid ) }", + "uploader_id_sanitized": "{ %sanitize( uploader_id ) }", + "uploader_sanitized": "{ %sanitize( uploader ) }", + "uploader_url": "{ %map_get_non_empty( entry_metadata, \"uploader_url\", webpage_url ) }", + "uploader_url_sanitized": "{ %sanitize( uploader_url ) }", + "url": "https://www.youtube.com/@novapbs", + "url10": "", + "url100": "", + "url100_sanitized": "", + "url10_sanitized": "", + "url11": "", + "url11_sanitized": "", + "url12": "", + "url12_sanitized": "", + "url13": "", + "url13_sanitized": "", + "url14": "", + "url14_sanitized": "", + "url15": "", + "url15_sanitized": "", + "url16": "", + "url16_sanitized": "", + "url17": "", + "url17_sanitized": "", + "url18": "", + "url18_sanitized": "", + "url19": "", + "url19_sanitized": "", + "url2": "", + "url20": "", + "url20_sanitized": "", + "url21": "", + "url21_sanitized": "", + "url22": "", + "url22_sanitized": "", + "url23": "", + "url23_sanitized": "", + "url24": "", + "url24_sanitized": "", + "url25": "", + "url25_sanitized": "", + "url26": "", + "url26_sanitized": "", + "url27": "", + "url27_sanitized": "", + "url28": "", + "url28_sanitized": "", + "url29": "", + "url29_sanitized": "", + "url2_sanitized": "", + "url3": "", + "url30": "", + "url30_sanitized": "", + "url31": "", + "url31_sanitized": "", + "url32": "", + "url32_sanitized": "", + "url33": "", + "url33_sanitized": "", + "url34": "", + "url34_sanitized": "", + "url35": "", + "url35_sanitized": "", + "url36": "", + "url36_sanitized": "", + "url37": "", + "url37_sanitized": "", + "url38": "", + "url38_sanitized": "", + "url39": "", + "url39_sanitized": "", + "url3_sanitized": "", + "url4": "", + "url40": "", + "url40_sanitized": "", + "url41": "", + "url41_sanitized": "", + "url42": "", + "url42_sanitized": "", + "url43": "", + "url43_sanitized": "", + "url44": "", + "url44_sanitized": "", + "url45": "", + "url45_sanitized": "", + "url46": "", + "url46_sanitized": "", + "url47": "", + "url47_sanitized": "", + "url48": "", + "url48_sanitized": "", + "url49": "", + "url49_sanitized": "", + "url4_sanitized": "", + "url5": "", + "url50": "", + "url50_sanitized": "", + "url51": "", + "url51_sanitized": "", + "url52": "", + "url52_sanitized": "", + "url53": "", + "url53_sanitized": "", + "url54": "", + "url54_sanitized": "", + "url55": "", + "url55_sanitized": "", + "url56": "", + "url56_sanitized": "", + "url57": "", + "url57_sanitized": "", + "url58": "", + "url58_sanitized": "", + "url59": "", + "url59_sanitized": "", + "url5_sanitized": "", + "url6": "", + "url60": "", + "url60_sanitized": "", + "url61": "", + "url61_sanitized": "", + "url62": "", + "url62_sanitized": "", + "url63": "", + "url63_sanitized": "", + "url64": "", + "url64_sanitized": "", + "url65": "", + "url65_sanitized": "", + "url66": "", + "url66_sanitized": "", + "url67": "", + "url67_sanitized": "", + "url68": "", + "url68_sanitized": "", + "url69": "", + "url69_sanitized": "", + "url6_sanitized": "", + "url7": "", + "url70": "", + "url70_sanitized": "", + "url71": "", + "url71_sanitized": "", + "url72": "", + "url72_sanitized": "", + "url73": "", + "url73_sanitized": "", + "url74": "", + "url74_sanitized": "", + "url75": "", + "url75_sanitized": "", + "url76": "", + "url76_sanitized": "", + "url77": "", + "url77_sanitized": "", + "url78": "", + "url78_sanitized": "", + "url79": "", + "url79_sanitized": "", + "url7_sanitized": "", + "url8": "", + "url80": "", + "url80_sanitized": "", + "url81": "", + "url81_sanitized": "", + "url82": "", + "url82_sanitized": "", + "url83": "", + "url83_sanitized": "", + "url84": "", + "url84_sanitized": "", + "url85": "", + "url85_sanitized": "", + "url86": "", + "url86_sanitized": "", + "url87": "", + "url87_sanitized": "", + "url88": "", + "url88_sanitized": "", + "url89": "", + "url89_sanitized": "", + "url8_sanitized": "", + "url9": "", + "url90": "", + "url90_sanitized": "", + "url91": "", + "url91_sanitized": "", + "url92": "", + "url92_sanitized": "", + "url93": "", + "url93_sanitized": "", + "url94": "", + "url94_sanitized": "", + "url95": "", + "url95_sanitized": "", + "url96": "", + "url96_sanitized": "", + "url97": "", + "url97_sanitized": "", + "url98": "", + "url98_sanitized": "", + "url99": "", + "url99_sanitized": "", + "url9_sanitized": "", + "url_sanitized": "https\uff1a\u29f8\u29f8www.youtube.com\u29f8@novapbs", + "urls": "{ [ \"https://www.youtube.com/@novapbs\" ] }", + "urls_sanitized": "[\uff02https\uff1a\u29f8\u29f8www.youtube.com\u29f8@novapbs\uff02]", + "webpage_url": "{ %map_get( entry_metadata, \"webpage_url\" ) }", + "webpage_url_sanitized": "{ %sanitize( webpage_url ) }", + "width": "{ %map_get_non_empty( entry_metadata, \"width\", 0 ) }", + "width_sanitized": "{ %sanitize( width ) }", + "ytdl_sub_chapters_from_comments": "{ %throw( \"Plugin variable ytdl_sub_chapters_from_comments has not been created yet\" ) }", + "ytdl_sub_chapters_from_comments_sanitized": "{ %sanitize( ytdl_sub_chapters_from_comments ) }", + "ytdl_sub_entry_date_eval": "{ %string( upload_date_standardized ) }", + "ytdl_sub_entry_date_eval_sanitized": "{ %sanitize( ytdl_sub_entry_date_eval ) }", + "ytdl_sub_input_url": "{ %string( '' ) }", + "ytdl_sub_input_url_count": "{ %int( 0 ) }", + "ytdl_sub_input_url_count_sanitized": "{ %sanitize( ytdl_sub_input_url_count ) }", + "ytdl_sub_input_url_index": "{ %int( -1 ) }", + "ytdl_sub_input_url_index_sanitized": "{ %sanitize( ytdl_sub_input_url_index ) }", + "ytdl_sub_input_url_sanitized": "{ %sanitize( ytdl_sub_input_url ) }" +} \ No newline at end of file diff --git a/tests/unit/config/test_subscription.py b/tests/unit/config/test_subscription.py index c48f4f0e..35942f8d 100644 --- a/tests/unit/config/test_subscription.py +++ b/tests/unit/config/test_subscription.py @@ -8,9 +8,11 @@ import pytest import yaml from ytdl_sub.config.config_file import ConfigFile +from ytdl_sub.entries.script.variable_definitions import VARIABLES from ytdl_sub.plugins.nfo_tags import NfoTagsOptions from ytdl_sub.subscriptions.subscription import Subscription from ytdl_sub.utils.exceptions import ValidationException +from ytdl_sub.utils.script import ScriptUtils @contextmanager diff --git a/tests/unit/config/test_subscription_partial_resolve.py b/tests/unit/config/test_subscription_partial_resolve.py new file mode 100644 index 00000000..0a901fec --- /dev/null +++ b/tests/unit/config/test_subscription_partial_resolve.py @@ -0,0 +1,118 @@ +from pathlib import Path + +from resources import expected_json + +from ytdl_sub.config.config_file import ConfigFile +from ytdl_sub.entries.script.variable_definitions import VARIABLES +from ytdl_sub.subscriptions.subscription import Subscription +from ytdl_sub.utils.script import ScriptUtils + + +def _ensure_partial_resolve( + sub: Subscription, preset_type: str, should_fully_resolve: bool +) -> None: + unresolvable = sub.plugins.get_all_variables( + additional_options=[sub.downloader_options, sub.output_options] + ) + unresolvable.add("entry_metadata") + unresolvable.add("sibling_metadata") + + if not should_fully_resolve: + unresolvable.update(VARIABLES.scripts().keys()) + + script = sub.overrides.script.add( + { + f"{preset_type}_directory": "tv_show_directory_path", + f"{preset_type}_directory_sanitized": "tv_show_directory_path", + } + ) + partial_script = script.resolve_partial(unresolvable=unresolvable) + + # Assert only overrides + out = { + name: ScriptUtils.to_native_script(partial_script._variables[name]) + for name in sub.overrides.keys + if not name.startswith("%") + } + + expected_out_filename = f"{preset_type}/inspect_overrides.json" + if should_fully_resolve: + expected_out_filename = f"{preset_type}/inspect_full_overrides.json" + + assert out == expected_json(out, expected_out_filename) + + # Assert all variables + out = { + name: ScriptUtils.to_native_script(partial_script._variables[name]) + for name in partial_script.variable_names + } + + expected_out_filename = f"{preset_type}/inspect_variables.json" + if should_fully_resolve: + expected_out_filename = f"{preset_type}/inspect_full_variables.json" + + assert out == expected_json(out, expected_out_filename) + + +def test_partial_resolve_tv_show(config_file: ConfigFile, tv_show_subscriptions_path: Path): + _ensure_partial_resolve( + sub=Subscription.from_file_path( + config=config_file, subscription_path=tv_show_subscriptions_path + )[0], + preset_type="tv_show", + should_fully_resolve=True, + ) + + +def test_partial_resolve_tv_show_full(config_file: ConfigFile, tv_show_subscriptions_path: Path): + _ensure_partial_resolve( + sub=Subscription.from_file_path( + config=config_file, subscription_path=tv_show_subscriptions_path + )[0], + preset_type="tv_show", + should_fully_resolve=False, + ) + + +def test_partial_resolve_music(default_config: ConfigFile, music_subscriptions_path: Path): + _ensure_partial_resolve( + sub=Subscription.from_file_path( + config=default_config, subscription_path=music_subscriptions_path + )[0], + preset_type="music", + should_fully_resolve=True, + ) + + +def test_partial_resolve_music_full(default_config: ConfigFile, music_subscriptions_path: Path): + _ensure_partial_resolve( + sub=Subscription.from_file_path( + config=default_config, subscription_path=music_subscriptions_path + )[0], + preset_type="music", + should_fully_resolve=False, + ) + + +def test_partial_resolve_music_video( + default_config: ConfigFile, music_video_subscription_path: Path +): + _ensure_partial_resolve( + sub=Subscription.from_file_path( + config=default_config, subscription_path=music_video_subscription_path + )[0], + preset_type="music_video", + should_fully_resolve=False, + ) + + +def test_partial_resolve_music_video_full( + default_config: ConfigFile, music_video_subscription_path: Path +): + _ensure_partial_resolve( + sub=Subscription.from_file_path( + config=default_config, subscription_path=music_video_subscription_path + )[0], + preset_type="music_video", + should_fully_resolve=True, + ) diff --git a/tests/unit/entries/conftest.py b/tests/unit/entries/conftest.py index 9421d35e..e3302010 100644 --- a/tests/unit/entries/conftest.py +++ b/tests/unit/entries/conftest.py @@ -65,8 +65,8 @@ def mock_entry_to_dict( "epoch": 1596878400, "epoch_date": "20200808", "epoch_hour": "09", - "title": "entry {title}", - "title_sanitized": "entry {title}", + "title": "entry {title}", + "title_sanitized": "entry {title}", "ext": ext, "description": "", "creator": "abc123", @@ -113,8 +113,8 @@ def mock_entry_to_dict( "playlist_count": 1, "playlist_max_upload_year": 2021, "playlist_max_upload_year_truncated": 21, - "playlist_title": "entry {title}", - "playlist_title_sanitized": "entry {title}", + "playlist_title": "entry {title}", + "playlist_title_sanitized": "entry {title}", "playlist_description": "", "playlist_webpage_url": "https://yourname.here", "playlist_uid": "abc123", @@ -126,15 +126,15 @@ def mock_entry_to_dict( "source_description": "", "source_index": 1, "source_index_padded": "01", - "source_title": "entry {title}", - "source_title_sanitized": "entry {title}", + "source_title": "entry {title}", + "source_title_sanitized": "entry {title}", "source_webpage_url": "https://yourname.here", "source_uid": "abc123", "source_uploader": "abc123", "source_uploader_id": "abc123", "source_uploader_url": "https://yourname.here", "uid_sanitized_plex": "abc123", - "title_sanitized_plex": "entry {title}", + "title_sanitized_plex": "entry {title}", "release_date": upload_date, "release_date_standardized": "2021-01-12", "release_year": 2021, diff --git a/tests/unit/validators/test_string_formatter_validator.py b/tests/unit/validators/test_string_formatter_validator.py index 4b2baef6..9bb4d1e0 100644 --- a/tests/unit/validators/test_string_formatter_validator.py +++ b/tests/unit/validators/test_string_formatter_validator.py @@ -115,12 +115,12 @@ class TestUnstructuredDictFormatterValidator(object): assert len(validator.dict) == 8 assert all(isinstance(val, expected_formatter_class) for val in validator.dict.values()) assert validator.dict_with_format_strings == { - "key1": "{ %concat( %string( '''string with ''' ), %string( variable ) ) }", + "key1": '{ %concat( %string( "string with " ), %string( variable ) ) }', "key2": "no variables", "key3": "{ %int(3) }", "key4": "{ %float(4.132) }", "key5": "{ %bool(True) }", - "key6": "{ { %concat( %string( variable ), %string( '''_key''' ) ): '''value''', '''static_key''': %concat( %string( variable ), %string( '''_value''' ) ) } }", - "key7": "{ [ '''list_1''', %concat( %string( '''list_''' ), %string( variable_2 ) ) ] }", - "key8": "{ %concat( %string( '''string ''' ), %string( variable1 ), %string( ''' with multiple ''' ), %string( variable2 ) ) }", + "key6": '{ { %concat( %string( variable ), %string( "_key" ) ): "value", "static_key": %concat( %string( variable ), %string( "_value" ) ) } }', + "key7": '{ [ "list_1", %concat( %string( "list_" ), %string( variable_2 ) ) ] }', + "key8": '{ %concat( %string( "string " ), %string( variable1 ), %string( " with multiple " ), %string( variable2 ) ) }', }