iPad meldete sich nie an Die Ursache ist unangenehm speziell: Wer im Browser schon bei Plex angemeldet ist, wird von app.plex.tv/auth sofort auf watch.plex.tv weitergeschickt — OHNE dass der Code verknüpft wird. Man sieht sich angemeldet, die App wartet vergeblich, und es gibt keinerlei Hinweis. Jetzt wird plex.tv/link mit eingetragenem Code geöffnet. Diese Seite tut nur eine Sache: den Code bestätigen. Die Gerätekennung steckt ohnehin schon im PIN. Dazu ein Ausweg: bleibt es nach fünfzehn Sekunden ohne Token, erscheint der Code im Anmeldebildschirm zum Abtippen. Schließt man das Fenster ohne Erfolg, bleibt er stehen statt abzumelden — er gilt weiter. Download fragte nicht nach der Qualität Jetzt Original, Full HD, HD oder Sparsam, jeweils mit geschätzter Größe. Die Größe ist das eigentliche Entscheidungskriterium — „Full HD" allein sagt nicht, ob es aufs Telefon passt. Die komprimierten Stufen laufen über den Universal-Transcoder und sind weiterhin NICHT am Server geprüft; steht so im Quelltext. Schwarzes Bild ohne Anzeige Der Player kannte nur „spielt" und „spielt nicht". Wartete er auf Daten, stand man vor einem Standbild ohne Hinweis. Es gibt jetzt einen eigenen Pufferzustand mit Anzeige. Aufmacher war beschnitten Er stand auf 3:4, Plex liefert als `art` aber 16:9 — mit scaledToFill ging links und rechts je ein Viertel verloren, ohne dass man es dem Bild ansah. Die Seitenverhältnisse liegen jetzt an einer Stelle in FlixyAspectRatio. Schwarze Leiste über dem Aufmacher .ultraThinMaterial statt undurchsichtigem Grund: das Bild läuft unscharf hinter der Leiste weiter, statt an einer harten Kante zu enden. Weichgezeichnet, nicht abgedunkelt. 139 Tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
58 lines
2.4 KiB
Swift
58 lines
2.4 KiB
Swift
import SwiftUI
|
|
|
|
/// Die Schriftskala der App.
|
|
///
|
|
/// Durchgehend die Systemschrift mit `Font.TextStyle` als Grundlage, damit
|
|
/// Dynamic Type wirkt. Die Rolle steht im Namen, nicht die Größe — sonst
|
|
/// führt jede Anpassung zu einer Suche quer durch alle Views.
|
|
extension Font {
|
|
/// Der Titel im Aufmacher-Bild.
|
|
public static let flixyHero = Font.system(.largeTitle, design: .default, weight: .bold)
|
|
/// Titel auf Detailseiten.
|
|
public static let flixyTitle = Font.system(.title2, design: .default, weight: .semibold)
|
|
/// Überschrift einer Reihe auf der Startseite.
|
|
public static let flixyRowHeader = Font.system(.headline, design: .default, weight: .semibold)
|
|
/// Titel unter einem Poster.
|
|
public static let flixyCardTitle = Font.system(.subheadline, design: .default, weight: .medium)
|
|
/// Fließtext, Beschreibungen.
|
|
public static let flixyBody = Font.system(.body)
|
|
/// Jahreszahl, Laufzeit, Auflösung — alles, was neben dem Titel steht.
|
|
public static let flixyCaption = Font.system(.caption)
|
|
}
|
|
|
|
/// Abstände.
|
|
///
|
|
/// Eine Skala statt frei gewählter Zahlen: dadurch stimmen die Ränder zwischen
|
|
/// Bildschirmen überein, ohne dass man sie einzeln nachmisst.
|
|
public enum FlixySpacing {
|
|
public static let tight: CGFloat = 4
|
|
public static let snug: CGFloat = 8
|
|
public static let regular: CGFloat = 12
|
|
public static let loose: CGFloat = 16
|
|
public static let section: CGFloat = 24
|
|
/// Der seitliche Rand des Inhalts zum Bildschirmrand.
|
|
public static let screenMargin: CGFloat = 16
|
|
}
|
|
|
|
public enum FlixyRadius {
|
|
public static let card: CGFloat = 8
|
|
public static let sheet: CGFloat = 16
|
|
public static let control: CGFloat = 10
|
|
}
|
|
|
|
/// Die Seitenverhältnisse, in denen Plex seine Bilder liefert.
|
|
///
|
|
/// An einer Stelle, weil ein falscher Wert nicht auffällt, sondern nur
|
|
/// beschneidet: ein 16:9-Hintergrundbild in einem 3:4-Rahmen verliert links
|
|
/// und rechts je ein Viertel, und man sieht dem Ergebnis nicht an, dass etwas
|
|
/// fehlt.
|
|
public enum FlixyAspectRatio {
|
|
/// Kinoplakate im Hochformat.
|
|
public static let poster: CGFloat = 2.0 / 3.0
|
|
/// Szenenbilder und Hintergrundbilder.
|
|
public static let landscape: CGFloat = 16.0 / 9.0
|
|
/// Der Aufmacher auf der Startseite — dasselbe wie `landscape`, weil Plex
|
|
/// dafür `art` liefert.
|
|
public static let hero: CGFloat = landscape
|
|
}
|