summaryrefslogtreecommitdiff
path: root/src/server/flaskapi.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/flaskapi.py')
-rw-r--r--src/server/flaskapi.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/server/flaskapi.py b/src/server/flaskapi.py
new file mode 100644
index 0000000..6b910fa
--- /dev/null
+++ b/src/server/flaskapi.py
@@ -0,0 +1,90 @@
+from flask import Flask, Blueprint, request, send_from_directory, send_file, abort, redirect, jsonify
+from flask_socketio import SocketIO, emit
+from flask_cors import CORS
+from engineio.async_drivers import threading # For pyinstaller
+
+from .manager import PixMan
+from .settings import Config
+
+
+static_folder=PixMan().static_dir
+app = Flask(__name__, static_folder=static_folder, static_url_path="/")
+api = Blueprint("api", __name__)
+socketio = SocketIO(app, async_mode="threading", cors_allowed_origins="*") # NOTE debug, async_mode for pyinstaller
+CORS(api, origins="*") # NOTE debug
+
+
+@app.route("/")
+@app.route("/slideshow")
+@app.route("/albums")
+@app.route("/settings")
+def home():
+ return send_from_directory(static_folder, "index.html")
+
+
+@socketio.on("seek")
+def seek(increment):
+ if not (display := PixMan().display):
+ return {}
+ display.queue.put(lambda: display.seek(increment))
+ while not display.queue.empty():
+ pass
+ return { "imageIndex": display.current_texture_index }
+
+
+@api.route("/albums/update", methods=["POST"])
+def albums_update():
+ return { "success": PixMan().update_config({ "album_list": request.json }) }
+
+@api.route("/albums")
+def albums_get():
+ if not (ic := PixMan().immich_connector):
+ return {}
+ keys = [ "albumName", "albumThumbnailAssetId", "id", "startDate", "endDate", "assetCount", "shared", ]
+ selected_albums = PixMan().config.album_list
+ return [{
+ key: album.get(key, None) for key in keys
+ } | { "selected": album["id"] in selected_albums } for album in ic.load_all_albums() if album["assetCount"] ]
+
+
+@api.route("/asset/<key>/filename")
+def get_asset_name(key):
+ if not (ic := PixMan().immich_connector):
+ return {}
+ # TODO ensure getting actual album thumb
+ name = ic.load_image_filename(key)
+ if name is None:
+ abort(400)
+ return { "filename": name }
+
+
+@api.route("/asset/<key>/fullsize", defaults={ "size": "fullsize" })
+@api.route("/asset/<key>/thumbnail", defaults={ "size": "thumbnail" })
+@api.route("/asset/<key>", defaults={ "size": "preview" })
+def get_asset(key, size):
+ if not (ic := PixMan().immich_connector):
+ return {}
+ # TODO ensure getting actual album thumb
+ image_data, mimetype = ic.load_image(key, size=size)
+ if image_data is None:
+ abort(400)
+ return send_file(image_data, mimetype=mimetype)
+
+
+@api.route("/redirect/<path:path>")
+def immich_redirect(path):
+ if not (ic := PixMan().immich_connector):
+ return {}
+ return redirect(f"{ic.server_url}/{path}")
+
+
+@api.route("/config/update", methods=["POST"])
+def config_update():
+ return { "success": PixMan().update_config(request.json) }
+
+@api.route("/config")
+def config_get():
+ return jsonify(PixMan().config)
+
+
+app.register_blueprint(api, url_prefix="/api")