updated plugin refactor and added FTP and SCP plugins , also hydrusnetwork plugin migration
This commit is contained in:
+55
-69
@@ -1410,7 +1410,7 @@ def fetch_hydrus_metadata(
|
||||
Eliminates repeated boilerplate: client initialization, error handling, metadata extraction.
|
||||
|
||||
Args:
|
||||
config: Configuration object (passed to hydrus_wrapper.get_client)
|
||||
config: Configuration object used to resolve the Hydrus provider/store
|
||||
hash_hex: File hash to fetch metadata for
|
||||
store_name: Optional Hydrus store name. When provided, do not fall back to a global/default Hydrus client.
|
||||
hydrus_client: Optional explicit Hydrus client. When provided, takes precedence.
|
||||
@@ -1422,38 +1422,53 @@ def fetch_hydrus_metadata(
|
||||
- metadata_dict: Dict from Hydrus (first item in metadata list) or None if unavailable
|
||||
- error_code: 0 on success, 1 on any error (suitable for returning from cmdlet execute())
|
||||
"""
|
||||
from API import HydrusNetwork
|
||||
|
||||
hydrus_wrapper = HydrusNetwork
|
||||
|
||||
client = hydrus_client
|
||||
hydrus_provider = None
|
||||
try:
|
||||
from ProviderCore.registry import get_plugin
|
||||
|
||||
hydrus_provider = get_plugin("hydrusnetwork", config)
|
||||
except Exception:
|
||||
hydrus_provider = None
|
||||
|
||||
if client is None:
|
||||
if store_name:
|
||||
# Store specified: do not fall back to a global/default Hydrus client.
|
||||
if hydrus_provider is not None:
|
||||
try:
|
||||
from Store import Store
|
||||
|
||||
store = Store(config)
|
||||
backend = store[str(store_name)]
|
||||
candidate = getattr(backend, "_client", None)
|
||||
if candidate is not None and hasattr(candidate, "fetch_file_metadata"):
|
||||
client = candidate
|
||||
client = hydrus_provider.get_client(
|
||||
store_name=store_name if store_name else None,
|
||||
allow_default=not bool(store_name),
|
||||
)
|
||||
except Exception as exc:
|
||||
log(f"Hydrus client unavailable for store '{store_name}': {exc}")
|
||||
if store_name:
|
||||
log(f"Hydrus client unavailable for store '{store_name}': {exc}")
|
||||
else:
|
||||
log(f"Hydrus client unavailable: {exc}")
|
||||
client = None
|
||||
if client is None:
|
||||
log(f"Hydrus client unavailable for store '{store_name}'")
|
||||
return None, 1
|
||||
else:
|
||||
try:
|
||||
client = hydrus_wrapper.get_client(config)
|
||||
except Exception as exc:
|
||||
log(f"Hydrus client unavailable: {exc}")
|
||||
return None, 1
|
||||
if client is None and store_name:
|
||||
log(f"Hydrus client unavailable for store '{store_name}'")
|
||||
return None, 1
|
||||
if client is None and hydrus_provider is None:
|
||||
log("Hydrus provider unavailable")
|
||||
return None, 1
|
||||
|
||||
if client is None:
|
||||
log("Hydrus client unavailable")
|
||||
return None, 1
|
||||
if hydrus_provider is not None:
|
||||
try:
|
||||
metadata = hydrus_provider.fetch_metadata(
|
||||
hash_hex,
|
||||
store_name=store_name if store_name else None,
|
||||
**kwargs,
|
||||
)
|
||||
except Exception as exc:
|
||||
log(f"Hydrus metadata fetch failed: {exc}")
|
||||
return None, 1
|
||||
if isinstance(metadata, dict):
|
||||
return metadata, 0
|
||||
if client is None:
|
||||
if store_name:
|
||||
log(f"Hydrus client unavailable for store '{store_name}'")
|
||||
else:
|
||||
log("Hydrus metadata unavailable")
|
||||
return None, 1
|
||||
|
||||
try:
|
||||
payload = client.fetch_file_metadata(hashes=[hash_hex], **kwargs)
|
||||
@@ -3725,10 +3740,13 @@ def check_url_exists_in_storage(
|
||||
match_rows: List[Dict[str, Any]] = []
|
||||
max_rows = 200
|
||||
|
||||
hydrus_provider = None
|
||||
try:
|
||||
from Store.HydrusNetwork import HydrusNetwork
|
||||
from ProviderCore.registry import get_plugin
|
||||
|
||||
hydrus_provider = get_plugin("hydrusnetwork", config)
|
||||
except Exception:
|
||||
HydrusNetwork = None # type: ignore
|
||||
hydrus_provider = None
|
||||
|
||||
for backend_name in backend_names:
|
||||
if _timed_out("backend scan"):
|
||||
@@ -3739,8 +3757,14 @@ def check_url_exists_in_storage(
|
||||
backend = storage[backend_name]
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
if HydrusNetwork is not None and isinstance(backend, HydrusNetwork):
|
||||
|
||||
is_hydrus_backend = False
|
||||
try:
|
||||
is_hydrus_backend = bool(hydrus_provider and hydrus_provider.is_backend(backend, str(backend_name)))
|
||||
except Exception:
|
||||
is_hydrus_backend = False
|
||||
|
||||
if is_hydrus_backend:
|
||||
if not hydrus_available:
|
||||
debug("Bulk URL preflight: global Hydrus availability check failed; attempting per-backend best-effort lookup")
|
||||
|
||||
@@ -3776,44 +3800,6 @@ def check_url_exists_in_storage(
|
||||
found = True
|
||||
break
|
||||
|
||||
client = getattr(backend, "_client", None)
|
||||
if found:
|
||||
pass
|
||||
elif client is None:
|
||||
continue
|
||||
for needle in (needles or [])[:6]:
|
||||
if found:
|
||||
break
|
||||
if not _httpish(needle):
|
||||
continue
|
||||
try:
|
||||
from API.HydrusNetwork import HydrusRequestSpec
|
||||
|
||||
spec = HydrusRequestSpec(
|
||||
method="GET",
|
||||
endpoint="/add_urls/get_url_files",
|
||||
query={"url": needle},
|
||||
)
|
||||
if hasattr(client, "_perform_request"):
|
||||
response = client._perform_request(spec)
|
||||
raw_hashes = None
|
||||
if isinstance(response, dict):
|
||||
raw_hashes = response.get("hashes") or response.get("file_hashes")
|
||||
raw_ids = response.get("file_ids")
|
||||
hash_list = raw_hashes if isinstance(raw_hashes, list) else []
|
||||
has_ids = isinstance(raw_ids, list) and len(raw_ids) > 0
|
||||
has_hashes = len(hash_list) > 0
|
||||
if has_hashes:
|
||||
try:
|
||||
found_hash = str(hash_list[0]).strip()
|
||||
except Exception:
|
||||
found_hash = None
|
||||
if has_ids or has_hashes:
|
||||
found = True
|
||||
break
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
if not found:
|
||||
continue
|
||||
|
||||
|
||||
Reference in New Issue
Block a user