This commit is contained in:
Jesse Bannon 2023-03-07 15:02:12 -08:00
parent 022c24cc2c
commit 476a780834
2 changed files with 67 additions and 2 deletions

View file

@ -1,9 +1,13 @@
import argparse import argparse
from datetime import datetime
import gc import gc
import sys import sys
from pathlib import Path
from typing import List from typing import List
from typing import Tuple from typing import Tuple
from yt_dlp.utils import sanitize_filename
from ytdl_sub.cli.download_args_parser import DownloadArgsParser from ytdl_sub.cli.download_args_parser import DownloadArgsParser
from ytdl_sub.cli.main_args_parser import parser from ytdl_sub.cli.main_args_parser import parser
from ytdl_sub.config.config_file import ConfigFile from ytdl_sub.config.config_file import ConfigFile
@ -18,6 +22,18 @@ logger = Logger.get()
# Use ytdl-sub dl arguments to use the preset # Use ytdl-sub dl arguments to use the preset
_VIEW_EXTRA_ARGS_FORMATTER = "--preset _view --overrides.url {}" _VIEW_EXTRA_ARGS_FORMATTER = "--preset _view --overrides.url {}"
def _get_subscription_log_file_path(config: ConfigFile, subscription_name: str, success: bool) -> Path:
assert config.config_options.persist_logs, "persist_logs should not be None"
log_time = datetime.now().strftime("%Y-%m-%d-%H%M%S")
log_subscription_name = sanitize_filename(subscription_name).lower().replace(" ", "_")
log_success = "success" if success else "error"
log_filename = f"{log_time}.{log_subscription_name}.{log_success}.log"
persist_log_path = Path(config.config_options.persist_logs.logs_directory) / log_filename
return persist_log_path
def _download_subscriptions_from_yaml_files( def _download_subscriptions_from_yaml_files(
config: ConfigFile, args: argparse.Namespace config: ConfigFile, args: argparse.Namespace
@ -59,6 +75,10 @@ def _download_subscriptions_from_yaml_files(
output.append((subscription, transaction_log)) output.append((subscription, transaction_log))
gc.collect() # Garbage collect after each subscription download gc.collect() # Garbage collect after each subscription download
if config.config_options.persist_logs:
FileHandler.copy(Logger.debug_log_filename(), )
Logger.cleanup() # Cleanup logger after each successful subscription download Logger.cleanup() # Cleanup logger after each successful subscription download
return output return output

View file

@ -3,13 +3,14 @@ from typing import Dict
from typing import Optional from typing import Optional
from mergedeep import mergedeep from mergedeep import mergedeep
from yt_dlp.utils import datetime_from_str
from ytdl_sub.prebuilt_presets import PREBUILT_PRESETS from ytdl_sub.prebuilt_presets import PREBUILT_PRESETS
from ytdl_sub.utils.system import IS_WINDOWS from ytdl_sub.utils.system import IS_WINDOWS
from ytdl_sub.validators.file_path_validators import FFmpegFileValidator from ytdl_sub.validators.file_path_validators import FFmpegFileValidator
from ytdl_sub.validators.file_path_validators import FFprobeFileValidator from ytdl_sub.validators.file_path_validators import FFprobeFileValidator
from ytdl_sub.validators.strict_dict_validator import StrictDictValidator from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
from ytdl_sub.validators.validators import LiteralDictValidator from ytdl_sub.validators.validators import LiteralDictValidator, BoolValidator
from ytdl_sub.validators.validators import StringValidator from ytdl_sub.validators.validators import StringValidator
if IS_WINDOWS: if IS_WINDOWS:
@ -21,10 +22,46 @@ else:
_DEFAULT_FFMPEG_PATH = "/usr/bin/ffmpeg" _DEFAULT_FFMPEG_PATH = "/usr/bin/ffmpeg"
_DEFAULT_FFPROBE_PATH = "/usr/bin/ffprobe" _DEFAULT_FFPROBE_PATH = "/usr/bin/ffprobe"
class PersistLogsValidator(StrictDictValidator):
_required_keys = {"logs_directory"}
_optional_keys = {"keep_logs_after", "keep_successful_logs"}
def __init__(self, name: str, value: Any):
super().__init__(name, value)
self._logs_directory = self._validate_key(
key="logs_directory", validator=StringValidator
)
self._keep_logs_after: Optional[str] = None
if keep_logs_validator := self._validate_key_if_present(
key="keep_logs_after", validator=StringValidator
):
try:
self._keep_logs_after = datetime_from_str(keep_logs_validator.value)
except Exception as exc:
raise self._validation_exception(f"Invalid datetime string: {str(exc)}")
self._keep_successful_logs = self._validate_key(
key="keep_successful_logs", validator=BoolValidator, default=True
)
@property
def logs_directory(self) -> str:
return self._logs_directory.value
@property
def keep_logs_after(self) -> Optional[str]:
return self._keep_logs_after
@property
def keep_successful_logs(self) -> bool:
return self._keep_successful_logs.value
class ConfigOptions(StrictDictValidator): class ConfigOptions(StrictDictValidator):
_required_keys = {"working_directory"} _required_keys = {"working_directory"}
_optional_keys = {"umask", "dl_aliases", "lock_directory", "ffmpeg_path", "ffprobe_path"} _optional_keys = {"umask", "dl_aliases", "persist_logs", "lock_directory", "ffmpeg_path", "ffprobe_path"}
def __init__(self, name: str, value: Any): def __init__(self, name: str, value: Any):
super().__init__(name, value) super().__init__(name, value)
@ -38,6 +75,9 @@ class ConfigOptions(StrictDictValidator):
self._dl_aliases = self._validate_key_if_present( self._dl_aliases = self._validate_key_if_present(
key="dl_aliases", validator=LiteralDictValidator key="dl_aliases", validator=LiteralDictValidator
) )
self._persist_logs = self._validate_key_if_present(
key="persist_logs", validator=PersistLogsValidator
)
self._lock_directory = self._validate_key( self._lock_directory = self._validate_key(
key="lock_directory", validator=StringValidator, default=_DEFAULT_LOCK_DIRECTORY key="lock_directory", validator=StringValidator, default=_DEFAULT_LOCK_DIRECTORY
) )
@ -93,6 +133,11 @@ class ConfigOptions(StrictDictValidator):
return self._dl_aliases.dict return self._dl_aliases.dict
return {} return {}
@property
def persist_logs(self) -> Optional[PersistLogsValidator]:
# TODO: nested docstring???
return self._persist_logs
@property @property
def lock_directory(self) -> str: def lock_directory(self) -> str:
""" """