From d4ca763adbd78ce6c83bf937556432de30022869 Mon Sep 17 00:00:00 2001 From: arabcoders Date: Mon, 28 Apr 2025 18:15:11 +0300 Subject: [PATCH] reverted some changes to logging --- app/library/DownloadQueue.py | 6 ++-- app/library/LogWrapper.py | 54 ++++++------------------------------ app/library/Utils.py | 46 ++++++++++++++---------------- 3 files changed, 33 insertions(+), 73 deletions(-) diff --git a/app/library/DownloadQueue.py b/app/library/DownloadQueue.py index afeabb02..6edc4add 100644 --- a/app/library/DownloadQueue.py +++ b/app/library/DownloadQueue.py @@ -410,6 +410,7 @@ class DownloadQueue(metaclass=Singleton): "callback": { "func": lambda _, msg: logs.append(msg), "level": logging.WARNING, + "name": "callback-logger", }, **YTDLPOpts.get_instance() .preset(name=item.preset, with_cookies=not item.cookies) @@ -462,9 +463,8 @@ class DownloadQueue(metaclass=Singleton): if not entry: return {"status": "error", "msg": "Unable to extract info." + "\n".join(logs)} - LOG.debug( - f"extract_info: for 'URL: {item.url}' is done in '{time.perf_counter() - started}'. Length: '{len(entry)}/keys'." - ) + end_time = time.perf_counter() - started + LOG.debug(f"extract_info: for 'URL: {item.url}' is done in '{end_time:.3f}'. Length: '{len(entry)}/keys'.") except yt_dlp.utils.ExistingVideoReached as exc: LOG.error(f"Video has been downloaded already and recorded in archive.log file. '{exc!s}'.") return {"status": "error", "msg": "Video has been downloaded already and recorded in archive.log file."} diff --git a/app/library/LogWrapper.py b/app/library/LogWrapper.py index d27e3155..2f19a9fb 100644 --- a/app/library/LogWrapper.py +++ b/app/library/LogWrapper.py @@ -1,8 +1,9 @@ import logging -import weakref from collections.abc import Callable from dataclasses import dataclass +LOG = logging.getLogger(__name__) + @dataclass(kw_only=True) class LogTarget: @@ -19,7 +20,7 @@ class LogTarget: """ name: str | None = None - target: logging.Logger|Callable + target: logging.Logger | Callable level: int logger: bool @@ -63,70 +64,33 @@ class LogWrapper: def __init__(self): self.targets: list[LogTarget] = [] - weakref.finalize(self, LogWrapper.cleanup, self) - def add_target(self, target: logging.Logger | Callable, level: int = logging.DEBUG): + def add_target(self, target: logging.Logger | Callable, level: int = logging.DEBUG, name: str | None = None): """ Adds a new logging target with the specified logging level. Args: target (logging.Logger|Callable): The logging target, which can be a logging.Logger instance or a Callable. level (int): The logging level for the target. Defaults to logging.DEBUG. + name (str|None): The name of the logging target. Defaults to None. """ if not isinstance(target, logging.Logger | Callable): msg = "Target must be a logging.Logger instance or a callable." raise TypeError(msg) + if name is None: + name = target.name if isinstance(target, logging.Logger) else target.__name__ + self.targets.append( LogTarget( - name=target.name if isinstance(target, logging.Logger) else None, + name=name, target=target, level=level, logger=isinstance(target, logging.Logger), ) ) - def cleanup(self, name: str = "yt-dlp"): - """ - Remove automatic handlers - - Args: - name (str): The name of the logger to clean up. Defaults to "ytdlp". - - """ - mgr = logging.root.manager - to_drop = [] - - for tgt in list(self.targets): - # only consider real Logger targets whose name - if tgt.logger and tgt.name and tgt.name.startswith(name): - name = tgt.name - logger = tgt.target - - # 1) detach all handlers. - for h in list(logger.handlers): - logger.removeHandler(h) - - # 2) restore default logger settings - logger.propagate = True - logger.setLevel(logging.NOTSET) - - # 3) purge logger & its children from the internal registry - for key in [k for k in mgr.loggerDict if k == name or k.startswith(name + ".")]: - mgr.loggerDict.pop(key, None) - - to_drop.append(tgt) - - # drop those targets from our wrapper - self.targets = [t for t in self.targets if t not in to_drop] - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, tb): - self.cleanup() - def has_targets(self): """ Checks if there are any logging targets added. diff --git a/app/library/Utils.py b/app/library/Utils.py index 78d5e5a9..0f5ee00f 100644 --- a/app/library/Utils.py +++ b/app/library/Utils.py @@ -109,7 +109,7 @@ def extract_info( no_archive: bool = False, follow_redirect: bool = False, sanitize_info: bool = False, - **kwargs, + **kwargs, # noqa: ARG001 ) -> dict: """ Extracts video information from the given URL. @@ -127,9 +127,6 @@ def extract_info( dict: Video information. """ - is_recursive = bool(kwargs.get("log_wrapper")) - log_wrapper = kwargs.get("log_wrapper") or LogWrapper() - params: dict = { **config, "color": "no_color", @@ -149,32 +146,32 @@ def extract_info( else: params["quiet"] = True - if not is_recursive: - archive_id = None - idDict = get_archive_id(url=url) - if idDict.get("id"): - archive_id = f".{idDict['id']}" + log_wrapper = LogWrapper() + idDict = get_archive_id(url=url) + archive_id = f".{idDict['id']}" if idDict.get("id") else None - _logger = logging.getLogger(f"yt-dlp{archive_id}") - _logger.propagate = False - log_wrapper.add_target(target=_logger, level=logging.DEBUG if debug else logging.WARNING) + log_wrapper.add_target( + target=logging.getLogger(f"yt-dlp{archive_id}"), + level=logging.DEBUG if debug else logging.WARNING, + ) - if "callback" in params: - if isinstance(params["callback"], dict): - log_wrapper.add_target( - target=params["callback"]["func"], - level=params["callback"]["level"] or logging.ERROR, - ) - else: - log_wrapper.add_target(target=params["callback"], level=logging.ERROR) + if "callback" in params: + if isinstance(params["callback"], dict): + log_wrapper.add_target( + target=params["callback"]["func"], + level=params["callback"]["level"] or logging.ERROR, + name=params["callback"]["name"] or "callback", + ) + else: + log_wrapper.add_target(target=params["callback"], level=logging.ERROR, name="callback") + + if "callback" in params: + del params["callback"] if log_wrapper.has_targets(): - if "logger" in params and not is_recursive: + if "logger" in params: log_wrapper.add_target(target=params["logger"], level=logging.DEBUG) - if "callback" in params: - del params["callback"] - params["logger"] = log_wrapper if no_archive and "download_archive" in params: @@ -190,7 +187,6 @@ def extract_info( no_archive=no_archive, follow_redirect=follow_redirect, sanitize_info=sanitize_info, - log_wrapper=log_wrapper, ) if not data: