This commit is contained in:
Jesse Bannon 2023-12-07 17:16:12 -08:00
parent 4a7685f284
commit 5cc09d3385
5 changed files with 30 additions and 11 deletions

View file

@ -74,14 +74,14 @@ class _Variables:
return Variable("uid_sanitized_plex") return Variable("uid_sanitized_plex")
@property @property
def ie_key(self) -> MetadataVariable: def extractor_key(self) -> MetadataVariable:
""" """
Returns Returns
------- -------
str str
The info-extractor key The info-extractor key
""" """
return MetadataVariable(metadata_key="ie_key", variable_name="ie_key") return MetadataVariable(metadata_key="extractor_key", variable_name="extractor_key")
@property @property
def extractor(self) -> MetadataVariable: def extractor(self) -> MetadataVariable:

View file

@ -40,11 +40,11 @@ def _get_internal(
# TODO: assert with good error message if key DNE # TODO: assert with good error message if key DNE
out = f"%map_get({metadata.variable_name}, '{key.metadata_key}')" out = f"%map_get({metadata.variable_name}, '{key.metadata_key}')"
elif isinstance(default, Variable): elif isinstance(default, Variable):
out = f"%map_get({metadata.variable_name}, '{key.metadata_key}', {default.variable_name})" out = f"%map_get_non_empty({metadata.variable_name}, '{key.metadata_key}', {default.variable_name})"
elif isinstance(default, str): elif isinstance(default, str):
out = f"%map_get({metadata.variable_name}, '{key.metadata_key}', '{default}')" out = f"%map_get_non_empty({metadata.variable_name}, '{key.metadata_key}', '{default}')"
else: else:
out = f"%map_get({metadata.variable_name}, '{key.metadata_key}', {default})" out = f"%map_get_non_empty({metadata.variable_name}, '{key.metadata_key}', {default})"
return f"%legacy_bracket_safety({out})" return f"%legacy_bracket_safety({out})"
@ -107,7 +107,7 @@ ENTRY_HARDCODED_VARIABLES: Dict[Variable, str] = {
ENTRY_REQUIRED_VARIABLES: Dict[MetadataVariable, str] = { ENTRY_REQUIRED_VARIABLES: Dict[MetadataVariable, str] = {
v.uid: entry_get(v.uid), v.uid: entry_get(v.uid),
v.ie_key: entry_get(v.ie_key), v.extractor_key: entry_get(v.extractor_key),
v.epoch: entry_get_int(v.epoch), v.epoch: entry_get_int(v.epoch),
v.webpage_url: entry_get(v.webpage_url), v.webpage_url: entry_get(v.webpage_url),
v.ext: entry_get(v.ext), v.ext: entry_get(v.ext),
@ -116,7 +116,7 @@ ENTRY_REQUIRED_VARIABLES: Dict[MetadataVariable, str] = {
ENTRY_DEFAULT_VARIABLES: Dict[MetadataVariable, str] = { ENTRY_DEFAULT_VARIABLES: Dict[MetadataVariable, str] = {
v.playlist_index: playlist_get_int(v.playlist_index, 1), v.playlist_index: playlist_get_int(v.playlist_index, 1),
v.title: entry_get(v.title, v.uid), v.title: entry_get(v.title, v.uid),
v.extractor: entry_get(v.extractor, v.ie_key), v.extractor: entry_get(v.extractor, v.extractor_key),
v.description: entry_get(v.description, ""), v.description: entry_get(v.description, ""),
v.uploader_id: entry_get(v.uploader_id, v.uid), v.uploader_id: entry_get(v.uploader_id, v.uid),
v.uploader: entry_get(v.uploader, v.uploader_id), v.uploader: entry_get(v.uploader, v.uploader_id),

View file

@ -8,6 +8,7 @@ from ytdl_sub.script.types.resolvable import Hashable
from ytdl_sub.script.types.resolvable import Integer from ytdl_sub.script.types.resolvable import Integer
from ytdl_sub.script.types.resolvable import LambdaThree from ytdl_sub.script.types.resolvable import LambdaThree
from ytdl_sub.script.types.resolvable import LambdaTwo from ytdl_sub.script.types.resolvable import LambdaTwo
from ytdl_sub.script.types.resolvable import String
from ytdl_sub.script.utils.exceptions import KeyDoesNotExistRuntimeException from ytdl_sub.script.utils.exceptions import KeyDoesNotExistRuntimeException
@ -27,6 +28,17 @@ class MapFunctions:
) )
return mapping.value[key] return mapping.value[key]
@staticmethod
def map_get_non_empty(mapping: Map, key: Hashable, default: AnyArgument) -> AnyArgument:
"""
Return ``key``'s value within the Map. If ``key`` does not exist or is an empty string,
return ``default``. Otherwise, will error.
"""
output = MapFunctions.map_get(mapping, key, default)
if isinstance(output, String) and output.value == "":
return default
return output
@staticmethod @staticmethod
def map_contains(mapping: Map, key: Hashable) -> Boolean: def map_contains(mapping: Map, key: Hashable) -> Boolean:
""" """

View file

@ -113,11 +113,15 @@ def _is_breakable(char: str) -> bool:
def _is_boolean_true(string: Optional[str]) -> bool: def _is_boolean_true(string: Optional[str]) -> bool:
return string == "True" return string and string.lower() == "true"
def _is_boolean_false(string: Optional[str]) -> bool: def _is_boolean_false(string: Optional[str]) -> bool:
return string == "False" return string and string.lower() == "false"
def _is_null(string: Optional[str]) -> bool:
return string and string.lower() == "null"
def _is_custom_function_argument_start(char: str) -> bool: def _is_custom_function_argument_start(char: str) -> bool:
@ -306,6 +310,9 @@ class _Parser:
if _is_boolean_false(self._read(increment_pos=False, length=5)): if _is_boolean_false(self._read(increment_pos=False, length=5)):
self._pos += 5 self._pos += 5
return Boolean(value=False) return Boolean(value=False)
if _is_null(self._read(increment_pos=False, length=4)):
self._pos += 4
return String(value="")
if _is_string_start(self._read(increment_pos=False)): if _is_string_start(self._read(increment_pos=False)):
return self._parse_string() return self._parse_string()
if self._read(increment_pos=False) == "[": if self._read(increment_pos=False) == "[":
@ -528,7 +535,7 @@ class _Parser:
self._ast.append(self._parse_variable()) self._ast.append(self._parse_variable())
elif _is_numeric_start(ch1): elif _is_numeric_start(ch1):
raise NUMERICS_ONLY_ARGS raise NUMERICS_ONLY_ARGS
elif _is_string_start(ch1): elif _is_string_start(ch1) or _is_null(self._read(increment_pos=False, length=4)):
raise STRINGS_ONLY_ARGS raise STRINGS_ONLY_ARGS
elif _is_boolean_true( elif _is_boolean_true(
self._read(increment_pos=False, length=4) self._read(increment_pos=False, length=4)

View file

@ -5,5 +5,5 @@ class TestEntry(object):
def test_entry_to_dict(self, mock_entry, mock_entry_to_dict): def test_entry_to_dict(self, mock_entry, mock_entry_to_dict):
output = mock_entry.script.resolve().as_native() output = mock_entry.script.resolve().as_native()
del output[VARIABLES.entry_metadata.variable_name] del output[VARIABLES.entry_metadata.variable_name]
del output[VARIABLES.ie_key.variable_name] del output[VARIABLES.extractor_key.variable_name]
assert output == mock_entry_to_dict assert output == mock_entry_to_dict