Add end-to-end support for video events: server streaming, scheduler metadata, API fields, and dashboard UI. - Server: range-capable streaming endpoint with byte-range support. - Scheduler: emits `video` object; best-effort HEAD probe adds `mime_type`, `size`, `accept_ranges`; placeholders for richer metadata (duration/resolution/bitrate/qualities/thumbnails). - API/DB: accept and persist `event_media_id`, `autoplay`, `loop`, `volume` for video events. - Frontend: Event modal supports video selection + playback options; FileManager increased upload size and client-side duration check (max 10 minutes). - Docs/UX: bumped program-info, added UX-only changelog and updated Copilot instructions for contributors. - Notes: metadata extraction (ffprobe), checksum persistence, and HLS/DASH transcoding are recommended follow-ups (separate changes).
80 lines
2.8 KiB
Python
80 lines
2.8 KiB
Python
# server/wsgi.py
|
||
from server.routes.eventmedia import eventmedia_bp
|
||
from server.routes.files import files_bp
|
||
from server.routes.events import events_bp
|
||
from server.routes.event_exceptions import event_exceptions_bp
|
||
from server.routes.conversions import conversions_bp
|
||
from server.routes.holidays import holidays_bp
|
||
from server.routes.academic_periods import academic_periods_bp
|
||
from server.routes.groups import groups_bp
|
||
from server.routes.clients import clients_bp
|
||
from server.routes.auth import auth_bp
|
||
from server.routes.system_settings import system_settings_bp
|
||
from server.database import Session, engine
|
||
from flask import Flask, jsonify, send_from_directory, request
|
||
import glob
|
||
import os
|
||
import sys
|
||
sys.path.append('/workspace')
|
||
|
||
app = Flask(__name__)
|
||
|
||
# Allow uploads up to 1 GiB at the Flask level (application hard limit)
|
||
# See nginx.conf for proxy limit; keep both in sync.
|
||
app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024 * 1024 # 1 GiB
|
||
|
||
# Configure Flask session
|
||
# In production, use a secure random key from environment variable
|
||
app.config['SECRET_KEY'] = os.environ.get('FLASK_SECRET_KEY', 'dev-secret-key-change-in-production')
|
||
app.config['SESSION_COOKIE_HTTPONLY'] = True
|
||
app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'
|
||
app.register_blueprint(system_settings_bp)
|
||
# In production, set to True if using HTTPS
|
||
app.config['SESSION_COOKIE_SECURE'] = os.environ.get('ENV', 'development').lower() == 'production'
|
||
# Session lifetime: longer in development for convenience
|
||
from datetime import timedelta
|
||
_env = os.environ.get('ENV', 'development').lower()
|
||
if _env in ('development', 'dev'):
|
||
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=30)
|
||
else:
|
||
# Keep modest in production; can be tuned via env later
|
||
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=1)
|
||
|
||
# Blueprints importieren und registrieren
|
||
|
||
app.register_blueprint(auth_bp)
|
||
app.register_blueprint(clients_bp)
|
||
app.register_blueprint(groups_bp)
|
||
app.register_blueprint(events_bp)
|
||
app.register_blueprint(event_exceptions_bp)
|
||
app.register_blueprint(eventmedia_bp)
|
||
app.register_blueprint(files_bp)
|
||
app.register_blueprint(holidays_bp)
|
||
app.register_blueprint(academic_periods_bp)
|
||
app.register_blueprint(conversions_bp)
|
||
|
||
|
||
@app.route("/health")
|
||
def health():
|
||
return jsonify(status="ok")
|
||
|
||
|
||
@app.route("/")
|
||
def index():
|
||
return "Hello from Infoscreen‐API!"
|
||
|
||
|
||
@app.route("/screenshots/<uuid>")
|
||
def get_screenshot(uuid):
|
||
pattern = os.path.join("screenshots", f"{uuid}*.jpg")
|
||
files = glob.glob(pattern)
|
||
if not files:
|
||
# Dummy-Bild als Redirect oder direkt als Response
|
||
return jsonify({"error": "Screenshot not found", "dummy": "https://placehold.co/400x300?text=No+Screenshot"}), 404
|
||
filename = os.path.basename(files[0])
|
||
return send_from_directory("screenshots", filename)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
app.run(host="0.0.0.0", port=8000, debug=True)
|