cleaning up entry internals

This commit is contained in:
Jesse Bannon 2023-12-13 16:38:00 -08:00
parent 4382591748
commit 25d9b1b69c
5 changed files with 22 additions and 21 deletions

View file

@ -10,7 +10,6 @@ from ytdl_sub.config.overrides import Overrides
from ytdl_sub.config.validators.options import OptionsDictValidator from ytdl_sub.config.validators.options import OptionsDictValidator
from ytdl_sub.downloaders.source_plugin import SourcePlugin from ytdl_sub.downloaders.source_plugin import SourcePlugin
from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder
from ytdl_sub.entries.entry import YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY
from ytdl_sub.entries.entry import Entry from ytdl_sub.entries.entry import Entry
from ytdl_sub.entries.script.variable_definitions import VARIABLES from ytdl_sub.entries.script.variable_definitions import VARIABLES
from ytdl_sub.entries.script.variable_definitions import VariableDefinitions from ytdl_sub.entries.script.variable_definitions import VariableDefinitions
@ -107,10 +106,7 @@ class InfoJsonDownloader(SourcePlugin[InfoJsonDownloaderOptions]):
# See if prior variables exist. If so, delete them from metadata # See if prior variables exist. If so, delete them from metadata
# to avoid saving them recursively on multiple updates # to avoid saving them recursively on multiple updates
prior_variables = {} prior_variables = entry.maybe_get_prior_variables()
if entry.kwargs_contains(YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY):
prior_variables = entry.kwargs(YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY)
del entry._kwargs[YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY]
entry.initialize_script(self.overrides).add( entry.initialize_script(self.overrides).add(
{ {

View file

@ -80,26 +80,17 @@ class BaseEntry(ABC):
""" """
return self.kwargs_get(v.uploader_id.metadata_key, self.uid) return self.kwargs_get(v.uploader_id.metadata_key, self.uid)
def kwargs_contains(self, key: str) -> bool:
"""Returns whether internal kwargs contains the specified key"""
return key in self._kwargs
def kwargs(self, key) -> Any: def kwargs(self, key) -> Any:
"""Returns an internal kwarg value supplied from ytdl""" """Returns an internal kwarg value supplied from ytdl"""
if not self.kwargs_contains(key): if key not in self._kwargs:
raise KeyError(f"Expected '{key}' in {self.__class__.__name__} but does not exist.") raise KeyError(f"Expected '{key}' in {self.__class__.__name__} but does not exist.")
output = self._kwargs[key] return self._kwargs[key]
# Replace curly braces with unicode version to avoid variable shenanigans
if isinstance(output, str):
return output.replace("{", "").replace("}", "")
return output
def kwargs_get(self, key: str, default: Optional[Any] = None) -> Any: def kwargs_get(self, key: str, default: Optional[Any] = None) -> Any:
""" """
Dict get on kwargs Dict get on kwargs
""" """
if not self.kwargs_contains(key) or self.kwargs(key) is None: if key not in self._kwargs or self.kwargs(key) is None:
return default return default
return self.kwargs(key) return self.kwargs(key)

View file

@ -2,6 +2,7 @@ import copy
import json import json
import os import os
from pathlib import Path from pathlib import Path
from typing import Any
from typing import Dict from typing import Dict
from typing import Optional from typing import Optional
from typing import Type from typing import Type
@ -20,7 +21,7 @@ from ytdl_sub.validators.audo_codec_validator import VIDEO_CODEC_EXTS
v: VariableDefinitions = VARIABLES v: VariableDefinitions = VARIABLES
YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY: str = "ytdl_sub_entry_variables" _YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY: str = "ytdl_sub_entry_variables"
TypeT = TypeVar("TypeT") TypeT = TypeVar("TypeT")
@ -131,7 +132,7 @@ class Entry(BaseEntry, Scriptable):
Write the entry's _kwargs back into the info.json file as well as its source variables Write the entry's _kwargs back into the info.json file as well as its source variables
""" """
kwargs_dict = copy.deepcopy(self._kwargs) kwargs_dict = copy.deepcopy(self._kwargs)
kwargs_dict["ytdl_sub_entry_variables"] = self.to_dict() kwargs_dict[_YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY] = self.to_dict()
kwargs_json = json.dumps(kwargs_dict, ensure_ascii=False, sort_keys=True, indent=2) kwargs_json = json.dumps(kwargs_dict, ensure_ascii=False, sort_keys=True, indent=2)
with open(self.get_download_info_json_path(), "w", encoding="utf-8") as file: with open(self.get_download_info_json_path(), "w", encoding="utf-8") as file:
@ -174,6 +175,18 @@ class Entry(BaseEntry, Scriptable):
return file_exists return file_exists
def maybe_get_prior_variables(self) -> Dict[str, Any]:
"""
If variables exist in the .info.json from a prior run, delete them
from kwargs (to prevent nested writes) and return them
"""
maybe_prior_variables: Dict[str, Any] = {}
if _YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY in self._kwargs:
maybe_prior_variables = self._kwargs[_YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY]
del self._kwargs[_YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY]
return maybe_prior_variables
@final @final
def to_dict(self) -> Dict[str, str]: def to_dict(self) -> Dict[str, str]:
""" """

View file

@ -163,7 +163,9 @@ ENTRY_DERIVED_VARIABLES: Dict[Variable, str] = {
v.upload_date_index_padded: _pad_int(v.upload_date_index, 2), v.upload_date_index_padded: _pad_int(v.upload_date_index, 2),
v.upload_date_index_reversed: f"{{%sub(100, {v.upload_date_index.variable_name})}}", v.upload_date_index_reversed: f"{{%sub(100, {v.upload_date_index.variable_name})}}",
v.upload_date_index_reversed_padded: _pad_int(v.upload_date_index_reversed, 2), v.upload_date_index_reversed_padded: _pad_int(v.upload_date_index_reversed, 2),
v.playlist_index_reversed: f"{{%sub({v.playlist_count.variable_name}, {v.playlist_index.variable_name}, -1)}}", v.playlist_index_reversed: (
f"{{%sub({v.playlist_count.variable_name}, {v.playlist_index.variable_name}, -1)}}"
),
v.playlist_index_padded: _pad_int(v.playlist_index, 2), v.playlist_index_padded: _pad_int(v.playlist_index, 2),
v.playlist_index_reversed_padded: _pad_int(v.playlist_index_reversed, 2), v.playlist_index_reversed_padded: _pad_int(v.playlist_index_reversed, 2),
v.playlist_index_padded6: _pad_int(v.playlist_index, 6), v.playlist_index_padded6: _pad_int(v.playlist_index, 6),

View file

@ -19,7 +19,6 @@ class TestEntry(object):
key = "dne" key = "dne"
expected_error_msg = f"Expected '{key}' in Entry but does not exist." expected_error_msg = f"Expected '{key}' in Entry but does not exist."
assert mock_entry.kwargs_contains(key) is False
with pytest.raises(KeyError, match=expected_error_msg): with pytest.raises(KeyError, match=expected_error_msg):
mock_entry.kwargs(key) mock_entry.kwargs(key)