Einstellungen: sechs Bildschirme statt einer Liste — und was sie steuern

Deine Einstellungs-Bilder sind eine lange Liste. Ich habe sie durchgegangen
und getrennt: was etwas steuert, ist gebaut; was eine Einstellung für eine
Sache wäre, die es nicht gibt, ist nicht gebaut. Ein Schalter, der nichts
bewirkt, ist schlimmer als kein Schalter.

**Die Einstellungen sind jetzt eine Übersicht.** Vorher stand alles
untereinander auf einem Bildschirm — Serverangaben, Qualität, Wiedergabe, drei
Verweise, Downloads, Version, Abmelden. Das war beim Bauen bequem und beim
Suchen anstrengend. Jetzt führt jede Zeile in einen Bildschirm, der zu einer
Frage gehört: Server, Erscheinungsbild, Startseite, Wiedergabe, Ton &
Untertitel, Downloads, Diagnose.

**Neu, und jedes davon greift irgendwo:**

- Zurück- und Vorspulen getrennt einstellbar. Die Knöpfe im Player und die
  Doppeltipp-Flächen tragen danach auch das passende Symbol.
- Startgeschwindigkeit — die Engine kann es längst, gefragt wurde nie.
- „Im Querformat sperren" abschaltbar. Für die allermeisten Filme richtig, für
  den, der im Bett auf der Seite liegt, das Gegenteil.
- „Gewählte Qualität merken": die Stufe gilt dann auch für den nächsten Titel.
  Aufbewahrt wird eine **Zahl**, keine Sprosse — welche Sprossen es gibt, hängt
  von der Quelle ab, und eine 720p-Datei kennt keine Zwanzig-Megabit-Stufe.
  Dann kommt die nächstgelegene, nicht „automatisch".
- „Bitrate im Qualitätsmenü zeigen".
- Gleichzeitige Downloads. Der Wert gab es schon in der Engine, nur ohne
  Bedienung und ohne dass er einen Neustart überlebte.
- Aufmacher: wie viele Titel, und ob sie aus Angefangenem oder nur aus
  Neuzugängen kommen.
- „Weiterschauen und Als Nächstes zusammenlegen" und „Gesehenes aus
  Neuzugängen ausblenden" — beides in der Ansicht, nicht im Server: das sind
  Fragen der Darstellung, und so gelten sie für Plex und Jellyfin gleich.

**Verkleinert herunterladen geht jetzt auch bei Jellyfin.** Da hatte ich zu
früh aufgegeben: ich hatte nur nach der Adresse zum *Abspielen* gesucht, und
die ist eine Abspielliste mit hunderten Schnipseln — als Datei unbrauchbar.
`/Videos/{id}/stream.mp4` gibt dieselbe Umrechnung als eine Datei heraus. Die
Größe bleibt eine Schätzung; eine Umrechnung, die erst beim Abruf beginnt,
kennt ihre eigene Länge nicht.

**Die Kontozeile ist jetzt eine Karte, die nach oben aufklappt**, kein
Systemmenü mehr. Ein Menü legt sich als eigene Ebene über alles und springt
dorthin, wo Platz ist; die Karte bleibt, wo sie ist, und lässt die Zeile mit
dem Namen stehen — man sieht also weiter, um wessen Konto es geht.

**Nicht gebaut, mit Grund:** Trailer im Karussell, Poster- und Sammlungsstil,
Untertitel-Aussehen, sekundäre Untertitel, lokale Intros, Modular Home,
App-Symbol. Für all das fehlt das, was die Einstellung steuern würde — es gibt
in Flixy weder Trailer noch Sammlungen, und der Player zeichnet Untertitel
nicht selbst.

263 Tests grün. **Nicht angesehen**: der Simulator-Tunnel ist weiterhin
abgestürzt und ließ sich nicht wieder aufbauen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-13 14:56:08 +02:00
co-authored by Claude Opus 5
parent 3f6c6d8816
commit dace5d1543
19 changed files with 1313 additions and 321 deletions
+451
View File
@@ -33,7 +33,24 @@
"comment": "A label for a 720p movie.",
"isCommentAutoGenerated": true
},
"account.hint": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Öffnet Einstellungen und Abmelden"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Opens settings and sign out"
}
}
}
},
"account.settings": {
"extractionState": "stale",
"localizations": {
"de": {
"stringUnit": {
@@ -1813,6 +1830,22 @@
}
}
},
"home.combineContinue": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Weiterschauen und Als Nächstes zusammenlegen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Merge Continue and Next Up"
}
}
}
},
"home.empty.description": {
"localizations": {
"de": {
@@ -1846,6 +1879,134 @@
}
}
},
"home.hero": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Aufmacher"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Featured"
}
}
}
},
"home.heroCount": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Titel im Wechsel"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Titles in rotation"
}
}
}
},
"home.heroExplanation": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Der Aufmacher wandert alle sieben Sekunden weiter und hört damit auf, sobald du ihn berührst."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "The featured area moves on every seven seconds and stops as soon as you touch it."
}
}
}
},
"home.heroSource": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Inhalt"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Content"
}
}
}
},
"home.heroSource.continueFirst": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Angefangenes zuerst"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Started titles first"
}
}
}
},
"home.heroSource.latestOnly": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Nur Neuzugänge"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "New arrivals only"
}
}
}
},
"home.hideWatched": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Gesehenes aus Neuzugängen ausblenden"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Hide watched titles from new arrivals"
}
}
}
},
"home.rowsHeader": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Reihen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Rows"
}
}
}
},
"homeLayout.empty": {
"localizations": {
"de": {
@@ -1911,6 +2072,7 @@
}
},
"languages.audio": {
"extractionState": "stale",
"localizations": {
"de": {
"stringUnit": {
@@ -1975,6 +2137,7 @@
}
},
"languages.subtitles": {
"extractionState": "stale",
"localizations": {
"de": {
"stringUnit": {
@@ -3606,6 +3769,54 @@
}
}
},
"settings.concurrent": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Höchstens gleichzeitig"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "At most at once"
}
}
}
},
"settings.concurrentExplanation": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Eine ganze Staffel auf einmal zu laden teilt die Leitung so auf, dass keine Folge fertig wird. Unterwegs ist eine fertige Folge mehr wert als zehn halbe."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Loading a whole season at once splits the line so that no episode finishes. On the move, one finished episode beats ten half ones."
}
}
}
},
"settings.concurrentHeader": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Gleichzeitige Downloads"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Concurrent downloads"
}
}
}
},
"settings.connection": {
"extractionState": "stale",
"localizations": {
@@ -3674,6 +3885,54 @@
}
}
},
"settings.controls": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Steuerung"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Controls"
}
}
}
},
"settings.controlsExplanation": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Zurück und vor lassen sich getrennt einstellen: zurück springt man, weil man etwas nicht verstanden hat — vor, weil man etwas überspringen will."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Back and forward are set separately: you jump back because you missed something, and forward because you want to skip something."
}
}
}
},
"settings.defaultRate": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Startgeschwindigkeit"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Starting speed"
}
}
}
},
"settings.deleteAfterDay": {
"localizations": {
"de": {
@@ -3771,6 +4030,38 @@
}
}
},
"settings.episodes": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Folgen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Episodes"
}
}
}
},
"settings.forward": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Vorspulen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Fast-forward"
}
}
}
},
"settings.keepCount %@": {
"comment": "A label that lets the user choose how many episodes of a series to keep after they've finished watching them all. The argument is the number of episodes to keep.",
"isCommentAutoGenerated": true
@@ -3841,6 +4132,38 @@
}
}
},
"settings.lockLandscape": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Im Querformat sperren"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Lock to landscape"
}
}
}
},
"settings.lockLandscapeExplanation": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Der Player dreht beim Öffnen ins Querformat und bleibt dort. Abgeschaltet folgt er dem Gerät — für den, der im Liegen schaut."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "The player rotates to landscape when it opens and stays there. Switched off it follows the device — for watching while lying down."
}
}
}
},
"settings.playback": {
"extractionState": "stale",
"localizations": {
@@ -3924,6 +4247,70 @@
}
}
},
"settings.rateNormal": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Normal"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Normal"
}
}
}
},
"settings.rememberQuality": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Gewählte Qualität merken"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Remember the chosen quality"
}
}
}
},
"settings.rememberQualityExplanation": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Die im Player gewählte Stufe gilt dann auch für den nächsten Titel. Gibt es sie dort nicht, wird die nächstgelegene genommen."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "The step you pick in the player then applies to the next title as well. If it isn't available there, the closest one is used."
}
}
}
},
"settings.rewind": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Zurückspulen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Rewind"
}
}
}
},
"settings.scanExplanation": {
"localizations": {
"de": {
@@ -3940,6 +4327,54 @@
}
}
},
"settings.seconds %lld": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "%lld Sekunden"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "%lld seconds"
}
}
}
},
"settings.section.look": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Darstellung"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Appearance"
}
}
}
},
"settings.section.playing": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Wiedergabe & Offline"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Playback & offline"
}
}
}
},
"settings.server": {
"extractionState": "stale",
"localizations": {
@@ -3991,6 +4426,22 @@
}
}
},
"settings.showBitrate": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Bitrate im Qualitätsmenü zeigen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Show the bitrate in the quality menu"
}
}
}
},
"settings.signOutConfirm": {
"localizations": {
"de": {