feat(ui): SoC Refactoring & Config Validation
- Theme Context ausgelagert (ThemeContext.tsx + useDarkMode.ts) - Config Validation mit TMDB-API-Key Pflicht (config_validation.py) - Cache Key Centralization (cache/keys.py) - CD-Ripping mit abcde implementiert (Worker) - Docker Compose mit Healthchecks & LOG_LEVEL - ROADMAP.md & SAVEPOINT.md aktualisiert
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
"""Validation für Rippy Configuration."""
|
||||
|
||||
from typing import Optional
|
||||
from pydantic import ValidationError
|
||||
from config import Settings
|
||||
|
||||
|
||||
class ConfigValidationError(Exception):
|
||||
"""Wird geworfen, wenn die Konfiguration ungültig ist."""
|
||||
pass
|
||||
|
||||
|
||||
def validate_config() -> Settings:
|
||||
"""Validiere Konfiguration und wirf Fehler bei fehlenden Pflicht-Werten."""
|
||||
try:
|
||||
settings = Settings()
|
||||
|
||||
# TMDB API Key ist Pflicht (gemäß KONZEPT.md)
|
||||
if not settings.tmdb_api_key:
|
||||
raise ConfigValidationError(
|
||||
"TMDB_API_KEY ist erforderlich für Metadaten-Lookup.\n"
|
||||
"Hole dir einen免费en Key auf https://www.themoviedb.org/\n"
|
||||
"Setze ihn als Umgebungsvariable: TMDB_API_KEY=dein_key"
|
||||
)
|
||||
|
||||
return settings
|
||||
except ValidationError as e:
|
||||
raise ConfigValidationError(f"Konfigurationsfehler: {e}")
|
||||
|
||||
|
||||
def get_config_with_fallback() -> tuple[Settings, list[str]]:
|
||||
"""Hole Konfiguration mit Fallback-Werten für optionale Felder.
|
||||
|
||||
Returns:
|
||||
tuple: (Settings, List of warnings)
|
||||
"""
|
||||
settings = Settings()
|
||||
warnings = []
|
||||
|
||||
# Optional: TVDb API Key (Fallback auf TMDB)
|
||||
if not settings.thetvdb_api_key:
|
||||
warnings.append(
|
||||
"THETVDB_API_KEY nicht gesetzt. TheTVDB-Fallback wird verwendet."
|
||||
)
|
||||
|
||||
# Optional: MusicBrainz User (Fallback auf öffentlichen Zugriff)
|
||||
if not settings.musicbrainz_user:
|
||||
warnings.append(
|
||||
"MUSICBRAINZ_USER nicht gesetzt. Öffentlicher Zugriff wird verwendet."
|
||||
)
|
||||
|
||||
# Optional: JWT Secret (wird generiert, wenn nicht gesetzt)
|
||||
if not settings.jwt_secret_key:
|
||||
warnings.append(
|
||||
"JWT_SECRET_KEY nicht gesetzt. Auto-Generierung wird verwendet."
|
||||
)
|
||||
|
||||
return settings, warnings
|
||||
Reference in New Issue
Block a user