added themes to soundboard

This commit is contained in:
2026-02-18 22:04:02 +01:00
parent 5f9920f096
commit 21c0b13b8d
17 changed files with 320 additions and 142 deletions
+57
View File
@@ -87,3 +87,60 @@ def load_default_sounds(config_dir=None):
except Exception as e:
logger.error(f"Fehler beim Laden default_sounds.json: {e}")
return []
# ---------- Soundboard-Themen ----------
def load_soundboard_configs(config_dir=None):
"""
Lädt alle Soundboard-Themen aus einem separaten Ordner (z. B. soundboards/).
Unterstützt Unterordner. Jede *.json gilt als Thema (z. B. soundboards/station/theme.json).
Erwartet Schema mit keys wie backgrounds / random_pool / sounds.
"""
config_dir = config_dir or _resolve_config_dir(None)
configs = []
if not os.path.exists(config_dir):
logger.warning(f"Soundboard-Verzeichnis nicht gefunden: {config_dir}")
return configs
for root, _, files in os.walk(config_dir):
for filename in files:
if not filename.lower().endswith('.json'):
continue
rel_path = os.path.relpath(os.path.join(root, filename), config_dir)
try:
with open(os.path.join(config_dir, rel_path), 'r', encoding='utf-8') as f:
data = json.load(f)
data['filename'] = rel_path # relativer Pfad ab soundboards/
data.setdefault('name', filename.replace('.json', '').replace('_', ' ').title())
configs.append(data)
except Exception as e:
logger.error(f"Fehler beim Laden Soundboard {rel_path}: {e}")
return sorted(configs, key=lambda x: x.get('name', ''))
def load_soundboard_config(filename, config_dir, sounds_dir=None):
"""
Lädt ein Soundboard-Theme. Falls die Theme-Datei in Unterordnern liegt,
wird ein basis Sound-Pfad auf denselben relativen Unterordner unterhalb von sounds/ gesetzt.
Alle Einträge (backgrounds/sounds/random_pool) erhalten ein 'base_path'.
"""
sounds_dir = sounds_dir or 'sounds'
path = os.path.normpath(os.path.join(config_dir, filename))
if not path.startswith(os.path.abspath(config_dir)):
raise ValueError("Ungültiger Pfad")
rel_dir = os.path.dirname(filename) # z.B. "station" oder "urban/night"
base_sound_dir = os.path.normpath(os.path.join(sounds_dir, rel_dir)) if rel_dir else sounds_dir
with open(path, 'r', encoding='utf-8') as f:
data = json.load(f)
data['filename'] = filename # relative Angabe beibehalten
data.setdefault('name', filename.replace('.json', '').replace('_', ' ').title())
data['base_sound_dir'] = base_sound_dir
for key in ('backgrounds', 'sounds', 'random_pool'):
if key in data and isinstance(data[key], list):
for item in data[key]:
item.setdefault('base_path', base_sound_dir)
return data