Get api key and enpoint from docker env

This commit is contained in:
Arnaud_Cayrol 2025-04-06 20:05:14 +02:00
parent 188658d6fa
commit 50c556e8b0
3 changed files with 92 additions and 51 deletions

84
main.py
View file

@ -1,51 +1,61 @@
# main.py
import os
from flask import Flask, request, render_template
from immich_selfie_timelapse import process_faces
from timelapse import process_faces
app = Flask(__name__)
# Read critical parameters from environment variables
DEFAULT_API_KEY = os.environ.get("IMMICH_API_KEY", "")
DEFAULT_BASE_URL = os.environ.get("IMMICH_BASE_URL", "")
DEFAULT_OUTPUT_FOLDER = os.environ.get("IMMICH_OUTPUT_FOLDER", "output")
@app.route("/", methods=["GET", "POST"])
def index():
result = None
error = None
if request.method == "POST":
# Read form fields, converting as necessary.
api_key = request.form["api_key"]
base_url = request.form["base_url"]
person_id = request.form["person_id"]
output_folder = request.form.get("output_folder", "output")
padding_percent = float(request.form.get("padding_percent", 0.3))
resize_width = int(request.form.get("resize_width", 512))
resize_height = int(request.form.get("resize_height", 512))
min_face_width = int(request.form.get("min_face_width", 128))
min_face_height = int(request.form.get("min_face_height", 128))
pose_threshold = float(request.form.get("pose_threshold", 25))
desired_left_eye_x = float(request.form.get("desired_left_eye_x", 0.35))
desired_left_eye_y = float(request.form.get("desired_left_eye_y", 0.45))
max_workers = int(request.form.get("max_workers", 4))
face_detect_model_path = request.form.get("face_detect_model_path", "mmod_human_face_detector.dat")
landmark_model_path = request.form.get("landmark_model_path", "shape_predictor_68_face_landmarks.dat")
try:
# Use environment variable defaults if form fields are empty
api_key = request.form.get("api_key") or DEFAULT_API_KEY
base_url = request.form.get("base_url") or DEFAULT_BASE_URL
output_folder = request.form.get("output_folder") or DEFAULT_OUTPUT_FOLDER
person_id = request.form["person_id"]
# Run the process_faces function with provided parameters
processed_files = process_faces(
api_key=api_key,
base_url=base_url,
person_id=person_id,
output_folder=output_folder,
padding_percent=padding_percent,
resize_width=resize_width,
resize_height=resize_height,
min_face_width=min_face_width,
min_face_height=min_face_height,
pose_threshold=pose_threshold,
desired_left_eye=(desired_left_eye_x, desired_left_eye_y),
max_workers=max_workers,
face_detect_model_path=face_detect_model_path,
landmark_model_path=landmark_model_path
)
result = f"Finished processing. {len(processed_files)} images saved in {output_folder}"
return render_template("index.html", result=result)
# Convert numeric parameters with defaults if conversion fails
padding_percent = float(request.form.get("padding_percent", 0.3))
resize_width = int(request.form.get("resize_width", 512))
resize_height = int(request.form.get("resize_height", 512))
min_face_width = int(request.form.get("min_face_width", 128))
min_face_height = int(request.form.get("min_face_height", 128))
pose_threshold = float(request.form.get("pose_threshold", 25))
desired_left_eye_x = float(request.form.get("desired_left_eye_x", 0.35))
desired_left_eye_y = float(request.form.get("desired_left_eye_y", 0.45))
max_workers = int(request.form.get("max_workers", 4))
face_detect_model_path = request.form.get("face_detect_model_path", "mmod_human_face_detector.dat")
landmark_model_path = request.form.get("landmark_model_path", "shape_predictor_68_face_landmarks.dat")
processed_files = process_faces(
api_key=api_key,
base_url=base_url,
person_id=person_id,
output_folder=output_folder,
padding_percent=padding_percent,
resize_width=resize_width,
resize_height=resize_height,
min_face_width=min_face_width,
min_face_height=min_face_height,
pose_threshold=pose_threshold,
desired_left_eye=(desired_left_eye_x, desired_left_eye_y),
max_workers=max_workers,
face_detect_model_path=face_detect_model_path,
landmark_model_path=landmark_model_path
)
result = f"Finished processing. {len(processed_files)} images saved in '{output_folder}'."
except Exception as e:
error = f"Error processing request: {e}"
return render_template("index.html", result=result, error=error)
if __name__ == "__main__":

View file

@ -5,22 +5,53 @@
</head>
<body>
<h1>Create a Selfie Timelapse</h1>
{% if error %}
<p style="color:red;">{{ error }}</p>
{% endif %}
<form method="post">
<label>API Key: <input type="text" name="api_key" required></label><br><br>
<label>Base URL: <input type="text" name="base_url" required></label><br><br>
<label>API Key:
<input type="text" name="api_key" value="{{ request.form.api_key or config['IMMICH_API_KEY'] or '' }}">
</label><br><br>
<label>Base URL:
<input type="text" name="base_url" value="{{ request.form.base_url or config['IMMICH_BASE_URL'] or '' }}">
</label><br><br>
<label>Output Folder:
<input type="text" name="output_folder" value="{{ request.form.output_folder or config['IMMICH_OUTPUT_FOLDER'] or 'output' }}">
</label><br><br>
<label>Person ID: <input type="text" name="person_id" required></label><br><br>
<label>Output Folder: <input type="text" name="output_folder" value="output"></label><br><br>
<label>Padding Percent: <input type="number" step="0.01" name="padding_percent" value="0.3"></label><br><br>
<label>Resize Width: <input type="number" name="resize_width" value="512"></label><br><br>
<label>Resize Height: <input type="number" name="resize_height" value="512"></label><br><br>
<label>Min Face Width: <input type="number" name="min_face_width" value="128"></label><br><br>
<label>Min Face Height: <input type="number" name="min_face_height" value="128"></label><br><br>
<label>Pose Threshold: <input type="number" step="0.1" name="pose_threshold" value="25"></label><br><br>
<label>Desired Left Eye X: <input type="number" step="0.01" name="desired_left_eye_x" value="0.35"></label><br><br>
<label>Desired Left Eye Y: <input type="number" step="0.01" name="desired_left_eye_y" value="0.45"></label><br><br>
<label>Max Workers: <input type="number" name="max_workers" value="4"></label><br><br>
<label>Face Detect Model Path: <input type="text" name="face_detect_model_path" value="mmod_human_face_detector.dat"></label><br><br>
<label>Landmark Model Path: <input type="text" name="landmark_model_path" value="shape_predictor_68_face_landmarks.dat"></label><br><br>
<label>Padding Percent:
<input type="number" step="0.01" name="padding_percent" value="{{ request.form.padding_percent or 0.3 }}">
</label><br><br>
<label>Resize Width:
<input type="number" name="resize_width" value="{{ request.form.resize_width or 512 }}">
</label><br><br>
<label>Resize Height:
<input type="number" name="resize_height" value="{{ request.form.resize_height or 512 }}">
</label><br><br>
<label>Min Face Width:
<input type="number" name="min_face_width" value="{{ request.form.min_face_width or 128 }}">
</label><br><br>
<label>Min Face Height:
<input type="number" name="min_face_height" value="{{ request.form.min_face_height or 128 }}">
</label><br><br>
<label>Pose Threshold:
<input type="number" step="0.1" name="pose_threshold" value="{{ request.form.pose_threshold or 25 }}">
</label><br><br>
<label>Desired Left Eye X:
<input type="number" step="0.01" name="desired_left_eye_x" value="{{ request.form.desired_left_eye_x or 0.35 }}">
</label><br><br>
<label>Desired Left Eye Y:
<input type="number" step="0.01" name="desired_left_eye_y" value="{{ request.form.desired_left_eye_y or 0.45 }}">
</label><br><br>
<label>Max Workers:
<input type="number" name="max_workers" value="{{ request.form.max_workers or 4 }}">
</label><br><br>
<label>Face Detect Model Path:
<input type="text" name="face_detect_model_path" value="{{ request.form.face_detect_model_path or 'mmod_human_face_detector.dat' }}">
</label><br><br>
<label>Landmark Model Path:
<input type="text" name="landmark_model_path" value="{{ request.form.landmark_model_path or 'shape_predictor_68_face_landmarks.dat' }}">
</label><br><br>
<button type="submit">Generate Timelapse</button>
</form>
{% if result %}