From 59e61ba077d1c716585e9c819d6d5e7b07e8532c Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Thu, 2 Jul 2026 02:54:38 +0200 Subject: [PATCH] refactor: centralize progress reporters, default user-agent, improve error propagation and aria2 fetch usage --- core/progress.py | 21 +++++++++++++++ core/sources/civarchive.py | 25 +++--------------- core/sources/civitai.py | 37 +++++---------------------- core/sources/huggingface.py | 18 ++----------- core/sources/lora_manager_archive.py | 18 ++----------- core/type_utils.py | 8 ++++++ web/resolver/resolver_dialog.js | 4 ++- web/resolver/views/options_methods.js | 19 +++----------- 8 files changed, 50 insertions(+), 100 deletions(-) diff --git a/core/progress.py b/core/progress.py index 423bc5c..2cc62b4 100644 --- a/core/progress.py +++ b/core/progress.py @@ -41,3 +41,24 @@ def report_progress( progress_callback(payload) except Exception as e: log.debug(f"{error_context} failed: {e}") + + +def get_progress_reporter(error_context: str) -> Callable[[Optional[Callable[[Dict[str, Any]], None]], str, str, Optional[float]], None]: + """Return a closure for reporting progress with a pre-configured error context.""" + def reporter( + progress_callback: Optional[Callable[[Dict[str, Any]], None]], + stage: str, + message: str, + percent: Optional[float] = None, + **extra: Any, + ) -> None: + report_progress( + progress_callback, + stage, + message, + percent, + error_context=error_context, + **extra, + ) + return reporter + diff --git a/core/sources/civarchive.py b/core/sources/civarchive.py index 4ce19fd..33a9036 100644 --- a/core/sources/civarchive.py +++ b/core/sources/civarchive.py @@ -29,8 +29,9 @@ from ..type_utils import ( select_primary_model_file, parse_size_to_bytes, get_version_sort_key, + DEFAULT_BROWSER_USER_AGENT, ) -from ..progress import report_progress +from ..progress import report_progress, get_progress_reporter from ..log_system.log_funcs import create_module_logger log = create_module_logger(__name__) @@ -57,11 +58,7 @@ _download_size_cache: Dict[str, Optional[int]] = {} REQUEST_HEADERS = { "accept": "application/json,text/html;q=0.9,*/*;q=0.8", - "user-agent": ( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/147.0.0.0 Safari/537.36" - ), + "user-agent": DEFAULT_BROWSER_USER_AGENT, } # Imported CIVARCHIVE_API_TYPE_MAP @@ -77,21 +74,7 @@ def clear_search_cache(): _download_size_cache.clear() -def _report_progress( - progress_callback: Optional[Callable[[Dict[str, Any]], None]], - stage: str, - message: str, - percent: Optional[float] = None, - **extra: Any, -) -> None: - report_progress( - progress_callback, - stage, - message, - percent, - error_context="CivArchive progress callback", - **extra, - ) +_report_progress = get_progress_reporter("CivArchive progress callback") def is_civarchive_available() -> bool: diff --git a/core/sources/civitai.py b/core/sources/civitai.py index 8f7b130..c130f22 100644 --- a/core/sources/civitai.py +++ b/core/sources/civitai.py @@ -27,8 +27,9 @@ from ..type_utils import ( parse_size_to_bytes, get_version_sort_key, check_credential_http, + DEFAULT_BROWSER_USER_AGENT, ) -from ..progress import report_progress +from ..progress import report_progress, get_progress_reporter from ..path_utils import calculate_file_sha256 from ..log_system.log_funcs import create_module_logger log = create_module_logger(__name__) @@ -57,21 +58,7 @@ def clear_search_cache(): _hash_cache.clear() -def _report_progress( - progress_callback: Optional[Callable[[Dict[str, Any]], None]], - stage: str, - message: str, - percent: Optional[float] = None, - **extra: Any, -) -> None: - report_progress( - progress_callback, - stage, - message, - percent, - error_context="CivitAI progress callback", - **extra, - ) +_report_progress = get_progress_reporter("CivitAI progress callback") def check_civitai_session_token(session_token: Optional[str]) -> Dict[str, Any]: @@ -88,11 +75,7 @@ def check_civitai_session_token(session_token: Optional[str]) -> Dict[str, Any]: headers = { "accept": "application/json", "Cookie": f"__Secure-civitai-token={token}", - "user-agent": ( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/147.0.0.0 Safari/537.36" - ), + "user-agent": DEFAULT_BROWSER_USER_AGENT, } def get_user(data): @@ -121,11 +104,7 @@ def check_civitai_api_key(api_key: Optional[str]) -> Dict[str, Any]: headers = { "accept": "application/json", "Authorization": f"Bearer {key}", - "user-agent": ( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/147.0.0.0 Safari/537.36" - ), + "user-agent": DEFAULT_BROWSER_USER_AGENT, } def get_user(data): @@ -419,11 +398,7 @@ def _search_civitai_trpc_candidates( "accept": "application/json", "content-type": "application/json", "referer": f"https://civitai.red/models?query={quote(filename)}", - "user-agent": ( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/147.0.0.0 Safari/537.36" - ), + "user-agent": DEFAULT_BROWSER_USER_AGENT, "x-client": "web", "x-client-version": "5.0.1657", } diff --git a/core/sources/huggingface.py b/core/sources/huggingface.py index 9f77593..31d94f5 100644 --- a/core/sources/huggingface.py +++ b/core/sources/huggingface.py @@ -13,7 +13,7 @@ import requests from typing import Dict, Any, Optional, List, Callable from urllib.parse import urlparse, quote -from ..progress import report_progress +from ..progress import report_progress, get_progress_reporter from ..log_system.log_funcs import create_module_logger log = create_module_logger(__name__) @@ -46,21 +46,7 @@ def clear_search_cache(): _author_index_cache.clear() -def _report_progress( - progress_callback: Optional[Callable[[Dict[str, Any]], None]], - stage: str, - message: str, - percent: Optional[float] = None, - **extra: Any, -) -> None: - report_progress( - progress_callback, - stage, - message, - percent, - error_context="HuggingFace progress callback", - **extra, - ) +_report_progress = get_progress_reporter("HuggingFace progress callback") def check_huggingface_token(token: Optional[str]) -> Dict[str, Any]: diff --git a/core/sources/lora_manager_archive.py b/core/sources/lora_manager_archive.py index ff38abe..d3c2fcd 100644 --- a/core/sources/lora_manager_archive.py +++ b/core/sources/lora_manager_archive.py @@ -19,7 +19,7 @@ from ..matcher import ( calculate_candidate_rank, ) from ..type_utils import select_primary_model_file -from ..progress import report_progress +from ..progress import report_progress, get_progress_reporter from ..log_system.log_funcs import create_module_logger log = create_module_logger(__name__) @@ -54,21 +54,7 @@ def clear_search_cache(): _db_path_cache = None -def _report_progress( - progress_callback: Optional[Callable[[Dict[str, Any]], None]], - stage: str, - message: str, - percent: Optional[float] = None, - **extra: Any, -) -> None: - report_progress( - progress_callback, - stage, - message, - percent, - error_context="LoRA Manager archive progress callback", - **extra, - ) +_report_progress = get_progress_reporter("LoRA Manager archive progress callback") def get_lora_manager_archive_db_path() -> Optional[str]: diff --git a/core/type_utils.py b/core/type_utils.py index 296e1c4..804016c 100644 --- a/core/type_utils.py +++ b/core/type_utils.py @@ -449,6 +449,14 @@ def format_size_bytes(bytes_value: Any, include_space: bool = True) -> Optional[ return f"{val:.1f}{space}{sizes[i]}" +DEFAULT_BROWSER_USER_AGENT = ( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/147.0.0.0 Safari/537.36" +) + + + diff --git a/web/resolver/resolver_dialog.js b/web/resolver/resolver_dialog.js index b4dd3d1..e43fa25 100644 --- a/web/resolver/resolver_dialog.js +++ b/web/resolver/resolver_dialog.js @@ -249,7 +249,9 @@ export class ResolverManagerDialog extends ComfyDialog { errorMsg = errData.error; } } catch (_) {} - throw new Error(errorMsg); + const error = new Error(errorMsg); + error.status = response.status; + throw error; } if (response.status === 204) { return null; diff --git a/web/resolver/views/options_methods.js b/web/resolver/views/options_methods.js index 8f70647..5602fbf 100644 --- a/web/resolver/views/options_methods.js +++ b/web/resolver/views/options_methods.js @@ -1081,22 +1081,11 @@ export const optionsMethods = { }; const requestAria2Control = async (endpoint, { method = 'POST', body = {} } = {}) => { - const response = await api.fetchApi(endpoint, { + return this.fetchJson(endpoint, { method, - headers: { 'Content-Type': 'application/json' }, - ...(method === 'POST' ? { body: JSON.stringify(body) } : {}) - }); - if (!response.ok) { - let errorMsg = `Server returned ${response.status}: ${response.statusText}`; - try { - const errData = await response.json(); - if (errData?.error) errorMsg = errData.error; - } catch (_) { } - const error = new Error(errorMsg); - error.status = response.status; - throw error; - } - return response.json(); + ...(method === 'POST' ? { body: JSON.stringify(body) } : {}), + silent: true + }, 'Aria2 Control'); }; const startAria2 = async () => {