refactor(download): remove ProviderCore/download.py, move sanitize_filename to SYS.utils, replace callers to use API.HTTP.HTTPClient
This commit is contained in:
64
API/HTTP.py
64
API/HTTP.py
@@ -20,7 +20,7 @@ from pathlib import Path
|
||||
from urllib.parse import unquote, urlparse, parse_qs
|
||||
import logging
|
||||
|
||||
from SYS.logger import debug, log
|
||||
from SYS.logger import debug, is_debug_enabled, log
|
||||
from SYS.models import DebugLogger, DownloadError, DownloadMediaResult, ProgressBar
|
||||
from SYS.utils import ensure_directory, sha256_file
|
||||
|
||||
@@ -51,8 +51,11 @@ def _resolve_verify_value(verify_ssl: bool) -> Union[bool, str]:
|
||||
return env_cert
|
||||
|
||||
def _try_module_bundle(mod_name: str) -> Optional[str]:
|
||||
# Prefer checking sys.modules first (helps test injection / monkeypatching)
|
||||
try:
|
||||
mod = __import__(mod_name)
|
||||
mod = sys.modules.get(mod_name)
|
||||
if mod is None:
|
||||
mod = __import__(mod_name)
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
@@ -178,6 +181,28 @@ class HTTPClient:
|
||||
|
||||
self._httpx_verify = _resolve_verify_value(verify_ssl)
|
||||
|
||||
# Debug helpers
|
||||
def _debug_panel(self, title: str, rows: List[tuple[str, Any]]) -> None:
|
||||
if not is_debug_enabled():
|
||||
return
|
||||
try:
|
||||
from rich.table import Table
|
||||
from rich.panel import Panel
|
||||
|
||||
grid = Table.grid(padding=(0, 1))
|
||||
grid.add_column("Key", style="cyan", no_wrap=True)
|
||||
grid.add_column("Value")
|
||||
for key, val in rows:
|
||||
try:
|
||||
grid.add_row(str(key), str(val))
|
||||
except Exception:
|
||||
grid.add_row(str(key), "<unprintable>")
|
||||
|
||||
debug(Panel(grid, title=title, expand=False))
|
||||
except Exception:
|
||||
# Fallback to simple debug output
|
||||
debug(title, rows)
|
||||
|
||||
def __enter__(self):
|
||||
"""Context manager entry."""
|
||||
self._client = httpx.Client(
|
||||
@@ -425,8 +450,33 @@ class HTTPClient:
|
||||
last_exception = None
|
||||
|
||||
for attempt in range(self.retries):
|
||||
self._debug_panel(
|
||||
"HTTP request",
|
||||
[
|
||||
("method", method),
|
||||
("url", url),
|
||||
("attempt", f"{attempt + 1}/{self.retries}"),
|
||||
("params", kwargs.get("params")),
|
||||
("headers", kwargs.get("headers")),
|
||||
("verify", self._httpx_verify),
|
||||
("follow_redirects", kwargs.get("follow_redirects", False)),
|
||||
],
|
||||
)
|
||||
try:
|
||||
response = self._client.request(method, url, **kwargs)
|
||||
self._debug_panel(
|
||||
"HTTP response",
|
||||
[
|
||||
("method", method),
|
||||
("url", url),
|
||||
("status", getattr(response, "status_code", "")),
|
||||
("elapsed", getattr(response, "elapsed", "")),
|
||||
(
|
||||
"content_length",
|
||||
response.headers.get("content-length") if hasattr(response, "headers") else "",
|
||||
),
|
||||
],
|
||||
)
|
||||
if raise_for_status:
|
||||
response.raise_for_status()
|
||||
return response
|
||||
@@ -537,6 +587,16 @@ class HTTPClient:
|
||||
else:
|
||||
kwargs["headers"] = self._get_headers()
|
||||
|
||||
self._debug_panel(
|
||||
"HTTP stream",
|
||||
[
|
||||
("method", method),
|
||||
("url", url),
|
||||
("headers", kwargs.get("headers")),
|
||||
("follow_redirects", kwargs.get("follow_redirects", False)),
|
||||
],
|
||||
)
|
||||
|
||||
return self._client.stream(method, url, **kwargs)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user