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:
+49
-74
@@ -15,6 +15,7 @@ from SYS.result_table import Table
|
||||
from SYS.item_accessors import get_sha256_hex
|
||||
from SYS.utils import extract_hydrus_hash_from_url
|
||||
from SYS import pipeline as ctx
|
||||
from ProviderCore.registry import get_plugin, get_plugin_for_url
|
||||
from cmdnat._parsing import (
|
||||
extract_arg_value,
|
||||
extract_piped_value as _extract_piped_value,
|
||||
@@ -29,6 +30,29 @@ _MATRIX_MENU_STATE_KEY = "matrix_menu_state"
|
||||
_MATRIX_SELECTED_SETTING_KEY_KEY = "matrix_selected_setting_key"
|
||||
|
||||
|
||||
def _get_matrix_provider(config: Dict[str, Any]) -> Any:
|
||||
provider = get_plugin("matrix", config)
|
||||
if provider is None:
|
||||
raise RuntimeError("Matrix plugin is not registered")
|
||||
return provider
|
||||
|
||||
|
||||
def _resolve_plugin_url(url: str, config: Dict[str, Any]) -> str:
|
||||
target = str(url or "").strip()
|
||||
if not target:
|
||||
return target
|
||||
|
||||
provider = get_plugin_for_url(target, config)
|
||||
if provider is None:
|
||||
return target
|
||||
|
||||
try:
|
||||
resolved = provider.resolve_url(target)
|
||||
except Exception:
|
||||
return target
|
||||
return str(resolved or target)
|
||||
|
||||
|
||||
def _extract_set_value_arg(args: Sequence[str]) -> Optional[str]:
|
||||
"""Extract the value from -set-value flag."""
|
||||
return extract_arg_value(args, flags={"-set-value"})
|
||||
@@ -212,35 +236,11 @@ def _resolve_room_identifier(value: str, config: Dict[str, Any]) -> Optional[str
|
||||
conf_ids = _parse_config_room_filter_ids(config)
|
||||
if conf_ids:
|
||||
# Attempt to fetch names for the configured IDs
|
||||
try:
|
||||
from Provider.matrix import Matrix
|
||||
# Avoid __init__ network failures by requiring homeserver+token to exist
|
||||
block = config.get("provider", {}).get("matrix", {})
|
||||
if block and block.get("homeserver") and block.get("access_token"):
|
||||
try:
|
||||
m = Matrix(config)
|
||||
rooms = m.list_rooms(room_ids=conf_ids)
|
||||
for room in rooms or []:
|
||||
name = str(room.get("name") or "").strip()
|
||||
rid = str(room.get("room_id") or "").strip()
|
||||
if name and name.lower() == cand.lower():
|
||||
return rid
|
||||
if name and cand.lower() in name.lower():
|
||||
return rid
|
||||
except Exception:
|
||||
# Best-effort; fallback below
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Last resort: attempt to ask the server for matching rooms (if possible)
|
||||
try:
|
||||
from Provider.matrix import Matrix
|
||||
block = config.get("provider", {}).get("matrix", {})
|
||||
if block and block.get("homeserver") and block.get("access_token"):
|
||||
try:
|
||||
m = Matrix(config)
|
||||
rooms = m.list_rooms()
|
||||
m = _get_matrix_provider(config)
|
||||
rooms = m.list_rooms(room_ids=conf_ids)
|
||||
for room in rooms or []:
|
||||
name = str(room.get("name") or "").strip()
|
||||
rid = str(room.get("room_id") or "").strip()
|
||||
@@ -250,8 +250,22 @@ def _resolve_room_identifier(value: str, config: Dict[str, Any]) -> Optional[str
|
||||
return rid
|
||||
except Exception:
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Last resort: attempt to ask the server for matching rooms (if possible)
|
||||
block = config.get("provider", {}).get("matrix", {})
|
||||
if block and block.get("homeserver") and block.get("access_token"):
|
||||
try:
|
||||
m = _get_matrix_provider(config)
|
||||
rooms = m.list_rooms()
|
||||
for room in rooms or []:
|
||||
name = str(room.get("name") or "").strip()
|
||||
rid = str(room.get("room_id") or "").strip()
|
||||
if name and name.lower() == cand.lower():
|
||||
return rid
|
||||
if name and cand.lower() in name.lower():
|
||||
return rid
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return None
|
||||
except Exception:
|
||||
@@ -270,10 +284,8 @@ def _send_pending_to_rooms(config: Dict[str, Any], room_ids: List[str], args: Se
|
||||
log("No pending items to upload (use: @N | .matrix)", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
from Provider.matrix import Matrix
|
||||
|
||||
try:
|
||||
provider = Matrix(config)
|
||||
provider = _get_matrix_provider(config)
|
||||
except Exception as exc:
|
||||
log(f"Matrix not available: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
@@ -585,35 +597,6 @@ def _maybe_download_hydrus_file(item: Any,
|
||||
return None
|
||||
|
||||
|
||||
def _maybe_unlock_alldebrid_url(url: str, config: Dict[str, Any]) -> str:
|
||||
try:
|
||||
parsed = urlparse(url)
|
||||
host = (parsed.netloc or "").lower()
|
||||
if host != "alldebrid.com":
|
||||
return url
|
||||
if not (parsed.path or "").startswith("/f/"):
|
||||
return url
|
||||
|
||||
try:
|
||||
from Provider.alldebrid import _get_debrid_api_key # type: ignore
|
||||
|
||||
api_key = _get_debrid_api_key(config or {})
|
||||
except Exception:
|
||||
api_key = None
|
||||
if not api_key:
|
||||
return url
|
||||
|
||||
from API.alldebrid import AllDebridClient
|
||||
|
||||
client = AllDebridClient(str(api_key))
|
||||
unlocked = client.unlock_link(url)
|
||||
if isinstance(unlocked, str) and unlocked.strip():
|
||||
return unlocked.strip()
|
||||
except Exception:
|
||||
pass
|
||||
return url
|
||||
|
||||
|
||||
def _resolve_upload_path(item: Any, config: Dict[str, Any]) -> Optional[str]:
|
||||
"""Resolve a usable local file path for uploading.
|
||||
|
||||
@@ -645,7 +628,7 @@ def _resolve_upload_path(item: Any, config: Dict[str, Any]) -> Optional[str]:
|
||||
return None
|
||||
|
||||
# Best-effort: unlock AllDebrid file links (they require auth and aren't directly downloadable).
|
||||
url = _maybe_unlock_alldebrid_url(url, config)
|
||||
url = _resolve_plugin_url(url, config)
|
||||
|
||||
try:
|
||||
from API.HTTP import _download_direct_file
|
||||
@@ -851,10 +834,8 @@ def _handle_settings_edit(result: Any, args: Sequence[str], config: Dict[str, An
|
||||
|
||||
def _handle_settings_test(config: Dict[str, Any]) -> int:
|
||||
"""Test Matrix credentials and prompt for default rooms upon success."""
|
||||
from Provider.matrix import Matrix
|
||||
|
||||
try:
|
||||
provider = Matrix(config)
|
||||
provider = _get_matrix_provider(config)
|
||||
except Exception as exc:
|
||||
log(f"Matrix test failed: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
@@ -863,13 +844,11 @@ def _handle_settings_test(config: Dict[str, Any]) -> int:
|
||||
return _show_default_room_picker(config, provider=provider)
|
||||
|
||||
|
||||
def _show_default_room_picker(config: Dict[str, Any], *, provider: Optional["Matrix"] = None) -> int:
|
||||
def _show_default_room_picker(config: Dict[str, Any], *, provider: Optional[Any] = None) -> int:
|
||||
"""Display joined rooms so the user can select defaults for sharing."""
|
||||
from Provider.matrix import Matrix
|
||||
|
||||
try:
|
||||
if provider is None:
|
||||
provider = Matrix(config)
|
||||
provider = _get_matrix_provider(config)
|
||||
except Exception as exc:
|
||||
log(f"Matrix not available: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
@@ -977,10 +956,8 @@ def _handle_settings_rooms(result: Any, args: Sequence[str], config: Dict[str, A
|
||||
|
||||
def _show_rooms_table(config: Dict[str, Any]) -> int:
|
||||
"""Display rooms (refactored original behavior)."""
|
||||
from Provider.matrix import Matrix
|
||||
|
||||
try:
|
||||
provider = Matrix(config)
|
||||
provider = _get_matrix_provider(config)
|
||||
except Exception as exc:
|
||||
log(f"Matrix not available: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
@@ -1121,10 +1098,8 @@ def _run(result: Any, args: Sequence[str], config: Dict[str, Any]) -> int:
|
||||
log("No pending items to upload (use: @N | .matrix)", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
from Provider.matrix import Matrix
|
||||
|
||||
try:
|
||||
provider = Matrix(config)
|
||||
provider = _get_matrix_provider(config)
|
||||
except Exception as exc:
|
||||
log(f"Matrix not available: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user