huge refactor of the entire codebase, with the goal of improving maintainability, readability, and extensibility. This commit includes changes to almost every file in the project, including:
This commit is contained in:
@@ -59,13 +59,9 @@ from SYS.rich_display import (
|
||||
)
|
||||
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,
|
||||
collect_plugin_startup_checks as _collect_plugin_startup_checks,
|
||||
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,
|
||||
)
|
||||
|
||||
|
||||
@@ -98,12 +94,12 @@ from SYS.cmdlet_catalog import (
|
||||
list_cmdlet_metadata,
|
||||
list_cmdlet_names,
|
||||
)
|
||||
from SYS.config import load_config
|
||||
from SYS.config import load_config, resolve_cookies_path
|
||||
from SYS.result_table import Table
|
||||
|
||||
from SYS.worker import WorkerManagerRegistry, WorkerStages, WorkerOutputMirror, WorkerStageSession
|
||||
from SYS.pipeline import PipelineExecutor
|
||||
from ProviderCore.registry import provider_inline_query_choices
|
||||
from ProviderCore.registry import plugin_inline_query_choices
|
||||
|
||||
|
||||
|
||||
@@ -507,25 +503,25 @@ class CmdletIntrospection:
|
||||
if backends:
|
||||
return backends
|
||||
|
||||
if normalized_arg == "provider":
|
||||
if normalized_arg == "plugin":
|
||||
canonical_cmd = (cmd_name or "").replace("_", "-").lower()
|
||||
try:
|
||||
from ProviderCore.registry import list_search_providers, list_file_providers
|
||||
from ProviderCore.registry import list_search_plugins, list_upload_plugins
|
||||
except Exception:
|
||||
list_search_providers = None # type: ignore
|
||||
list_file_providers = None # type: ignore
|
||||
list_search_plugins = None # type: ignore
|
||||
list_upload_plugins = None # type: ignore
|
||||
|
||||
provider_choices: List[str] = []
|
||||
|
||||
if canonical_cmd in {"add-file"} and list_file_providers is not None:
|
||||
providers = list_file_providers(config) or {}
|
||||
if canonical_cmd in {"add-file"} and list_upload_plugins is not None:
|
||||
providers = list_upload_plugins(config) or {}
|
||||
available = [
|
||||
name for name, is_ready in providers.items() if is_ready
|
||||
]
|
||||
return sorted(available) if available else sorted(providers.keys())
|
||||
|
||||
if list_search_providers is not None:
|
||||
providers = list_search_providers(config) or {}
|
||||
if list_search_plugins is not None:
|
||||
providers = list_search_plugins(config) or {}
|
||||
available = [
|
||||
name for name, is_ready in providers.items() if is_ready
|
||||
]
|
||||
@@ -680,7 +676,7 @@ class CmdletCompleter(Completer):
|
||||
|
||||
provider_name = None
|
||||
if cmd_name == "search-file":
|
||||
provider_name = self._flag_value(stage_tokens, "-provider", "--provider")
|
||||
provider_name = self._flag_value(stage_tokens, "-plugin", "--plugin")
|
||||
|
||||
if (
|
||||
cmd_name == "search-file"
|
||||
@@ -705,7 +701,7 @@ class CmdletCompleter(Completer):
|
||||
field, partial = inline_token.split(":", 1)
|
||||
field = field.strip().lower()
|
||||
partial_lower = partial.strip().lower()
|
||||
inline_choices = provider_inline_query_choices(provider_name, field, config)
|
||||
inline_choices = plugin_inline_query_choices(provider_name, field, config)
|
||||
if inline_choices:
|
||||
filtered = (
|
||||
[c for c in inline_choices if partial_lower in str(c).lower()]
|
||||
@@ -728,7 +724,7 @@ class CmdletCompleter(Completer):
|
||||
if choices:
|
||||
choice_list = choices
|
||||
normalized_prev = prev_token.lstrip("-").strip().lower()
|
||||
if normalized_prev == "provider" and current_token:
|
||||
if normalized_prev in {"plugin", "provider"} and current_token:
|
||||
current_lower = current_token.lower()
|
||||
filtered = [c for c in choices if current_lower in c.lower()]
|
||||
if filtered:
|
||||
@@ -1996,188 +1992,13 @@ Come to love it when others take what you share, as there is no greater joy
|
||||
) if isinstance(config,
|
||||
dict) else None
|
||||
if isinstance(provider_cfg, dict) and provider_cfg:
|
||||
from Provider.metadata_provider import list_metadata_providers
|
||||
from ProviderCore.registry import (
|
||||
list_file_providers,
|
||||
list_providers,
|
||||
list_search_providers,
|
||||
)
|
||||
|
||||
provider_availability = list_providers(config) or {}
|
||||
search_availability = list_search_providers(config) or {}
|
||||
file_availability = list_file_providers(config) or {}
|
||||
meta_availability = list_metadata_providers(config) or {}
|
||||
|
||||
already_checked = {"matrix"}
|
||||
|
||||
for provider_name in provider_cfg.keys():
|
||||
prov = str(provider_name or "").strip().lower()
|
||||
if not prov or prov in already_checked:
|
||||
continue
|
||||
display = _provider_display_name(prov)
|
||||
|
||||
if prov == "alldebrid":
|
||||
try:
|
||||
from Provider.alldebrid import _get_debrid_api_key
|
||||
from API.alldebrid import AllDebridClient
|
||||
|
||||
api_key = _get_debrid_api_key(config)
|
||||
if not api_key:
|
||||
_add_startup_check(
|
||||
"DISABLED",
|
||||
display,
|
||||
provider=prov,
|
||||
detail="Not configured"
|
||||
)
|
||||
else:
|
||||
client = AllDebridClient(api_key)
|
||||
base_url = str(
|
||||
getattr(client,
|
||||
"base_url",
|
||||
"") or ""
|
||||
).strip()
|
||||
_add_startup_check(
|
||||
"ENABLED",
|
||||
display,
|
||||
provider=prov,
|
||||
detail=base_url or "Connected",
|
||||
)
|
||||
except Exception as exc:
|
||||
_add_startup_check(
|
||||
"DISABLED",
|
||||
display,
|
||||
provider=prov,
|
||||
detail=str(exc)
|
||||
)
|
||||
continue
|
||||
|
||||
is_known = False
|
||||
ok_val: Optional[bool] = None
|
||||
if prov in provider_availability:
|
||||
is_known = True
|
||||
ok_val = bool(provider_availability.get(prov))
|
||||
elif prov in search_availability:
|
||||
is_known = True
|
||||
ok_val = bool(search_availability.get(prov))
|
||||
elif prov in file_availability:
|
||||
is_known = True
|
||||
ok_val = bool(file_availability.get(prov))
|
||||
elif prov in meta_availability:
|
||||
is_known = True
|
||||
ok_val = bool(meta_availability.get(prov))
|
||||
|
||||
if not is_known:
|
||||
_add_startup_check(
|
||||
"UNKNOWN",
|
||||
display,
|
||||
provider=prov,
|
||||
detail="Not registered"
|
||||
)
|
||||
else:
|
||||
detail = "Configured" if ok_val else "Not configured"
|
||||
ping_targets = _default_provider_ping_targets(prov)
|
||||
if ping_targets:
|
||||
ping_ok, ping_detail = _ping_first(ping_targets)
|
||||
if ok_val:
|
||||
detail = ping_detail
|
||||
else:
|
||||
detail = (
|
||||
(detail + " | " +
|
||||
ping_detail) if ping_detail else detail
|
||||
)
|
||||
_add_startup_check(
|
||||
"ENABLED" if ok_val else "DISABLED",
|
||||
display,
|
||||
provider=prov,
|
||||
detail=detail,
|
||||
)
|
||||
|
||||
already_checked.add(prov)
|
||||
|
||||
default_search_providers = [
|
||||
"openlibrary",
|
||||
"libgen",
|
||||
"youtube",
|
||||
"bandcamp"
|
||||
]
|
||||
for prov in default_search_providers:
|
||||
if prov in already_checked:
|
||||
continue
|
||||
display = _provider_display_name(prov)
|
||||
ok_val = (
|
||||
bool(search_availability.get(prov))
|
||||
if prov in search_availability else False
|
||||
)
|
||||
ping_targets = _default_provider_ping_targets(prov)
|
||||
ping_ok, ping_detail = (
|
||||
_ping_first(ping_targets) if ping_targets else (False, "No ping target")
|
||||
)
|
||||
detail = ping_detail or (
|
||||
"Available" if ok_val else "Unavailable"
|
||||
)
|
||||
if not ok_val:
|
||||
detail = "Unavailable" + (
|
||||
f" | {ping_detail}" if ping_detail else ""
|
||||
)
|
||||
for check in _collect_plugin_startup_checks(config):
|
||||
_add_startup_check(
|
||||
"ENABLED" if (ok_val and ping_ok) else "DISABLED",
|
||||
display,
|
||||
provider=prov,
|
||||
detail=detail,
|
||||
)
|
||||
already_checked.add(prov)
|
||||
|
||||
if "0x0" not in already_checked:
|
||||
ok_val = (
|
||||
bool(file_availability.get("0x0"))
|
||||
if "0x0" in file_availability else False
|
||||
)
|
||||
ping_ok, ping_detail = _ping_url("https://0x0.st")
|
||||
detail = ping_detail
|
||||
if not ok_val:
|
||||
detail = "Unavailable" + (
|
||||
f" | {ping_detail}" if ping_detail else ""
|
||||
)
|
||||
_add_startup_check(
|
||||
"ENABLED" if (ok_val and ping_ok) else "DISABLED",
|
||||
"0x0",
|
||||
provider="0x0",
|
||||
detail=detail,
|
||||
)
|
||||
|
||||
if _has_provider(config, "matrix"):
|
||||
try:
|
||||
from Provider.matrix import Matrix
|
||||
|
||||
provider = Matrix(config)
|
||||
matrix_conf = (
|
||||
config.get("provider",
|
||||
{}).get("matrix",
|
||||
{}) if isinstance(config,
|
||||
dict) else {}
|
||||
)
|
||||
homeserver = str(matrix_conf.get("homeserver") or "").strip()
|
||||
room_id = str(matrix_conf.get("room_id") or "").strip()
|
||||
if homeserver and not homeserver.startswith("http"):
|
||||
homeserver = f"https://{homeserver}"
|
||||
target = homeserver.rstrip("/")
|
||||
if room_id:
|
||||
target = (
|
||||
target + (" " if target else "")
|
||||
) + f"room:{room_id}"
|
||||
_add_startup_check(
|
||||
"ENABLED" if provider.validate() else "DISABLED",
|
||||
"Matrix",
|
||||
provider="matrix",
|
||||
detail=target or
|
||||
("Connected" if provider.validate() else "Not configured"),
|
||||
)
|
||||
except Exception as exc:
|
||||
_add_startup_check(
|
||||
"DISABLED",
|
||||
"Matrix",
|
||||
provider="matrix",
|
||||
detail=str(exc)
|
||||
str(check.get("status") or "UNKNOWN"),
|
||||
str(check.get("name") or "Plugin"),
|
||||
provider=str(check.get("plugin") or ""),
|
||||
detail=str(check.get("detail") or ""),
|
||||
files=check.get("files"),
|
||||
)
|
||||
|
||||
if _has_store_subtype(config, "debrid"):
|
||||
@@ -2213,9 +2034,7 @@ Come to love it when others take what you share, as there is no greater joy
|
||||
)
|
||||
|
||||
try:
|
||||
from tool.ytdlp import YtDlpTool
|
||||
|
||||
cookiefile = YtDlpTool(config).resolve_cookiefile()
|
||||
cookiefile = resolve_cookies_path(config)
|
||||
if cookiefile is not None:
|
||||
_add_startup_check("FOUND", "Cookies", detail=str(cookiefile))
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user