from __future__ import annotations from typing import Any, Dict, Sequence import json from . import register import models import pipeline as ctx from helper import hydrus as hydrus_wrapper from ._shared import Cmdlet, CmdletArg, normalize_hash from helper.logger import log CMDLET = Cmdlet( name="get-note", summary="List notes on a Hydrus file.", usage="get-note [-hash ]", args=[ CmdletArg("-hash", description="Override the Hydrus file hash (SHA256) to target instead of the selected result."), ], details=[ "- Prints notes by service and note name.", ], ) @register(["get-note", "get-notes", "get_note"]) # aliases def get_notes(result: Any, args: Sequence[str], config: Dict[str, Any]) -> int: # Helper to get field from both dict and object def get_field(obj: Any, field: str, default: Any = None) -> Any: if isinstance(obj, dict): return obj.get(field, default) else: return getattr(obj, field, default) # Help try: if any(str(a).lower() in {"-?", "/?", "--help", "-h", "help", "--cmdlet"} for a in args): log(json.dumps(CMDLET, ensure_ascii=False, indent=2)) return 0 except Exception: pass from ._shared import parse_cmdlet_args parsed = parse_cmdlet_args(args, CMDLET) override_hash = parsed.get("hash") hash_hex = normalize_hash(override_hash) if override_hash else normalize_hash(get_field(result, "hash_hex", None)) if not hash_hex: log("Selected result does not include a Hydrus hash") return 1 try: client = hydrus_wrapper.get_client(config) except Exception as exc: log(f"Hydrus client unavailable: {exc}") return 1 if client is None: log("Hydrus client unavailable") return 1 try: payload = client.fetch_file_metadata(hashes=[hash_hex], include_service_keys_to_tags=False, include_notes=True) except Exception as exc: log(f"Hydrus metadata fetch failed: {exc}") return 1 items = payload.get("metadata") if isinstance(payload, dict) else None meta = items[0] if (isinstance(items, list) and items and isinstance(items[0], dict)) else None notes = {} if isinstance(meta, dict): # Hydrus returns service_keys_to_tags; for notes we expect 'service_names_to_notes' in modern API notes = meta.get('notes') or meta.get('service_names_to_notes') or {} if notes: ctx.emit("Notes:") # Print flattened: service -> (name: text) if isinstance(notes, dict) and any(isinstance(v, dict) for v in notes.values()): for svc, mapping in notes.items(): ctx.emit(f"- {svc}:") if isinstance(mapping, dict): for k, v in mapping.items(): ctx.emit(f" • {k}: {str(v).strip()}") elif isinstance(notes, dict): for k, v in notes.items(): ctx.emit(f"- {k}: {str(v).strip()}") else: ctx.emit("No notes found.") return 0