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 manager import PixMan from settings import Config app = Flask(__name__, static_folder="static/dist", static_url_path="/") api = Blueprint("api", __name__) socketio = SocketIO(app, cors_allowed_origins="*") # NOTE debug CORS(api, origins="*") # NOTE debug @app.route("/") @app.route("/slideshow") @app.route("/albums") @app.route("/settings") def home(): return send_from_directory("static/public", "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 in selected_albums } for album in ic.load_all_albums() if album["assetCount"] ] @api.route("/asset//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//fullsize", defaults={ "size": "fullsize" }) @api.route("/asset//thumbnail", defaults={ "size": "thumbnail" }) @api.route("/asset/", 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/") 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")