| """Per-person metadata stored alongside face_database enrollments.""" |
| from __future__ import annotations |
|
|
| import json |
| import os |
|
|
| META_FILENAME = "metadata.json" |
| DEFAULT_ROLE = "Staff" |
|
|
|
|
| def _meta_path(person_dir: str) -> str: |
| return os.path.join(person_dir, META_FILENAME) |
|
|
|
|
| def read_person_metadata(person_name: str, face_db_root: str) -> dict: |
| person_dir = os.path.join(face_db_root, person_name) |
| path = _meta_path(person_dir) |
| if not os.path.isfile(path): |
| return {"role": DEFAULT_ROLE} |
| try: |
| with open(path, encoding="utf-8") as fh: |
| data = json.load(fh) |
| if isinstance(data, dict): |
| return {"role": data.get("role") or DEFAULT_ROLE, **data} |
| except (OSError, json.JSONDecodeError): |
| pass |
| return {"role": DEFAULT_ROLE} |
|
|
|
|
| def write_person_metadata(person_name: str, face_db_root: str, *, role: str | None = None, **extra) -> dict: |
| person_dir = os.path.join(face_db_root, person_name) |
| os.makedirs(person_dir, exist_ok=True) |
| current = read_person_metadata(person_name, face_db_root) |
| if role is not None: |
| current["role"] = (role or DEFAULT_ROLE).strip() or DEFAULT_ROLE |
| current.update({k: v for k, v in extra.items() if v is not None}) |
| with open(_meta_path(person_dir), "w", encoding="utf-8") as fh: |
| json.dump(current, fh, indent=2) |
| return current |
|
|