This commit is contained in:
2026-01-14 14:54:18 -08:00
parent 0c70aab725
commit 25c940351a
3 changed files with 39 additions and 7 deletions

View File

@@ -233,7 +233,23 @@ class ZeroTier(Store):
params = {"q": query, "limit": int(kwargs.get("limit", 100))} params = {"q": query, "limit": int(kwargs.get("limit", 100))}
res = self._request_remote("GET", "/files/search", params=params) res = self._request_remote("GET", "/files/search", params=params)
if isinstance(res, dict): if isinstance(res, dict):
return list(res.get("files") or []) files = list(res.get("files") or [])
# Inject store name and normalize keys for the CLI
for f in files:
if isinstance(f, dict):
f["store"] = self._name
# remote_storage_server returns 'file_path' and 'size'
# CLI prefers 'path' and 'size_bytes'
if "file_path" in f and "path" not in f:
f["path"] = f["file_path"]
if "title" not in f:
try:
f["title"] = Path(f["file_path"]).stem
except Exception:
f["title"] = f["file_path"]
if "size" in f and "size_bytes" not in f:
f["size_bytes"] = f["size"]
return files
return [] return []
def get_file(self, file_hash: str, **kwargs: Any) -> Optional[Path | str]: def get_file(self, file_hash: str, **kwargs: Any) -> Optional[Path | str]:

View File

@@ -44,7 +44,8 @@ from SYS import pipeline as ctx
STORAGE_ORIGINS = {"local", STORAGE_ORIGINS = {"local",
"hydrus", "hydrus",
"folder"} "folder",
"zerotier"}
class search_file(Cmdlet): class search_file(Cmdlet):
@@ -887,11 +888,24 @@ class search_file(Cmdlet):
store_val = str(item_dict.get("store") or "").lower() store_val = str(item_dict.get("store") or "").lower()
if store_filter != store_val: if store_filter != store_val:
continue continue
# Normalize storage results (ensure title, ext, etc.)
normalized = self._ensure_storage_columns(item_dict) normalized = self._ensure_storage_columns(item_dict)
# If normalize skipped it due to STORAGE_ORIGINS, do it manually
if "title" not in normalized:
normalized["title"] = (
item_dict.get("title") or item_dict.get("name") or
item_dict.get("path") or item_dict.get("target") or "Result"
)
if "ext" not in normalized:
t = str(normalized.get("title", ""))
if "." in t:
normalized["ext"] = t.split(".")[-1].lower()[:5]
# Make hash/store available for downstream cmdlet without rerunning search # Make hash/store available for downstream cmdlet without rerunning search
hash_val = normalized.get("hash") hash_val = normalized.get("hash")
store_val = normalized.get("store") or item_dict.get("store") store_val = normalized.get("store") or item_dict.get("store") or backend_to_search
if hash_val and not normalized.get("hash"): if hash_val and not normalized.get("hash"):
normalized["hash"] = hash_val normalized["hash"] = hash_val
if store_val and not normalized.get("store"): if store_val and not normalized.get("store"):

View File

@@ -204,6 +204,8 @@ def create_app():
"""Check server health and storage availability.""" """Check server health and storage availability."""
status = { status = {
"status": "ok", "status": "ok",
"service": "remote_storage",
"name": os.environ.get("MM_SERVER_NAME", "Remote Storage"),
"storage_configured": STORAGE_PATH is not None, "storage_configured": STORAGE_PATH is not None,
"timestamp": datetime.now().isoformat(), "timestamp": datetime.now().isoformat(),
} }
@@ -236,13 +238,13 @@ def create_app():
query = request.args.get("q", "") query = request.args.get("q", "")
limit = request.args.get("limit", 100, type=int) limit = request.args.get("limit", 100, type=int)
if not query: # Allow empty query or '*' for "list everything"
return jsonify({"error": "Search query required"}), 400 db_query = query if query and query != "*" else ""
try: try:
with LocalLibrarySearchOptimizer(STORAGE_PATH) as db: with LocalLibrarySearchOptimizer(STORAGE_PATH) as db:
results = db.search_by_name(query, limit) results = db.search_by_name(db_query, limit)
tag_results = db.search_by_tag(query, limit) tag_results = db.search_by_tag(db_query, limit)
all_results = { all_results = {
r["hash"]: r r["hash"]: r
for r in (results + tag_results) for r in (results + tag_results)