diff --git a/apps/dashboard/backend/app/clients/immich_client.py b/apps/dashboard/backend/app/clients/immich_client.py new file mode 100644 index 0000000..1a1d466 --- /dev/null +++ b/apps/dashboard/backend/app/clients/immich_client.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +import logging + +from app.clients.base import BaseHTTPClient +from app.config import Settings +from app.models.sources import ImmichSnapshot + + +logger = logging.getLogger(__name__) + + +class ImmichClient(BaseHTTPClient): + def __init__(self, settings: Settings) -> None: + super().__init__(settings, "immich", settings.immich_base_url) + + async def fetch_stats(self) -> ImmichSnapshot: + snapshot = ImmichSnapshot() + if not self.base_url or not self.settings.immich_api_key: + logger.info("immich skipped: base URL or API key missing") + return snapshot + + headers = {"x-api-key": self.settings.immich_api_key} + + try: + data = await self._request_json("GET", "/api/server/statistics", headers=headers) + except Exception as exc: + logger.warning("immich fetch_stats failed: %s", exc) + return snapshot + + if not isinstance(data, dict): + logger.warning("immich unexpected response type: %s", type(data)) + return snapshot + + photos = int(data.get("photos", 0)) + videos = int(data.get("videos", 0)) + usage_bytes = int(data.get("usage", 0)) + usage_gb = round(usage_bytes / (1024 ** 3), 1) + + return ImmichSnapshot( + source_status="online", + photos=photos, + videos=videos, + storage_gb=usage_gb, + )