mkcontrol-app/app/utils/helpers.py
2026-02-16 20:38:51 +01:00

90 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# app/utils/helpers.py
import os
import json
import logging
try:
# Flask ist optional bei Aufruf außerhalb des App-Contexts fallbacken wir
from flask import current_app
except Exception: # pragma: no cover - nur wenn Flask nicht verfügbar ist
current_app = None
logger = logging.getLogger(__name__)
def _resolve_config_dir(config_dir=None):
"""
Ermittelt den zu nutzenden Config-Pfad:
1) Expliziter Parameter
2) Flask current_app.config['CONFIG_DIR']
3) Fallback: lokaler 'configs' Ordner
"""
if config_dir:
return config_dir
if current_app:
try:
return current_app.config.get('CONFIG_DIR', 'configs')
except Exception:
pass
return 'configs'
def load_configs(config_dir=None):
"""
Lädt alle .json-Konfigurationsdateien aus dem configs-Ordner,
außer default_sounds.json (die wird separat geladen).
"""
config_dir = _resolve_config_dir(config_dir)
configs = []
if not os.path.exists(config_dir):
logger.warning(f"Config-Verzeichnis nicht gefunden: {config_dir}")
return configs
for filename in os.listdir(config_dir):
if not filename.lower().endswith('.json'):
continue
if filename == 'default_sounds.json':
continue # globale Sounds separat laden
path = os.path.join(config_dir, filename)
try:
with open(path, 'r', encoding='utf-8') as f:
data = json.load(f)
data['filename'] = filename
data.setdefault('name', filename.replace('.json', '').replace('_', ' ').title())
configs.append(data)
except json.JSONDecodeError as e:
logger.error(f"Ungültiges JSON in {filename}: {e}")
except FileNotFoundError:
logger.error(f"Datei nicht gefunden (trotz listdir): {path}")
except Exception as e:
logger.error(f"Fehler beim Laden von {filename}: {e}")
return sorted(configs, key=lambda x: x.get('name', ''))
def load_default_sounds(config_dir=None):
"""
Lädt die globalen Standard-Sounds aus configs/default_sounds.json
Wird immer geladen, unabhängig von der aktuellen Lok-Konfiguration
"""
config_dir = _resolve_config_dir(config_dir)
path = os.path.join(config_dir, 'default_sounds.json')
if not os.path.exists(path):
logger.info("Keine default_sounds.json gefunden → keine globalen Sounds")
return []
try:
with open(path, 'r', encoding='utf-8') as f:
data = json.load(f)
# Flexibel: entweder 'global_sounds' oder direkt 'sounds'
sounds = data.get('global_sounds', data.get('sounds', []))
logger.info(f"Globale Default-Sounds geladen: {len(sounds)} Einträge")
return sounds
except json.JSONDecodeError as e:
logger.error(f"Ungültiges JSON in default_sounds.json: {e}")
return []
except Exception as e:
logger.error(f"Fehler beim Laden default_sounds.json: {e}")
return []