import Foundation /// Wonach eine Mediathek durchsucht wird. /// /// Gefiltert und sortiert wird **auf dem Server**. Alles hierher zu holen und /// selbst zu sieben wäre bei einer Mediathek mit fünftausend Folgen /// aussichtslos — und die Server können es ohnehin besser. /// /// Die Sortierarten sind neutral benannt. Vorher standen hier Plex' /// Drahtwerte (`"titleSort:asc"`), was bedeutete: entweder Jellyfin lernt /// Plex' Schreibweise, oder jede Ansicht muss wissen, mit wem sie spricht. public struct MediaQuery: Sendable, Equatable { public enum Sort: String, Sendable, Equatable, CaseIterable { case titleAscending, titleDescending case recentlyAdded case releaseDate case rating case lastPlayed } /// Wonach gefiltert werden kann. public enum Field: String, Sendable, Equatable { case genre, year, contentRating, resolution } public var sort: Sort public var unwatchedOnly: Bool public var favouritesOnly: Bool public var genre: String? public var year: Int? public var contentRating: String? public var resolution: String? /// Freitextsuche innerhalb der Mediathek. public var searchText: String? public init( sort: Sort = .titleAscending, unwatchedOnly: Bool = false, favouritesOnly: Bool = false, genre: String? = nil, year: Int? = nil, contentRating: String? = nil, resolution: String? = nil, searchText: String? = nil ) { self.sort = sort self.unwatchedOnly = unwatchedOnly self.favouritesOnly = favouritesOnly self.genre = genre self.year = year self.contentRating = contentRating self.resolution = resolution self.searchText = searchText } /// Ob überhaupt eingeschränkt wird — steuert die Anzeige des Filterknopfs. public var isFiltering: Bool { unwatchedOnly || favouritesOnly || genre != nil || year != nil || contentRating != nil || resolution != nil } }