diff --git a/server/app/immich_client.py b/server/app/immich_client.py index fe32743..21d6c06 100644 --- a/server/app/immich_client.py +++ b/server/app/immich_client.py @@ -15,10 +15,23 @@ class ImmichClient: resp.raise_for_status() return resp.json() - def get_album(self, album_id: str) -> dict: - resp = httpx.get(f"{self.base_url}/api/albums/{album_id}", headers=self._headers, timeout=10) + def list_album_assets(self, album_id: str) -> list[dict]: + """GET /api/albums/{id} doesn't embed assets in this Immich version + (AlbumResponseDto only has assetCount) -- assets live behind the + general search API instead, filtered by albumIds. + + Only returns the first page. Fine for a photo frame cycling + through an album; worth adding nextPage pagination if someone + points this at an album large enough to need it. + """ + resp = httpx.post( + f"{self.base_url}/api/search/metadata", + headers=self._headers, + json={"albumIds": [album_id]}, + timeout=15, + ) resp.raise_for_status() - return resp.json() + return resp.json().get("assets", {}).get("items", []) def download_asset_preview(self, asset_id: str) -> bytes: resp = httpx.get( diff --git a/server/app/main.py b/server/app/main.py index 5f10348..bfe36d0 100644 --- a/server/app/main.py +++ b/server/app/main.py @@ -71,11 +71,10 @@ def frame_image(): client = ImmichClient(cfg.immich_url, cfg.immich_api_key) try: - album = client.get_album(cfg.album_id) + assets = client.list_album_assets(cfg.album_id) except httpx.HTTPError as e: raise HTTPException(502, f"Could not reach Immich at {cfg.immich_url}: {e}") from e - assets = album.get("assets", []) if not assets: raise HTTPException(404, "Album has no photos")