AST
This commit is contained in:
87
cmdlets/get_note.py
Normal file
87
cmdlets/get_note.py
Normal file
@@ -0,0 +1,87 @@
|
||||
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 <sha256>]",
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user