- Store Immich face confidence scores per asset in frigate_uploaded_ids.json
- Add frigate_api.py: query GET /api/faces to count trained images per person
- Record Frigate training count as frigate_count in tracker for offline fallback
- MAX_AUTO_IMAGES cap now uses live Frigate count → cached frigate_count → local uploaded count
- Startup summary shows last known Frigate training count per person
- Migrate by_person entries from flat list to {asset_ids, scores, frigate_count} dict
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
29 lines
928 B
Python
29 lines
928 B
Python
"""Frigate API helpers for querying face training state."""
|
|
|
|
import logging
|
|
import os
|
|
|
|
import requests
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def get_frigate_face_counts() -> dict[str, int] | None:
|
|
"""Return {person_name: training_image_count} from Frigate's train directory.
|
|
|
|
Returns None if FRIGATE_URL is not set or the API is unreachable, so callers
|
|
can distinguish "API unavailable" from "person has 0 images."
|
|
"""
|
|
frigate_url = os.environ.get("FRIGATE_URL", "").rstrip("/")
|
|
if not frigate_url:
|
|
return None
|
|
try:
|
|
resp = requests.get(f"{frigate_url}/api/faces", timeout=10)
|
|
resp.raise_for_status()
|
|
data = resp.json()
|
|
train = data.get("train", {})
|
|
return {name: len(files) for name, files in train.items() if isinstance(files, list)}
|
|
except Exception as e:
|
|
logger.warning(f"Could not query Frigate face counts: {e}")
|
|
return None
|