fdf
This commit is contained in:
107
CLI.py
107
CLI.py
@@ -31,7 +31,6 @@ if not os.environ.get("MM_DEBUG"):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
import httpx
|
||||
import json
|
||||
import shlex
|
||||
import sys
|
||||
@@ -58,6 +57,16 @@ from SYS.rich_display import (
|
||||
stderr_console,
|
||||
stdout_console,
|
||||
)
|
||||
from cmdnat._status_shared import (
|
||||
add_startup_check as _shared_add_startup_check,
|
||||
default_provider_ping_targets as _default_provider_ping_targets,
|
||||
has_provider as _has_provider,
|
||||
has_store_subtype as _has_store_subtype,
|
||||
has_tool as _has_tool,
|
||||
ping_first as _ping_first,
|
||||
ping_url as _ping_url,
|
||||
provider_display_name as _provider_display_name,
|
||||
)
|
||||
|
||||
|
||||
def _install_rich_traceback(*, show_locals: bool = False) -> None:
|
||||
@@ -1858,10 +1867,6 @@ Come to love it when others take what you share, as there is no greater joy
|
||||
startup_table._interactive(True)._perseverance(True)
|
||||
startup_table.set_value_case("upper")
|
||||
|
||||
def _upper(value: Any) -> str:
|
||||
text = "" if value is None else str(value)
|
||||
return text.upper()
|
||||
|
||||
def _add_startup_check(
|
||||
status: str,
|
||||
name: str,
|
||||
@@ -1871,50 +1876,15 @@ Come to love it when others take what you share, as there is no greater joy
|
||||
files: int | str | None = None,
|
||||
detail: str = "",
|
||||
) -> None:
|
||||
row = startup_table.add_row()
|
||||
row.add_column("STATUS", _upper(status))
|
||||
row.add_column("NAME", _upper(name))
|
||||
row.add_column("PROVIDER", _upper(provider or ""))
|
||||
row.add_column("STORE", _upper(store or ""))
|
||||
row.add_column("FILES", "" if files is None else str(files))
|
||||
row.add_column("DETAIL", _upper(detail or ""))
|
||||
|
||||
def _has_store_subtype(cfg: dict, subtype: str) -> bool:
|
||||
store_cfg = cfg.get("store")
|
||||
if not isinstance(store_cfg, dict):
|
||||
return False
|
||||
bucket = store_cfg.get(subtype)
|
||||
if not isinstance(bucket, dict):
|
||||
return False
|
||||
return any(isinstance(v, dict) and bool(v) for v in bucket.values())
|
||||
|
||||
def _has_provider(cfg: dict, name: str) -> bool:
|
||||
provider_cfg = cfg.get("provider")
|
||||
if not isinstance(provider_cfg, dict):
|
||||
return False
|
||||
block = provider_cfg.get(str(name).strip().lower())
|
||||
return isinstance(block, dict) and bool(block)
|
||||
|
||||
def _has_tool(cfg: dict, name: str) -> bool:
|
||||
tool_cfg = cfg.get("tool")
|
||||
if not isinstance(tool_cfg, dict):
|
||||
return False
|
||||
block = tool_cfg.get(str(name).strip().lower())
|
||||
return isinstance(block, dict) and bool(block)
|
||||
|
||||
def _ping_url(url: str, timeout: float = 3.0) -> tuple[bool, str]:
|
||||
try:
|
||||
from API.HTTP import HTTPClient
|
||||
|
||||
with HTTPClient(timeout=timeout, retries=1) as client:
|
||||
resp = client.get(url, allow_redirects=True)
|
||||
code = int(getattr(resp, "status_code", 0) or 0)
|
||||
ok = 200 <= code < 500
|
||||
return ok, f"{url} (HTTP {code})"
|
||||
except httpx.TimeoutException:
|
||||
return False, f"{url} (timeout)"
|
||||
except Exception as exc:
|
||||
return False, f"{url} ({type(exc).__name__})"
|
||||
_shared_add_startup_check(
|
||||
startup_table,
|
||||
status,
|
||||
name,
|
||||
provider=provider,
|
||||
store=store,
|
||||
files=files,
|
||||
detail=detail,
|
||||
)
|
||||
|
||||
config = self._config_loader.load()
|
||||
debug_enabled = bool(config.get("debug", False))
|
||||
@@ -2015,47 +1985,8 @@ Come to love it when others take what you share, as there is no greater joy
|
||||
file_availability = list_file_providers(config) or {}
|
||||
meta_availability = list_metadata_providers(config) or {}
|
||||
|
||||
def _provider_display_name(key: str) -> str:
|
||||
k = (key or "").strip()
|
||||
low = k.lower()
|
||||
if low == "openlibrary":
|
||||
return "OpenLibrary"
|
||||
if low == "alldebrid":
|
||||
return "AllDebrid"
|
||||
if low == "youtube":
|
||||
return "YouTube"
|
||||
return k[:1].upper() + k[1:] if k else "Provider"
|
||||
|
||||
already_checked = {"matrix"}
|
||||
|
||||
def _default_provider_ping_targets(provider_key: str) -> list[str]:
|
||||
prov = (provider_key or "").strip().lower()
|
||||
if prov == "openlibrary":
|
||||
return ["https://openlibrary.org"]
|
||||
if prov == "youtube":
|
||||
return ["https://www.youtube.com"]
|
||||
if prov == "bandcamp":
|
||||
return ["https://bandcamp.com"]
|
||||
if prov == "libgen":
|
||||
from Provider.libgen import MIRRORS
|
||||
|
||||
mirrors = [
|
||||
str(x).rstrip("/") for x in (MIRRORS or [])
|
||||
if str(x).strip()
|
||||
]
|
||||
return [m + "/json.php" for m in mirrors]
|
||||
return []
|
||||
|
||||
def _ping_first(urls: list[str]) -> tuple[bool, str]:
|
||||
for u in urls:
|
||||
ok, detail = _ping_url(u)
|
||||
if ok:
|
||||
return True, detail
|
||||
if urls:
|
||||
ok, detail = _ping_url(urls[0])
|
||||
return ok, detail
|
||||
return False, "No ping target"
|
||||
|
||||
for provider_name in provider_cfg.keys():
|
||||
prov = str(provider_name or "").strip().lower()
|
||||
if not prov or prov in already_checked:
|
||||
|
||||
Reference in New Issue
Block a user