From a82474cf45041972a8e18e77df5fd780030ab28e Mon Sep 17 00:00:00 2001 From: ronaldheft Date: Thu, 18 Aug 2022 15:55:50 -0400 Subject: [PATCH] Fix server media progress JSON decoding --- ios/App/App/AppDelegate.swift | 2 +- .../models/local/LocalMediaProgress.swift | 32 +++++++++---------- .../Shared/models/server/MediaProgress.swift | 12 +++---- ios/App/Shared/util/Extensions.swift | 10 ++++-- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/ios/App/App/AppDelegate.swift b/ios/App/App/AppDelegate.swift index 1e6e8129..99d44fe4 100644 --- a/ios/App/App/AppDelegate.swift +++ b/ios/App/App/AppDelegate.swift @@ -11,7 +11,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Override point for customization after application launch. let configuration = Realm.Configuration( - schemaVersion: 4, + schemaVersion: 2, migrationBlock: { migration, oldSchemaVersion in if (oldSchemaVersion < 1) { NSLog("Realm schema version was \(oldSchemaVersion)") diff --git a/ios/App/Shared/models/local/LocalMediaProgress.swift b/ios/App/Shared/models/local/LocalMediaProgress.swift index add69842..746b2e75 100644 --- a/ios/App/Shared/models/local/LocalMediaProgress.swift +++ b/ios/App/Shared/models/local/LocalMediaProgress.swift @@ -16,9 +16,9 @@ class LocalMediaProgress: Object, Codable { @Persisted var progress: Double = 0 @Persisted var currentTime: Double = 0 @Persisted var isFinished: Bool = false - @Persisted var lastUpdate: Int = 0 - @Persisted var startedAt: Int = 0 - @Persisted var finishedAt: Int? + @Persisted var lastUpdate: Double = 0 + @Persisted var startedAt: Double = 0 + @Persisted var finishedAt: Double? // For local lib items from server to support server sync @Persisted var serverConnectionConfigId: String? @Persisted var serverAddress: String? @@ -42,19 +42,19 @@ class LocalMediaProgress: Object, Codable { let values = try decoder.container(keyedBy: CodingKeys.self) id = try values.decode(String.self, forKey: .id) localLibraryItemId = try values.decode(String.self, forKey: .localLibraryItemId) - localEpisodeId = try? values.decode(String.self, forKey: .localEpisodeId) + localEpisodeId = try values.decodeIfPresent(String.self, forKey: .localEpisodeId) duration = try values.decode(Double.self, forKey: .duration) progress = try values.decode(Double.self, forKey: .progress) currentTime = try values.decode(Double.self, forKey: .currentTime) isFinished = try values.decode(Bool.self, forKey: .isFinished) - lastUpdate = try values.decode(Int.self, forKey: .lastUpdate) - startedAt = try values.decode(Int.self, forKey: .startedAt) - finishedAt = try? values.decode(Int.self, forKey: .finishedAt) - serverConnectionConfigId = try? values.decode(String.self, forKey: .serverConnectionConfigId) - serverAddress = try? values.decode(String.self, forKey: .serverAddress) - serverUserId = try? values.decode(String.self, forKey: .serverUserId) - libraryItemId = try? values.decode(String.self, forKey: .libraryItemId) - episodeId = try? values.decode(String.self, forKey: .episodeId) + lastUpdate = try values.decode(Double.self, forKey: .lastUpdate) + startedAt = try values.decode(Double.self, forKey: .startedAt) + finishedAt = try values.decodeIfPresent(Double.self, forKey: .finishedAt) + serverConnectionConfigId = try values.decodeIfPresent(String.self, forKey: .serverConnectionConfigId) + serverAddress = try values.decodeIfPresent(String.self, forKey: .serverAddress) + serverUserId = try values.decodeIfPresent(String.self, forKey: .serverUserId) + libraryItemId = try values.decodeIfPresent(String.self, forKey: .libraryItemId) + episodeId = try values.decodeIfPresent(String.self, forKey: .episodeId) } func encode(to encoder: Encoder) throws { @@ -93,7 +93,7 @@ extension LocalMediaProgress { self.progress = 0.0 self.currentTime = 0.0 self.isFinished = false - self.lastUpdate = Int(Date().timeIntervalSince1970) + self.lastUpdate = Date().timeIntervalSince1970 * 1000 self.startedAt = 0 self.finishedAt = nil @@ -122,11 +122,11 @@ extension LocalMediaProgress { } if self.startedAt == 0 && finished { - self.startedAt = Int(Date().timeIntervalSince1970) + self.startedAt = Date().timeIntervalSince1970 * 1000 } self.isFinished = finished - self.lastUpdate = Int(Date().timeIntervalSince1970) + self.lastUpdate = Date().timeIntervalSince1970 * 1000 self.finishedAt = finished ? lastUpdate : nil } } @@ -135,7 +135,7 @@ extension LocalMediaProgress { try! Realm().write { self.currentTime = playbackSession.currentTime self.progress = playbackSession.progress - self.lastUpdate = Int(Date().timeIntervalSince1970) + self.lastUpdate = Date().timeIntervalSince1970 * 1000 self.isFinished = playbackSession.progress >= 100.0 self.finishedAt = self.isFinished ? self.lastUpdate : nil } diff --git a/ios/App/Shared/models/server/MediaProgress.swift b/ios/App/Shared/models/server/MediaProgress.swift index b481a5b4..6572ca01 100644 --- a/ios/App/Shared/models/server/MediaProgress.swift +++ b/ios/App/Shared/models/server/MediaProgress.swift @@ -16,9 +16,9 @@ class MediaProgress: EmbeddedObject, Codable { @Persisted var progress: Double = 0 @Persisted var currentTime: Double = 0 @Persisted var isFinished: Bool = false - @Persisted var lastUpdate: Int = 0 - @Persisted var startedAt: Int = 0 - @Persisted var finishedAt: Int? + @Persisted var lastUpdate: Double = 0 + @Persisted var startedAt: Double = 0 + @Persisted var finishedAt: Double? private enum CodingKeys : String, CodingKey { case id, libraryItemId, episodeId, duration, progress, currentTime, isFinished, lastUpdate, startedAt, finishedAt @@ -37,9 +37,9 @@ class MediaProgress: EmbeddedObject, Codable { progress = try values.doubleOrStringDecoder(key: .progress) currentTime = try values.doubleOrStringDecoder(key: .currentTime) isFinished = try values.decode(Bool.self, forKey: .isFinished) - lastUpdate = try values.intOrStringDecoder(key: .lastUpdate) - startedAt = try values.intOrStringDecoder(key: .startedAt) - finishedAt = try? values.intOrStringDecoder(key: .finishedAt) + lastUpdate = try values.doubleOrStringDecoder(key: .lastUpdate) + startedAt = try values.doubleOrStringDecoder(key: .startedAt) + finishedAt = try? values.doubleOrStringDecoder(key: .finishedAt) } func encode(to encoder: Encoder) throws { diff --git a/ios/App/Shared/util/Extensions.swift b/ios/App/Shared/util/Extensions.swift index c76af20c..1bed0059 100644 --- a/ios/App/Shared/util/Extensions.swift +++ b/ios/App/Shared/util/Extensions.swift @@ -55,8 +55,14 @@ extension KeyedDecodingContainer { extension CAPPluginCall { func getJson(_ key: String, type: T.Type) -> T? { guard let value = getObject(key) else { return nil } - guard let json = try? JSONSerialization.data(withJSONObject: value) else { return nil } - return try? JSONDecoder().decode(type, from: json) + do { + let json = try JSONSerialization.data(withJSONObject: value) + return try JSONDecoder().decode(type, from: json) + } catch { + NSLog("Failed to get json for \(key)") + debugPrint(error) + return nil + } } }