integration working

This commit is contained in:
Jesse Bannon 2023-12-07 22:48:19 -08:00
parent 32bcc157ac
commit a7dcf49e00
6 changed files with 43 additions and 43 deletions

View file

@ -10,7 +10,12 @@ from ytdl_sub.config.overrides import Overrides
from ytdl_sub.config.preset_options import OptionsDictValidator from ytdl_sub.config.preset_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 as v
from ytdl_sub.entries.script.variable_scripts import VARIABLE_SCRIPTS
from ytdl_sub.entries.variables.kwargs import DOWNLOAD_INDEX
from ytdl_sub.entries.variables.kwargs import UPLOAD_DATE_INDEX
from ytdl_sub.utils.exceptions import ValidationException from ytdl_sub.utils.exceptions import ValidationException
from ytdl_sub.utils.file_handler import FileHandler from ytdl_sub.utils.file_handler import FileHandler
from ytdl_sub.utils.file_handler import get_file_extension from ytdl_sub.utils.file_handler import get_file_extension
@ -104,8 +109,22 @@ class InfoJsonDownloader(SourcePlugin[InfoJsonDownloaderOptions]):
# unless it is filtered # unless it is filtered
for entry in entries: for entry in entries:
self._enhanced_download_archive.mapping.remove_entry(entry.uid) self._enhanced_download_archive.mapping.remove_entry(entry.uid)
prior_variables = entry.kwargs_get(YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY, {})
for entry in sorted(entries, key=lambda ent: ent.download_index): entry.add(
{
v.download_index.variable_name: prior_variables.get(
v.download_index.variable_name,
VARIABLE_SCRIPTS[v.download_index.variable_name],
),
v.upload_date_index.variable_name: prior_variables.get(
v.upload_date_index.variable_name,
VARIABLE_SCRIPTS[v.upload_date_index.variable_name],
),
}
)
for entry in sorted(entries, key=lambda ent: ent.get(v.download_index)):
yield entry yield entry
# If the original entry file_path is no longer maintained in the new mapping, then # If the original entry file_path is no longer maintained in the new mapping, then

View file

@ -320,36 +320,6 @@ class BaseEntry(BaseEntryVariables, ABC):
""" """
return str(Path(self.working_directory()) / self.get_download_info_json_name()) return str(Path(self.working_directory()) / self.get_download_info_json_name())
def _added_variables(self) -> Dict[str, str]:
"""
Returns
-------
Dict of variables added to this entry
"""
return self._additional_variables
@classmethod
def source_variables(cls) -> List[str]:
"""
Returns
-------
List of all source variables
"""
property_names = [prop for prop in dir(cls) if isinstance(getattr(cls, prop), property)]
return property_names
@final
def to_dict(self) -> Dict[str, str]:
"""
Returns
-------
Dictionary containing all variables
"""
source_variable_dict = {
source_var: getattr(self, source_var) for source_var in self.source_variables()
}
return dict(source_variable_dict, **self._added_variables())
@final @final
def to_type(self, entry_type: Type[TBaseEntry]) -> TBaseEntry: def to_type(self, entry_type: Type[TBaseEntry]) -> TBaseEntry:
""" """

View file

@ -13,6 +13,8 @@ from ytdl_sub.utils.scriptable import Scriptable
from ytdl_sub.validators.audo_codec_validator import AUDIO_CODEC_EXTS from ytdl_sub.validators.audo_codec_validator import AUDIO_CODEC_EXTS
from ytdl_sub.validators.audo_codec_validator import VIDEO_CODEC_EXTS from ytdl_sub.validators.audo_codec_validator import VIDEO_CODEC_EXTS
YTDL_SUB_ENTRY_VARIABLES_KWARG_KEY: str = "ytdl_sub_entry_variables"
class Entry(BaseEntry, Scriptable): class Entry(BaseEntry, Scriptable):
""" """
@ -136,3 +138,12 @@ class Entry(BaseEntry, Scriptable):
break break
return file_exists return file_exists
@final
def to_dict(self) -> Dict[str, str]:
"""
Returns
-------
Dictionary containing all variables
"""
return self.script.resolve().as_native()

View file

@ -1,5 +1,6 @@
from typing import Dict from typing import Dict
from typing import Optional from typing import Optional
from typing import Set
import mergedeep import mergedeep
@ -132,6 +133,7 @@ ENTRY_DEFAULT_VARIABLES: Dict[MetadataVariable, str] = {
ENTRY_INJECTED_VARIABLES: Dict[Variable, str] = { ENTRY_INJECTED_VARIABLES: Dict[Variable, str] = {
v.download_index: "{%int(1)}", v.download_index: "{%int(1)}",
v.upload_date_index: "{%int(1)}", v.upload_date_index: "{%int(1)}",
v.playlist_max_upload_year: f"{{{v.upload_year.variable_name}}}",
} }
ENTRY_DERIVED_VARIABLES: Dict[Variable, str] = { ENTRY_DERIVED_VARIABLES: Dict[Variable, str] = {
@ -202,10 +204,6 @@ PLAYLIST_VARIABLES: Dict[Variable, str] = {
v.playlist_uploader_url: playlist_get(v.playlist_uploader_url, v.playlist_webpage_url), v.playlist_uploader_url: playlist_get(v.playlist_uploader_url, v.playlist_webpage_url),
} }
PLAYLIST_INJECTED_VARIABLES: Dict[Variable, str] = {
v.playlist_max_upload_year: playlist_get_int(v.playlist_max_upload_year, v.upload_year)
}
PLAYLIST_DERIVED_VARIABLES: Dict[Variable, str] = { PLAYLIST_DERIVED_VARIABLES: Dict[Variable, str] = {
v.playlist_title_sanitized: sanitized(v.playlist_title), v.playlist_title_sanitized: sanitized(v.playlist_title),
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)}}",
@ -247,7 +245,6 @@ mergedeep.merge(
ENTRY_UPLOAD_DATE_VARIABLES, ENTRY_UPLOAD_DATE_VARIABLES,
ENTRY_RELEASE_DATE_VARIABLES, ENTRY_RELEASE_DATE_VARIABLES,
PLAYLIST_VARIABLES, PLAYLIST_VARIABLES,
PLAYLIST_INJECTED_VARIABLES,
PLAYLIST_DERIVED_VARIABLES, PLAYLIST_DERIVED_VARIABLES,
SOURCE_VARIABLES, SOURCE_VARIABLES,
SOURCE_DERIVED_VARIABLES, SOURCE_DERIVED_VARIABLES,
@ -256,5 +253,6 @@ 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}
CustomFunctions.register() CustomFunctions.register()

View file

@ -22,6 +22,7 @@ from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
from ytdl_sub.validators.string_formatter_validators import ListFormatterValidator from ytdl_sub.validators.string_formatter_validators import ListFormatterValidator
from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator
from ytdl_sub.validators.validators import BoolValidator from ytdl_sub.validators.validators import BoolValidator
from ytdl_sub.validators.validators import DictValidator
logger = Logger.get(name="regex") logger = Logger.get(name="regex")
@ -112,11 +113,7 @@ class VariableRegex(StrictDictValidator):
return self._capture_group_defaults is not None return self._capture_group_defaults is not None
class FromSourceVariablesRegex(StrictDictValidator): class FromSourceVariablesRegex(DictValidator):
_optional_keys = Entry.source_variables()
_allow_extra_keys = True
def __init__(self, name, value): def __init__(self, name, value):
super().__init__(name, value) super().__init__(name, value)
self.variable_capture_dict: Dict[str, VariableRegex] = { self.variable_capture_dict: Dict[str, VariableRegex] = {

View file

@ -1,9 +1,12 @@
import copy
import json import json
from abc import ABC from abc import ABC
from typing import Any from typing import Any
from typing import Dict from typing import Dict
from typing import Set from typing import Set
from ytdl_sub.entries.script.variable_scripts import ENTRY_INJECTED_VARIABLES
from ytdl_sub.entries.script.variable_scripts import UNRESOLVED_VARIABLES
from ytdl_sub.entries.script.variable_scripts import VARIABLE_SCRIPTS from ytdl_sub.entries.script.variable_scripts import VARIABLE_SCRIPTS
from ytdl_sub.script.script import Script from ytdl_sub.script.script import Script
@ -29,8 +32,8 @@ class Scriptable(ABC):
return f"{{{json.dumps(value)}}}" return f"{{{json.dumps(value)}}}"
def __init__(self): def __init__(self):
self.script = Script(VARIABLE_SCRIPTS) self.script = Script(copy.deepcopy(VARIABLE_SCRIPTS))
self.unresolvable: Set[str] = set() self.unresolvable: Set[str] = copy.deepcopy(UNRESOLVED_VARIABLES)
def update_script(self) -> None: def update_script(self) -> None:
self.script.resolve(unresolvable=self.unresolvable, update=True) self.script.resolve(unresolvable=self.unresolvable, update=True)
@ -41,4 +44,6 @@ class Scriptable(ABC):
{name: self.to_script(value) for name, value in values.items()} {name: self.to_script(value) for name, value in values.items()}
) )
) )
self.unresolvable -= set(list(values.keys()))
self.script.resolve(unresolvable=self.unresolvable, update=True) self.script.resolve(unresolvable=self.unresolvable, update=True)