From b1937bfc16675ca6818421f103bb7329bf066836 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 30 Jun 2026 22:43:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=96=B0=E5=A2=9Eavai?= =?UTF-8?q?lability=E5=AD=97=E6=AE=B5=E5=AF=BC=E8=87=B4JSON=E8=A7=A3?= =?UTF-8?q?=E7=A0=81=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 自定义init(from decoder:),为新增字段提供默认值: - availability默认.unknown - 兼容旧版JSON数据,避免解码失败清空媒体库 --- Sources/MediaLibrary.swift | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Sources/MediaLibrary.swift b/Sources/MediaLibrary.swift index b7ba478..fa9ca2b 100644 --- a/Sources/MediaLibrary.swift +++ b/Sources/MediaLibrary.swift @@ -24,6 +24,11 @@ struct LibraryItem: Identifiable, Codable, Equatable { var logoURL: String? // M3U tvg-logo var availability: StreamAvailability // 流可用性 + enum CodingKeys: String, CodingKey { + case id, url, name, type, lastPosition, liked, disliked, tags + case addedAt, group, logoURL, availability + } + init(id: String = UUID().uuidString, url: String, name: String, type: String = "url", lastPosition: Double = 0, liked: Bool = false, disliked: Bool = false, @@ -43,6 +48,22 @@ struct LibraryItem: Identifiable, Codable, Equatable { self.availability = availability } + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + id = try container.decode(String.self, forKey: .id) + url = try container.decode(String.self, forKey: .url) + name = try container.decode(String.self, forKey: .name) + type = try container.decode(String.self, forKey: .type) + lastPosition = try container.decodeIfPresent(Double.self, forKey: .lastPosition) ?? 0 + liked = try container.decodeIfPresent(Bool.self, forKey: .liked) ?? false + disliked = try container.decodeIfPresent(Bool.self, forKey: .disliked) ?? false + tags = try container.decodeIfPresent([String].self, forKey: .tags) ?? [] + addedAt = try container.decode(Date.self, forKey: .addedAt) + group = try container.decodeIfPresent(String.self, forKey: .group) + logoURL = try container.decodeIfPresent(String.self, forKey: .logoURL) + availability = try container.decodeIfPresent(StreamAvailability.self, forKey: .availability) ?? .unknown + } + static func == (lhs: LibraryItem, rhs: LibraryItem) -> Bool { lhs.id == rhs.id } }