Ergänzung Active Button

This commit is contained in:
Erik Thiele
2026-06-26 15:10:38 +02:00
parent 22ed03c8fa
commit 1243910d4b
7 changed files with 6292 additions and 2546 deletions

30
app.py
View File

@@ -12,10 +12,12 @@ import os
import json
import hashlib
import re
import time
import generate_welcome_page # Logo-Suche und Willkommensseite-Generierung
from functools import wraps
from datetime import datetime
from pathlib import Path
from flask import (
Flask, jsonify, render_template,
@@ -40,7 +42,7 @@ CONFIG_FILE = os.path.join(BASE_DIR, "config.json") # Persistente Konfiguration
USERS_FILE = os.path.join(BASE_DIR, "users.json") # User-Datenbank
HISTORY_FILE = os.path.join(BASE_DIR, "history.json") # Aktivitätsverlauf
APP_VERSION = "6.0.2"
APP_VERSION = "6.0.3"
UPLOAD_EXTENSIONS = {".jpg", ".jpeg", ".png", ".mp4"}
app = Flask(__name__)
@@ -68,7 +70,25 @@ def save_config(cfg):
"""Schreibt das Config-Dict zurück in die config.json."""
with open(CONFIG_FILE, "w") as f:
json.dump(cfg, f, indent=2)
f.flush()
HEARTBEAT_DIR = Path("/tmp/signage-heartbeat")
HEARTBEAT_TIMEOUT = 60 # Sekunden
def record_heartbeat(site, screen):
"""Aktualisiert den Heartbeat-Timestamp für einen Screen."""
path = HEARTBEAT_DIR / site / screen
path.parent.mkdir(parents=True, exist_ok=True)
path.touch()
def screen_is_active(site, screen):
"""Prüft, ob ein Screen zuletzt innerhalb des Timeouts registriert wurde."""
path = HEARTBEAT_DIR / site / screen
if not path.exists():
return False
return (time.time() - path.stat().st_mtime) < HEARTBEAT_TIMEOUT
def get_site_list(cfg):
@@ -737,7 +757,9 @@ def player(site, screen):
@app.route("/playlist/<site>/<screen>/hash")
def playlist_hash(site, screen):
"""Berechnet einen MD5-Hash über die aktuelle Konfiguration (Screen + Priority).
Gibt JSON mit Hash und aktuellem stay_on_first-Wert zurück."""
Gibt JSON mit Hash und aktuellem stay_on_first-Wert zurück.
Zeichnet gleichzeitig den Heartbeat auf (Player aktiv)."""
record_heartbeat(site, screen)
config = load_config()
relevant = {
@@ -921,7 +943,7 @@ def admin(site):
screens[screen_name] = screen_cfg
media_files[screen_name] = files
screen_status[screen_name] = "active" if files else "empty"
screen_status[screen_name] = "online" if screen_is_active(current_site, screen_name) else "offline"
return render_template(
"admin.html",