From 31f1940ec8c4aba6a0c21b20eff9657d5d11cf80 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Sun, 11 May 2025 00:20:08 -0500 Subject: albums thumbnails endpoint and albums endpoint --- flaskapi.py | 22 +++++++++++++++++++++- immich.py | 20 ++++++++++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/flaskapi.py b/flaskapi.py index 29cea7e..0791016 100644 --- a/flaskapi.py +++ b/flaskapi.py @@ -1,4 +1,5 @@ -from flask import Flask, Blueprint, request, send_from_directory +from flask import Flask, Blueprint, request, send_from_directory, send_file, abort +from flask_cors import CORS app = Flask(__name__, static_folder="static/dist", static_url_path="/") @@ -10,6 +11,7 @@ def home(): return send_from_directory("static/public", "index.html") api = Blueprint("api", __name__) +CORS(api, origins="*") # For debugging TODO remove later @api.route("/seek") def seek(): @@ -24,4 +26,22 @@ def seek(): "imageIndex": pd.current_texture_index, } +@api.route("/albums/get") +def get_albums(): + ic = app.config["immich_connector"] + keys = [ "albumName", "albumThumbnailAssetId", "id", "startDate", "endDate", "assetCount", "shared", ] + return [{ + key: album[key] for key in keys + } for album in ic.load_all_albums() ] + +@api.route("/albums/thumb/") +def get_album_thumb(key): + # TODO ensure getting actual album thumb + ic = app.config["immich_connector"] + image_data, mimetype = ic.load_image(key, size="thumbnail") + if image_data is None: + abort(400) + return send_file(image_data, mimetype=mimetype) + + app.register_blueprint(api, url_prefix="/api") diff --git a/immich.py b/immich.py index 1f1ccb8..63e6f63 100644 --- a/immich.py +++ b/immich.py @@ -12,6 +12,13 @@ class ImmichConnector: def _request(self, endpoint): return requests.get(f"{self.server_url}/api/{endpoint}", headers={ "x-api-key": self.api_key }) + def load_all_albums(self): + response = self._request("albums") + if response.status_code != 200: return + + data = response.json() + return data + def load_album_assets(self, key): response = self._request(f"albums/{key}") if response.status_code != 200: return @@ -19,15 +26,20 @@ class ImmichConnector: data = response.json() return data["assets"] - def load_image(self, pd, key, exif=None): - response = self._request(f"assets/{key}/thumbnail?size=fullsize") - if response.status_code != 200: return + def load_image(self, key, size="preview"): + response = self._request(f"assets/{key}/thumbnail?size={size}") + if response.status_code != 200: return None, None image_data = BytesIO(response.content) + mimetype = response.headers.get("Content-Type") + return image_data, mimetype + + def load_texture(self, pd, key, exif=None, size="preview"): + image_data, _ = self.load_image(key, size) it = ImageTexture(image_data, exif) pd.textures.append(it) print(f"Loaded image {key}") def idle(self, pd): for asset in self.load_album_assets("bac029a5-972b-4519-bce0-a0d74add3969"): - self.load_image(pd, asset["id"], asset["exifInfo"]) + self.load_texture(pd, asset["id"], asset["exifInfo"]) -- cgit v1.2.3