0832ef777c
Ampel / ampel (push) Successful in 27s
Aus dem Weitergabe-Review. Kein Verhaltenswechsel fuer den Ursprungs-Host (alle Defaults = bisheriges Verhalten): Portabilitaet: - Laufwerk-Geraeteknoten via .env parametrisiert (OPTICAL_SR/OPTICAL_SG, Defaults sr0/sg1) - der #1-Blocker: auf Fremdhosts liegt das sg-Node woanders. - deploy.sh generisch (RIPPY_VM/RIPPY_REPO_URL/... aus der Umgebung) - keine festen Besitzer-Adressen (interne IP + DDNS) mehr im Repo. - POSTGRES_PASSWORD in compose durchverdrahtet (Default rippy) - war No-op. Aufraeumen (toter/irrefuehrender Code): - udev/ entfernt (fehlende Regeldatei, falscher Container-Name; durch ioctl- Polling ersetzt - reine Altlast). - docker/postgres/*, docker/redis/*, init.sql entfernt (nie eingebunden). Onboarding: - FirstRunWizard verdrahtet: App.tsx fragt GET /setup und zeigt den Einrichtungs-Assistenten beim ersten Start (war gebaut, aber nie gerendert). Doku: - README: Laufwerk-Abschnitt auf .env, ENV-Tabelle (OPTICAL_*/POSTGRES), rshared-Anleitung, neuer Abschnitt "Haertung fuer fremde/exponierte Netze". - config_validation.py: TMDB Pflicht->empfohlen, Zeichensalat-Tippfehler gefixt. - .env.example: TMDB-Wording, OPTICAL_*-Variablen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
"""Validation für Rippy Configuration."""
|
|
|
|
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-Key ist EMPFOHLEN, nicht zwingend: main.py fängt diesen Fehler ab und
|
|
# gibt nur eine Warnung aus — die API startet auch ohne Key, und der Key lässt
|
|
# sich jederzeit im UI (Einstellungen → System) nachtragen.
|
|
if not settings.tmdb_api_key:
|
|
raise ConfigValidationError(
|
|
"TMDB_API_KEY ist nicht gesetzt (empfohlen für Metadaten-Lookup).\n"
|
|
"Kostenlosen Key auf https://www.themoviedb.org/ holen und als\n"
|
|
"Umgebungsvariable TMDB_API_KEY setzen — oder später im UI eintragen."
|
|
)
|
|
|
|
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."
|
|
)
|
|
|
|
return settings, warnings
|