This commit is contained in:
nose
2025-12-16 01:45:01 -08:00
parent a03eb0d1be
commit 9873280f0e
36 changed files with 4911 additions and 1225 deletions

View File

@@ -179,7 +179,7 @@ class HydrusNetwork(Store):
try:
metadata = client.fetch_file_metadata(hashes=[file_hash])
if metadata and isinstance(metadata, dict):
files = metadata.get("file_metadata", [])
files = metadata.get("metadata", [])
if files:
file_exists = True
log(
@@ -376,12 +376,12 @@ class HydrusNetwork(Store):
if not pattern or pattern == "*":
metadata_list = _iter_url_filtered_metadata(None, want_any=True, fetch_limit=int(limit) if limit else 100)
else:
# Fast-path: exact URL via /add_url/get_url_files when a full URL is provided.
# Fast-path: exact URL via /add_urls/get_url_files when a full URL is provided.
try:
if pattern.startswith("http://") or pattern.startswith("https://"):
from API.HydrusNetwork import HydrusRequestSpec
spec = HydrusRequestSpec(method="GET", endpoint="/add_url/get_url_files", query={"url": pattern})
spec = HydrusRequestSpec(method="GET", endpoint="/add_urls/get_url_files", query={"url": pattern})
response = client._perform_request(spec) # type: ignore[attr-defined]
hashes: list[str] = []
file_ids: list[int] = []
@@ -479,8 +479,8 @@ class HydrusNetwork(Store):
if not isinstance(metadata_list, list):
metadata_list = []
for meta in metadata_list:
for meta in metadata_list:
if len(results) >= limit:
break
@@ -527,14 +527,14 @@ class HydrusNetwork(Store):
top_level_tags = meta.get("tags_flat", []) or meta.get("tags", [])
_collect(top_level_tags)
# Resolve extension from MIME type
# Prefer Hydrus-provided extension (e.g. ".webm"); fall back to MIME map.
mime_type = meta.get("mime")
ext = ""
if mime_type:
ext = str(meta.get("ext") or "").strip().lstrip('.')
if not ext and mime_type:
for category in mime_maps.values():
for _ext_key, info in category.items():
if mime_type in info.get("mimes", []):
ext = info.get("ext", "").lstrip('.')
ext = str(info.get("ext", "")).strip().lstrip('.')
break
if ext:
break
@@ -605,8 +605,11 @@ class HydrusNetwork(Store):
raise
def get_file(self, file_hash: str, **kwargs: Any) -> Path | str | None:
"""Open file in browser via Hydrus client API URL."""
import webbrowser
"""Return a browser URL for the file.
IMPORTANT: this method must be side-effect free (do not auto-open a browser).
Only explicit user actions (e.g. the get-file cmdlet) should open files.
"""
debug(f"[HydrusNetwork.get_file] Starting for hash: {file_hash[:12]}...")
@@ -614,13 +617,6 @@ class HydrusNetwork(Store):
base_url = str(self.URL).rstrip('/')
access_key = str(self.API)
browser_url = f"{base_url}/get_files/file?hash={file_hash}&Hydrus-Client-API-Access-Key={access_key}"
debug(f"[HydrusNetwork.get_file] Opening URL: {browser_url}")
# Open in default browser
webbrowser.open(browser_url)
debug(f"[HydrusNetwork.get_file] Browser opened successfully")
# Return the URL string instead of downloading
debug(f"[HydrusNetwork.get_file] Returning URL: {browser_url}")
return browser_url
@@ -664,24 +660,28 @@ class HydrusNetwork(Store):
if title != f"Hydrus_{file_hash[:12]}":
break
# Determine extension from mime type
# Prefer Hydrus-provided extension (e.g. ".webm"); fall back to MIME map if needed.
mime_type = meta.get("mime", "")
ext = ""
if mime_type:
from SYS.utils_constant import mime_maps
for _category, extensions in mime_maps.items():
for extension, mime in extensions.items():
if mime == mime_type:
ext = extension.lstrip(".")
ext_raw = meta.get("ext")
ext = str(ext_raw or "").strip().lstrip(".")
if not ext and mime_type:
try:
from SYS.utils_constant import mime_maps
for category in mime_maps.values():
for _ext_key, info in category.items():
if mime_type in info.get("mimes", []):
ext = str(info.get("ext", "")).strip().lstrip(".")
break
if ext:
break
if ext:
break
except Exception:
ext = ""
return {
"hash": file_hash,
"title": title,
"ext": ext,
"size": meta.get("size", 0),
"size": meta.get("size"),
"mime": mime_type,
}
@@ -804,13 +804,31 @@ class HydrusNetwork(Store):
if len(file_hash) != 64 or not all(ch in "0123456789abcdef" for ch in file_hash):
return []
payload = client.fetch_file_metadata(hashes=[file_hash], include_file_url=True)
payload = client.fetch_file_metadata(hashes=[file_hash], include_file_url=False)
items = payload.get("metadata") if isinstance(payload, dict) else None
if not isinstance(items, list) or not items:
return []
meta = items[0]
url = meta.get("url") or []
return list(url)
meta = items[0] if isinstance(items[0], dict) else {}
raw_urls: Any = (
meta.get("known_urls")
or meta.get("urls")
or meta.get("url")
or []
)
if isinstance(raw_urls, str):
val = raw_urls.strip()
return [val] if val else []
if isinstance(raw_urls, list):
out: list[str] = []
for u in raw_urls:
if not isinstance(u, str):
continue
u = u.strip()
if u:
out.append(u)
return out
return []
except Exception as exc:
debug(f"Hydrus get_url failed: {exc}")
return []