Queue mgmt, Podcast support, Favorites section.

This commit is contained in:
2026-04-08 10:26:50 +02:00
parent f55b7e478b
commit d7e7bef83f
14 changed files with 1177 additions and 60 deletions
@@ -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
}
}