import Foundation /// Eine im Player wählbare Qualitätsstufe. /// /// Getrennt von den Einstellungen unter „Qualität": dort steht, was /// üblicherweise gelten soll; hier greift man für diesen einen Film ein — weil /// es gerade ruckelt oder weil man ausnahmsweise das Original will. public enum PlayerQuality: String, Sendable, CaseIterable, Identifiable { /// Was in den Einstellungen für die aktuelle Verbindung hinterlegt ist. case automatic /// Die Datei unverändert, ohne Umrechnung. case original case fullHD case hd case low public var id: String { rawValue } /// Obergrenze in Kilobit. `nil` bei `automatic` und `original`. public var maximumBitrate: Int? { switch self { case .automatic, .original: nil case .fullHD: 8_000 case .hd: 4_000 case .low: 2_000 } } public var resolution: String? { switch self { case .automatic, .original: nil case .fullHD: "1920x1080" case .hd: "1280x720" case .low: "854x480" } } /// Ob diese Stufe eine Umrechnung erzwingt. /// /// `original` erzwingt das Gegenteil: keine Umrechnung, auch wenn die /// Einstellungen eine Grenze vorsehen. public var forcesTranscode: Bool { switch self { case .automatic, .original: false case .fullHD, .hd, .low: true } } /// Die Richtlinie für diese Stufe. /// /// `automatic` reicht durch, was ohnehin gilt. Die übrigen überschreiben /// sie — das ist der Zweck eines Eingriffs im Player. public func policy(basedOn base: PlaybackPolicy) -> PlaybackPolicy { switch self { case .automatic: base case .original: // Keine Grenze und kein Umrechnen: ausdrücklich das Original. PlaybackPolicy(allowsTranscoding: false, allowsFallbackEngine: true, maximumBitrate: nil) case .fullHD, .hd, .low: // Ohne Ersatzmotor, damit die Entscheidung zwangsläufig beim // Transcoder landet — sonst spielte VLC die Datei direkt ab und // die gewählte Stufe bliebe wirkungslos. PlaybackPolicy( allowsTranscoding: true, allowsFallbackEngine: false, maximumBitrate: maximumBitrate ) } } }