PlexPlayer: when the stream session can't start, show why instead of an eternal spinner — 404 (physical file unreachable: missing media mount / wrong path map), 501 (format needs transcoding), or a generic failure; also catch fatal hls.js errors. ConfigPanel: render the Test-connection media_check (mount OK, or a warning naming the unreadable local path). New plex/config i18n in en/hu/de.
203 lines
10 KiB
JSON
203 lines
10 KiB
JSON
{
|
|
"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 <addr@gmail.com>. 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"
|
|
}
|