import Foundation import FlixyDesign import MediaKit /// Woher der Aufmacher seine Bilder nimmt. /// /// An **einer** Stelle, weil zwei Stellen es schon zweimal falsch gemacht /// haben: /// /// Erstens wurde das Hintergrundbild in 900×1200 angefordert — hochkant — und /// dann in einem 16:9-Rahmen gezeigt. Zu sehen war davon ein schmaler Streifen /// aus der Mitte; vom Bild fehlte oben und unten je ein Drittel. Die Maße /// richten sich jetzt nach dem Rahmen, in dem das Bild landet. /// /// Zweitens holt das Karussell das nächste Bild vor, solange das aktuelle noch /// steht. Weicht dessen Adresse auch nur in einer Zahl ab, ist es eine andere /// Adresse, der Zwischenspeicher trifft daneben und der Aufmacher blendet auf /// eine graue Fläche über. enum HeroArtwork { /// Die Maße, in denen das Hintergrundbild angefordert wird. /// /// Groß genug für ein breites Fenster, und im Seitenverhältnis des /// Rahmens, damit nichts beschnitten werden muss. static func size(compact: Bool) -> (width: Int, height: Int) { compact ? (900, 1200) : (1920, 1080) } static func aspectRatio(compact: Bool) -> CGFloat { compact ? FlixyAspectRatio.heroCompact : FlixyAspectRatio.hero } static func backdropURL(for item: MediaItem, backend: any MediaBackend, compact: Bool) -> URL? { let size = size(compact: compact) return backend.artworkURL( path: item.art ?? item.seriesArt ?? item.thumb, width: size.width, height: size.height ) } /// Der freigestellte Schriftzug — ohne Bild-Transcoder. /// /// Er ist ein PNG mit durchsichtigem Grund, und der Transcoder liefert /// JPEG. Aus dem Schriftzug würde sonst ein schwarzer Kasten. static func logoURL(for item: MediaItem, backend: any MediaBackend) -> URL? { backend.rawImageURL(path: item.clearLogoPath) } }