clean entry

This commit is contained in:
Jesse Bannon 2023-12-10 10:35:27 -08:00
parent 148e73fdde
commit 3cc2d0755d
8 changed files with 38 additions and 43 deletions

View file

@ -109,10 +109,7 @@ class InfoJsonDownloader(SourcePlugin[InfoJsonDownloaderOptions]):
prior_variables = entry.kwargs(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] del entry._kwargs[YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY]
entry.initialize_script( entry.initialize_script(self.overrides).add(
override_variables=self.overrides.dict_with_format_strings,
unresolvable=self.overrides.unresolvable,
).add(
{ {
inj.variable_name: prior_variables.get( inj.variable_name: prior_variables.get(
inj.variable_name, inj.variable_name,

View file

@ -459,10 +459,7 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
for entry in self._iterate_entries( for entry in self._iterate_entries(
url_validator=collection_url, parents=parents, orphans=orphan_entries url_validator=collection_url, parents=parents, orphans=orphan_entries
): ):
entry.initialize_script( entry.initialize_script(self.overrides).add(
override_variables=self.overrides.dict_with_format_strings,
unresolvable=self.overrides.unresolvable,
).add(
{ {
v.ytdl_sub_input_url.variable_name: self.overrides.apply_formatter( v.ytdl_sub_input_url.variable_name: self.overrides.apply_formatter(
collection_url.url collection_url.url

View file

@ -30,28 +30,20 @@ class Entry(BaseEntry, Scriptable):
BaseEntry.__init__(self, entry_dict=entry_dict, working_directory=working_directory) BaseEntry.__init__(self, entry_dict=entry_dict, working_directory=working_directory)
Scriptable.__init__(self) Scriptable.__init__(self)
def initialize_script( def _add_entry_kwargs_to_script(self) -> None:
self, override_variables: Dict[str, str], unresolvable: Set[str] # Add entry metadata, but avoid the `.add()` helper since it also adds sanitized
) -> "Entry": self.unresolvable.remove(VARIABLES.entry_metadata.variable_name)
self.script.add({VARIABLES.entry_metadata.variable_name: f"{{{json.dumps(self._kwargs)}}}"})
self.update_script()
def initialize_script(self, other: Optional[Scriptable] = None) -> "Entry":
# TODO: CLEAN THIS SHIT UP # TODO: CLEAN THIS SHIT UP
# Overrides contains added variables that are unresolvable, add them here # Overrides contains added variables that are unresolvable, add them here
self.unresolvable |= unresolvable if other:
self.script = copy.deepcopy(other.script)
self.unresolvable = copy.deepcopy(other.unresolvable)
# Remove the entry variable self._add_entry_kwargs_to_script()
self.unresolvable.remove(VARIABLES.entry_metadata.variable_name)
# Add entry metadata, but avoid the `.add()` helper since it also adds sanitized
self.script.add({VARIABLES.entry_metadata.variable_name: f"{{{json.dumps(self._kwargs)}}}"})
self.script.add(
{
unresolved: f"{{%throw('Variable {unresolved} has not been resolved yet')}}"
for unresolved in self.unresolvable
}
)
# use .add here to get sanitized
self.add(override_variables)
self.update_script()
return self return self
def get(self, variable: Variable, expected_type: Type[TType]) -> TType: def get(self, variable: Variable, expected_type: Type[TType]) -> TType:

View file

@ -60,7 +60,7 @@ class EntryParent(BaseEntry):
parents = [self] parents = [self]
kwargs_to_add: Dict[str, Any] = { kwargs_to_add: Dict[str, Any] = {
v.sibling_entry_metadata.metadata_key: self._sibling_entry_metadata() v.sibling_metadata.metadata_key: self._sibling_entry_metadata()
} }
if len(parents) >= 1: if len(parents) >= 1:
kwargs_to_add[v.playlist_metadata.metadata_key] = parents[-1]._kwargs kwargs_to_add[v.playlist_metadata.metadata_key] = parents[-1]._kwargs

View file

@ -56,8 +56,8 @@ class _Variables:
return RelativeMetadata("source_metadata", metadata_key="source_metadata") return RelativeMetadata("source_metadata", metadata_key="source_metadata")
@property @property
def sibling_entry_metadata(self) -> SiblingMetadata: def sibling_metadata(self) -> SiblingMetadata:
return SiblingMetadata("sibling_entry_metadata", metadata_key="sibling_entry_metadata") return SiblingMetadata("sibling_metadata", metadata_key="sibling_metadata")
@property @property
def uid(self) -> MetadataVariable: def uid(self) -> MetadataVariable:

View file

@ -118,7 +118,7 @@ ENTRY_HARDCODED_VARIABLES: Dict[Variable, str] = {
ENTRY_RELATIVE_VARIABLES: Dict[MetadataVariable, str] = { ENTRY_RELATIVE_VARIABLES: Dict[MetadataVariable, str] = {
v.playlist_metadata: entry_get(v.playlist_metadata, {}), v.playlist_metadata: entry_get(v.playlist_metadata, {}),
v.source_metadata: entry_get(v.source_metadata, {}), v.source_metadata: entry_get(v.source_metadata, {}),
v.sibling_entry_metadata: entry_get(v.sibling_entry_metadata, "{ [] }"), v.sibling_metadata: entry_get(v.sibling_metadata, []),
} }
ENTRY_REQUIRED_VARIABLES: Dict[MetadataVariable, str] = { ENTRY_REQUIRED_VARIABLES: Dict[MetadataVariable, str] = {
@ -279,6 +279,18 @@ mergedeep.merge(
VARIABLE_SCRIPTS: Dict[str, str] = { VARIABLE_SCRIPTS: Dict[str, str] = {
var.variable_name: script for var, script in _VARIABLE_SCRIPTS.items() var.variable_name: script for var, script in _VARIABLE_SCRIPTS.items()
} }
UNRESOLVED_VARIABLES: Set[str] = {var.variable_name for var in ENTRY_INJECTED_VARIABLES}
def _keys(*variables: Dict[Variable, str]) -> Set[str]:
keys: Set[str] = set()
for variable_set in variables:
keys.update(set(var.variable_name for var in variable_set.keys()))
return keys
UNRESOLVED_VARIABLES: Set[str] = _keys(
ENTRY_EMPTY_METADATA,
ENTRY_INJECTED_VARIABLES,
)
CustomFunctions.register() CustomFunctions.register()

View file

@ -178,7 +178,4 @@ def mock_entry_kwargs(
@pytest.fixture @pytest.fixture
def mock_entry(mock_entry_kwargs): def mock_entry(mock_entry_kwargs):
return Entry(entry_dict=mock_entry_kwargs, working_directory=".").initialize_script( return Entry(entry_dict=mock_entry_kwargs, working_directory=".").initialize_script()
override_variables={},
unresolvable=set(),
)

View file

@ -7,7 +7,11 @@ from ytdl_sub.entries.script.variable_definitions import VARIABLES as v
class TestEntry(object): 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):
out = mock_entry.to_dict() out = mock_entry.to_dict()
del out["entry_metadata"] del out[v.entry_metadata.variable_name]
del out[v.ytdl_sub_input_url.variable_name]
del out[v.playlist_metadata.variable_name]
del out[v.source_metadata.variable_name]
del out[v.sibling_metadata.variable_name]
assert out == mock_entry_to_dict assert out == mock_entry_to_dict
def test_entry_missing_kwarg(self, mock_entry): def test_entry_missing_kwarg(self, mock_entry):
@ -37,9 +41,7 @@ class TestEntry(object):
): ):
mock_entry_kwargs["upload_date"] = upload_date mock_entry_kwargs["upload_date"] = upload_date
entry = Entry(entry_dict=mock_entry_kwargs, working_directory=".").initialize_script( entry = Entry(entry_dict=mock_entry_kwargs, working_directory=".").initialize_script()
override_variables={}, unresolvable=set()
)
assert entry.get_int(v.upload_year_truncated_reversed) == year_rev assert entry.get_int(v.upload_year_truncated_reversed) == year_rev
assert entry.get_int(v.upload_month_reversed) == month_rev assert entry.get_int(v.upload_month_reversed) == month_rev
assert entry.get_int(v.upload_day_reversed) == day_rev assert entry.get_int(v.upload_day_reversed) == day_rev
@ -57,9 +59,7 @@ class TestEntry(object):
self, mock_entry_kwargs, upload_date, day_year, day_year_rev, day_year_pad, day_year_rev_pad self, mock_entry_kwargs, upload_date, day_year, day_year_rev, day_year_pad, day_year_rev_pad
): ):
mock_entry_kwargs["upload_date"] = upload_date mock_entry_kwargs["upload_date"] = upload_date
entry = Entry(entry_dict=mock_entry_kwargs, working_directory=".").initialize_script( entry = Entry(entry_dict=mock_entry_kwargs, working_directory=".").initialize_script()
override_variables={}, unresolvable=set()
)
assert entry.get_int(v.upload_day_of_year) == day_year assert entry.get_int(v.upload_day_of_year) == day_year
assert entry.get_int(v.upload_day_of_year_reversed) == day_year_rev assert entry.get_int(v.upload_day_of_year_reversed) == day_year_rev