Phase 4 und Teile von Phase 5

Download-Regeln
- Automatisches Löschen nach dem Ansehen, mit Frist statt sofort: wer
  die letzte Szene noch einmal sucht, soll sie nicht schon verloren
  haben. „Nie" ist die Voreinstellung.
- „Halte N ungesehene Folgen offline": wartende und laufende Downloads
  zählen mit, sonst würde bei jedem Durchlauf nachgelegt, bis die ganze
  Serie auf dem Gerät liegt.
- Beides als reine Rechnung ohne Zugriff auf Datenbank oder Dateien —
  bei einer Regel, die Filme löscht, ist Prüfbarkeit keine Formsache.
  13 Tests.

Qualitätswahl beim Download
- transcodedDownloadURL über den Universal-Transcoder mit protocol=http
  statt über die umständliche Sync-API. NOCH NICHT AM SERVER GEPRÜFT:
  offen ist, ob Plex eine Content-Length mitschickt (sonst kein
  Fortschritt und kein Fortsetzen) und ob die Datei durchsuchbar ist.
  Steht so im Quelltext; Original bleibt Voreinstellung.

Erscheinungsbild
- Akzentfarbe: zehn kuratierte Kacheln plus freie Hex-Eingabe. Bei einer
  eigenen Farbe greift die Kontrastkorrektur und sagt es auch — sonst
  wirkt sie wie ein Fehler.
- Vorschaufläche mit Knopf, Symbol und Fortschrittsbalken.

Serveraktionen
- Gesehen-Status umschalten und Sterne setzen über ein Menü auf der
  Detailseite.
- Suchlauf der Mediathek aus der Werkzeugleiste.

115 Tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-09-11 17:40:10 +02:00
co-authored by Claude Opus 5
parent 62158303a2
commit af23372997
10 changed files with 1062 additions and 0 deletions
+385
View File
@@ -2577,6 +2577,391 @@
}
}
}
},
"settings.storageLimit": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Speicherlimit"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Storage limit"
}
}
}
},
"settings.storageUnlimited": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Unbegrenzt"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Unlimited"
}
}
}
},
"settings.deleteWatched": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Gesehenes löschen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Delete watched"
}
}
}
},
"settings.deleteNever": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Nie"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Never"
}
}
}
},
"settings.deleteImmediately": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Sofort"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Immediately"
}
}
}
},
"settings.deleteAfterDay": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Nach einem Tag"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "After a day"
}
}
}
},
"settings.deleteAfterWeek": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Nach einer Woche"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "After a week"
}
}
}
},
"settings.keepUnwatched": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Folgen vorhalten"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Keep episodes ready"
}
}
}
},
"settings.keepOff": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Aus"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Off"
}
}
}
},
"settings.keepCount %lld": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "%lld ungesehene"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "%lld unwatched"
}
}
}
},
"settings.downloadsExplanation": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Flixy lädt fehlende Folgen nach, sobald du eine gesehen hast, und entfernt Gesehenes nach der eingestellten Frist."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Flixy downloads missing episodes once you finish one, and removes watched titles after the chosen delay."
}
}
}
},
"appearance.title": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Erscheinungsbild"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Appearance"
}
}
}
},
"appearance.accent": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Akzentfarbe"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Accent color"
}
}
}
},
"appearance.accentExplanation": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Die Farbe erscheint auf Knöpfen, Fortschrittsbalken und der ausgewählten Zeile in der Seitenleiste."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "The color appears on buttons, progress bars and the selected row in the sidebar."
}
}
}
},
"appearance.customColor": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Eigene Farbe"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Custom color"
}
}
}
},
"appearance.hexPlaceholder": {
"comment": "Beispiel für eine Hex-Farbe",
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "#1DB954"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "#1DB954"
}
}
}
},
"appearance.invalidHex": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Das ist keine gültige Farbe. Erwartet wird etwas wie #1DB954."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "That's not a valid color. Try something like #1DB954."
}
}
}
},
"appearance.adjusted %@": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Die Farbe wurde auf %@ aufgehellt, damit sie auf dem dunklen Hintergrund lesbar bleibt."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Lightened to %@ so it stays readable on the dark background."
}
}
}
},
"appearance.preview": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Vorschau"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Preview"
}
}
}
},
"action.markWatched": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Als gesehen markieren"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Mark as watched"
}
}
}
},
"action.markUnwatched": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Als ungesehen markieren"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Mark as unwatched"
}
}
}
},
"action.rate": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Bewerten"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Rate"
}
}
}
},
"action.clearRating": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Bewertung entfernen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Clear rating"
}
}
}
},
"library.scan": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Mediathek durchsuchen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Scan library"
}
}
}
}
},
"version": "1.1"