{ "intro": "In der Datenbank gespeicherte Betriebseinstellungen — sie überschreiben die Datei-/Env-Standardwerte und wirken ohne erneutes Deployment. Lass ein Feld leer (oder setze es zurück), um auf den Standard zurückzufallen.", "loading": "Konfiguration wird geladen…", "groups": { "access": "Zugang", "email": "E-Mail / SMTP", "youtube": "YouTube-API", "google": "Google-Anmeldung", "quota": "Kontingent", "backfill": "Nachladen (Backfill)", "shorts": "Shorts-Prüfung", "batch": "Stapelgrößen", "explore": "Kanal erkunden", "downloads": "Downloads", "plex": "Plex" }, "fields": { "smtp_host": { "label": "SMTP-Host", "hint": "z. B. smtp.gmail.com" }, "smtp_port": { "label": "SMTP-Port", "hint": "Üblicherweise 587 (STARTTLS)." }, "smtp_user": { "label": "SMTP-Benutzername", "hint": "Das sendende Konto / der Login." }, "smtp_from": { "label": "Absenderadresse", "hint": "z. B. Siftlode . Standard ist der Benutzername." }, "smtp_password": { "label": "SMTP-Passwort", "hint": "App-Passwort. Verschlüsselt gespeichert; nur schreibbar — wird nie wieder angezeigt." }, "quota_daily_budget": { "label": "Tägliches Kontingentbudget", "hint": "YouTube-Data-API-Einheiten pro Tag (kostenloses Limit 10.000). Standard 9000 lässt Puffer." }, "backfill_quota_reserve": { "label": "Nachlade-Kontingentreserve", "hint": "Reservierte Einheiten, damit geplantes Nachladen interaktive Syncs / Anreicherung nie aushungert." }, "search_daily_limit_per_user": { "label": "Live-Suche — Tageslimit pro Nutzer", "hint": "Maximale Live-YouTube-Suchen pro Nutzer und Tag. Bei der API-Quelle kostet jede Suche 100 Einheiten (das gemeinsame Budget reicht also für insgesamt nur ~80-90/Tag); bei der Scrape-Quelle ist es ein reines Missbrauchslimit. 0 = Live-Suche deaktiviert." }, "search_source": { "label": "Quelle der Live-Suche", "hint": "Woher die Ergebnisse der Live-YouTube-Suche stammen. \"scrape\" nutzt YouTubes internen Endpunkt und verbraucht kein API-Kontingent (empfohlen). \"api\" nutzt das offizielle search.list (100 Einheiten/Seite). Auf \"api\" umstellen, falls das Scraping ausfällt oder blockiert wird." }, "backfill_recent_max_videos": { "label": "Aktuelles Nachladen — max. Videos", "hint": "Neueste Videos pro Kanal beim ersten Durchlauf." }, "backfill_recent_max_days": { "label": "Aktuelles Nachladen — max. Alter (Tage)", "hint": "Wie weit der erste Durchlauf pro Kanal zurückreicht." }, "shorts_probe_max_seconds": { "label": "Shorts-Prüfung — max. Dauer (s)", "hint": "Nur Videos bis zu dieser Länge werden als mögliche Shorts geprüft." }, "shorts_probe_batch": { "label": "Shorts-Prüfung — Stapelgröße", "hint": "Wie viele Videos pro Lauf klassifiziert werden." }, "enrich_batch_size": { "label": "Anreicherungs-Stapelgröße", "hint": "videos.list-IDs pro Aufruf (YouTube begrenzt auf 50)." }, "autotag_title_sample": { "label": "Auto-Tag-Titelstichprobe", "hint": "Pro Kanal abgetastete aktuelle Videotitel zur Spracherkennung." }, "youtube_api_key": { "label": "YouTube-API-Schlüssel", "hint": "Optional. Für öffentliche Lesezugriffe (Kanäle/Videos), damit gemeinsames Nachladen nicht vom OAuth eines Nutzers abhängt. Verschlüsselt gespeichert; nur schreibbar." }, "youtube_api_proxy": { "label": "YouTube-API-Egress-Proxy", "hint": "Optional. HTTP(S)-Proxy-URL für ausgehende YouTube-API-Aufrufe — über einen Host mit fester IP leiten, damit ein IP-beschränkter Schlüssel von einem Server mit dynamischer IP funktioniert. Leer = direkt." }, "google_client_id": { "label": "Google-Client-ID", "hint": "OAuth-2.0-Client-ID für die Google-Anmeldung. Verschlüsselt gespeichert; nur schreibbar. Beide Google-Felder leer lassen, um die Google-Anmeldung zu deaktivieren (E-Mail+Passwort funktioniert weiter)." }, "google_client_secret": { "label": "Google-Client-Secret", "hint": "OAuth-2.0-Client-Secret. Verschlüsselt gespeichert; nur schreibbar." }, "allow_registration": { "label": "Registrierung erlauben", "hint": "Wenn aktiviert, kann jeder eine E-Mail+Passwort-Registrierung einreichen. Für die Anmeldung sind weiterhin E-Mail-Bestätigung und Admin-Freigabe nötig." }, "explore_grace_days": { "label": "Erkunden — Karenzzeit (Tage)", "hint": "Wie lange ein erkundeter, nicht abonnierter Kanal (und seine flüchtigen Videos) behalten wird, bevor die Aufräumaufgabe ihn entfernt. Ein Abo behält ihn dauerhaft." }, "search_grace_days": { "label": "Suchergebnisse — Karenzzeit (Tage)", "hint": "Wie lange ein nicht behaltenes Live-Suchergebnis-Video (niemand hat es angesehen/gespeichert/abonniert) behalten wird, bevor die Entdeckungs-Aufräumaufgabe es entfernt." }, "download_total_max_bytes": { "label": "Gesamt-Cache-Limit (Bytes)", "hint": "Maximale Gesamtgröße über die Downloads aller Nutzer. 0 = unbegrenzt (die Festplatte ist die Grenze); bei Überschreitung entfernt die GC die am längsten ungenutzten Dateien." }, "download_default_max_bytes": { "label": "Standard-Kontingent pro Nutzer (Bytes)", "hint": "Wie viel Speicher ein Nutzer belegen darf, bevor neue Downloads blockiert werden. Eine Überschreibung pro Nutzer hat Vorrang. Standard 5 GiB." }, "download_default_max_concurrent": { "label": "Gleichzeitige Downloads / Nutzer", "hint": "Wie viele Downloads ein Nutzer gleichzeitig ausführen darf." }, "download_default_max_jobs": { "label": "Job-Limit / Nutzer", "hint": "Maximale Anzahl an Downloads, die ein Nutzer in seiner Bibliothek behalten darf." }, "download_retention_days": { "label": "Aufbewahrung (Tage)", "hint": "Ein Download läuft so viele Tage nach dem letzten Zugriff ab; die Aufräumaufgabe entfernt ihn dann (sobald nichts mehr darauf verweist) nach der Karenzzeit." }, "download_gc_grace_days": { "label": "Aufräum-Karenzzeit (Tage)", "hint": "Zusätzliche Tage, die ein abgelaufener Download vor dem Löschen behalten wird." }, "download_layout": { "label": "Ablage-Layout", "hint": "„plex“ = ein Kanal/Staffel JJJJ/…-Baum mit .nfo + Poster (in Plex indexierbar); „flat“ = ein einzelner Ordner." }, "download_worker_concurrency": { "label": "Worker-Parallelität", "hint": "Wie viele Downloads der Worker parallel verarbeitet." }, "sponsorblock_default": { "label": "SponsorBlock standardmäßig", "hint": "SponsorBlock (Sponsor-Segmente überspringen) für neu erstellte benutzerdefinierte Download-Profile aktivieren." }, "plex_enabled": { "label": "Plex aktivieren", "hint": "Zeigt die Plex-Bibliothek als Feed-Quelle mit einem umfangreichen Player. Erfordert, dass der Plex-Server von diesem Host erreichbar ist und die Medien auf einem lokalen Mount liegen (siehe Pfad-Zuordnung)." }, "plex_server_url": { "label": "Plex-Server-URL", "hint": "Von diesem Host erreichbare Basis-URL, z. B. http://192.168.1.100:32400." }, "plex_server_token": { "label": "Plex-Server-Token", "hint": "Der Admin-X-Plex-Token des Servers. Nur serverseitig genutzt (Metadaten + Bilder); wird nie an den Browser gesendet. Verschlüsselt gespeichert; nur schreibbar." }, "plex_path_map": { "label": "Medien-Pfad-Zuordnung", "hint": "Ordnet die Plex-Dateipfade dem lokalen Mount dieses Hosts zu, damit Siftlode die physische Datei abspielen kann. Durch Zeilenumbruch/Komma getrennte plexPrefix=localPrefix-Paare, z. B. /data=/plex-media. Leer = auf beiden Seiten identisch." }, "plex_libraries": { "label": "Angezeigte Bibliotheken", "hint": "Durch Kommas getrennte Plex-Sektionsschlüssel. Leer = alle Sektionen. Nutze nach dem Verbindungstest die Bibliotheksauswahl unten." }, "plex_sync_interval_min": { "label": "Sync-Intervall (Minuten)", "hint": "Wie oft die Katalog-Sync-Aufgabe die Plex-Metadaten spiegelt." }, "plex_max_transcodes": { "label": "Max. gleichzeitige Transcodes", "hint": "Obergrenze für gleichzeitige CPU-Transcodes inkompatibler Dateien (späterer Fallback). Direkt abspielbare Dateien sind nicht begrenzt." } }, "save": "Speichern", "saving": "Speichern…", "saved": "Gespeichert", "saveFailed": "Speichern fehlgeschlagen", "unsaved": "Nicht gespeicherte Änderungen", "discard": "Verwerfen", "willReset": "wird beim Speichern auf den Standard zurückgesetzt", "reset": "Zurücksetzen", "resetHint": "Diese Überschreibung entfernen und auf den Datei-/Env-Standard zurückfallen.", "resetDone": "Auf Standard zurückgesetzt", "usingDefault": "Standard wird verwendet", "overridden": "in der DB überschrieben", "secretSet": "•••••••• gespeichert", "secretEnv": "Env-Wert wird verwendet", "secretUnset": "nicht gesetzt", "secretsDisabled": "Setze TOKEN_ENCRYPTION_KEY, um Secrets in der Datenbank zu speichern.", "testEmail": "Test-E-Mail senden", "testEmailHint": "Sende eine Test-E-Mail an deine eigene Adresse mit den obigen Einstellungen, um zu prüfen, ob sie funktionieren.", "testSent": "Test-E-Mail gesendet an {{to}}", "testFailed": "Test-E-Mail fehlgeschlagen — prüfe die Einstellungen", "plexTest": "Verbindung testen", "plexTestHint": "Prüft die Plex-Server-URL + den Token und lädt die Bibliotheksliste. Speichere zuerst deine Änderungen.", "plexTestDirty": "Speichere deine Änderungen vor dem Verbindungstest.", "plexTestOk": "Verbunden mit {{name}}", "plexTestFailed": "Plex-Verbindung fehlgeschlagen — prüfe URL und Token", "plexConnected": "Verbunden mit {{name}} {{version}}", "plexMediaOk": "Medieneinbindung OK — eine Beispieldatei wurde auf der Festplatte gefunden.", "plexMediaMissing": "Medien unter {{path}} nicht lesbar — prüfe, ob die Plex-Medien in den Container eingebunden sind und die Pfadzuordnung stimmt. Die Wiedergabe schlägt fehl, bis dies behoben ist.", "plexPickLibraries": "Anzuzeigende Bibliotheken:", "plexPickHint": "Keine auszuwählen entspricht dem Anzeigen aller Bibliotheken. Nicht vergessen zu speichern.", "plexMovies": "Filme", "plexShows": "Serien" }