Queue mgmt, Podcast support, Favorites section.
This commit is contained in:
@@ -428,6 +428,55 @@ struct MAPlaylist: Codable, Identifiable, Hashable {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Podcast
|
||||
|
||||
struct MAPodcast: Codable, Identifiable, Hashable {
|
||||
let uri: String
|
||||
let name: String
|
||||
let publisher: String?
|
||||
let totalEpisodes: Int?
|
||||
let metadata: MediaItemMetadata?
|
||||
let favorite: Bool
|
||||
|
||||
var id: String { uri }
|
||||
var imageUrl: String? { metadata?.thumbImage?.path }
|
||||
var imageProvider: String? { metadata?.thumbImage?.provider }
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case uri, name, publisher, metadata, favorite
|
||||
case totalEpisodes = "total_episodes"
|
||||
}
|
||||
|
||||
init(uri: String, name: String, publisher: String? = nil, totalEpisodes: Int? = nil, imageUrl: String? = nil, favorite: Bool = false) {
|
||||
self.uri = uri
|
||||
self.name = name
|
||||
self.publisher = publisher
|
||||
self.totalEpisodes = totalEpisodes
|
||||
self.favorite = favorite
|
||||
self.metadata = imageUrl.map {
|
||||
MediaItemMetadata(images: [MediaItemImage(type: "thumb", path: $0, provider: nil, remotelyAccessible: nil)], cacheChecksum: nil)
|
||||
}
|
||||
}
|
||||
|
||||
init(from decoder: Decoder) throws {
|
||||
let c = try decoder.container(keyedBy: CodingKeys.self)
|
||||
uri = try c.decode(String.self, forKey: .uri)
|
||||
name = try c.decode(String.self, forKey: .name)
|
||||
publisher = try? c.decodeIfPresent(String.self, forKey: .publisher)
|
||||
totalEpisodes = try? c.decodeIfPresent(Int.self, forKey: .totalEpisodes)
|
||||
favorite = (try? c.decode(Bool.self, forKey: .favorite)) ?? false
|
||||
metadata = try? c.decodeIfPresent(MediaItemMetadata.self, forKey: .metadata)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Repeat Mode
|
||||
|
||||
enum RepeatMode: String, Codable, CaseIterable {
|
||||
case off
|
||||
case one
|
||||
case all
|
||||
}
|
||||
|
||||
// MARK: - Player Queue State
|
||||
|
||||
/// Represents the state of a player's queue, including the currently playing item.
|
||||
@@ -440,6 +489,8 @@ struct MAPlayerQueue: Codable {
|
||||
let elapsedTime: Double?
|
||||
/// Unix timestamp when `elapsedTime` was last set by the server.
|
||||
let elapsedTimeLastUpdated: Double?
|
||||
let shuffleEnabled: Bool
|
||||
let repeatMode: RepeatMode
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case queueId = "queue_id"
|
||||
@@ -447,6 +498,8 @@ struct MAPlayerQueue: Codable {
|
||||
case currentIndex = "current_index"
|
||||
case elapsedTime = "elapsed_time"
|
||||
case elapsedTimeLastUpdated = "elapsed_time_last_updated"
|
||||
case shuffleEnabled = "shuffle_enabled"
|
||||
case repeatMode = "repeat_mode"
|
||||
}
|
||||
|
||||
init(from decoder: Decoder) throws {
|
||||
@@ -456,6 +509,8 @@ struct MAPlayerQueue: Codable {
|
||||
currentIndex = try? c.decodeIfPresent(Int.self, forKey: .currentIndex)
|
||||
elapsedTime = try? c.decodeIfPresent(Double.self, forKey: .elapsedTime)
|
||||
elapsedTimeLastUpdated = try? c.decodeIfPresent(Double.self, forKey: .elapsedTimeLastUpdated)
|
||||
shuffleEnabled = (try? c.decode(Bool.self, forKey: .shuffleEnabled)) ?? false
|
||||
repeatMode = (try? c.decode(RepeatMode.self, forKey: .repeatMode)) ?? .off
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user