diff --git a/ios/App/App/AppDelegate.swift b/ios/App/App/AppDelegate.swift index 64c8ec83..8b95944c 100644 --- a/ios/App/App/AppDelegate.swift +++ b/ios/App/App/AppDelegate.swift @@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Override point for customization after application launch. let configuration = Realm.Configuration( - schemaVersion: 12, + schemaVersion: 13, migrationBlock: { [weak self] migration, oldSchemaVersion in if (oldSchemaVersion < 1) { self?.logger.log("Realm schema version was \(oldSchemaVersion)") diff --git a/ios/App/App/plugins/AbsDatabase.m b/ios/App/App/plugins/AbsDatabase.m index 14434572..4741f331 100644 --- a/ios/App/App/plugins/AbsDatabase.m +++ b/ios/App/App/plugins/AbsDatabase.m @@ -25,4 +25,5 @@ CAP_PLUGIN(AbsDatabase, "AbsDatabase", CAP_PLUGIN_METHOD(syncServerMediaProgressWithLocalMediaProgress, CAPPluginReturnPromise); CAP_PLUGIN_METHOD(updateLocalMediaProgressFinished, CAPPluginReturnPromise); CAP_PLUGIN_METHOD(updateDeviceSettings, CAPPluginReturnPromise); + CAP_PLUGIN_METHOD(updateLocalEbookProgress, CAPPluginReturnPromise); ) diff --git a/ios/App/App/plugins/AbsDatabase.swift b/ios/App/App/plugins/AbsDatabase.swift index 9ed5f3e9..85d7ec66 100644 --- a/ios/App/App/plugins/AbsDatabase.swift +++ b/ios/App/App/plugins/AbsDatabase.swift @@ -251,4 +251,32 @@ public class AbsDatabase: CAPPlugin { // call.resolve([ "value": [] ]) getDeviceData(call) } + + @objc func updateLocalEbookProgress(_ call: CAPPluginCall) { + let localLibraryItemId = call.getString("localLibraryItemId") + let ebookLocation = call.getString("ebookLocation", "") + let ebookProgress = call.getDouble("ebookProgress", 0.0) + + logger.log("updateLocalEbookProgress \(localLibraryItemId ?? "Unknown") | ebookLocation: \(ebookLocation) | ebookProgress: \(ebookProgress)") + + do { + let localMediaProgress = try LocalMediaProgress.fetchOrCreateLocalMediaProgress(localMediaProgressId: localLibraryItemId, localLibraryItemId: localLibraryItemId, localEpisodeId: nil) + guard let localMediaProgress = localMediaProgress else { + call.resolve(["error": "Library Item not found"]) + return + } + + // Update finished status + try localMediaProgress.updateEbookProgress(ebookLocation: ebookLocation, ebookProgress: ebookProgress) + + // Build API response + let progressDictionary = try? localMediaProgress.asDictionary() + let response: [String: Any] = ["localMediaProgress": progressDictionary ?? ""] + call.resolve(response) + } catch { + debugPrint(error) + call.resolve(["error": "Failed to update ebook progress"]) + return + } + } } diff --git a/ios/App/Shared/models/local/LocalMediaProgress.swift b/ios/App/Shared/models/local/LocalMediaProgress.swift index fc93198b..17572870 100644 --- a/ios/App/Shared/models/local/LocalMediaProgress.swift +++ b/ios/App/Shared/models/local/LocalMediaProgress.swift @@ -16,6 +16,8 @@ class LocalMediaProgress: Object, Codable { @Persisted var progress: Double = 0 @Persisted var currentTime: Double = 0 @Persisted var isFinished: Bool = false + @Persisted var ebookLocation: String? + @Persisted var ebookProgress: Double? @Persisted var lastUpdate: Double = 0 @Persisted var startedAt: Double = 0 @Persisted var finishedAt: Double? @@ -29,7 +31,7 @@ class LocalMediaProgress: Object, Codable { var progressPercent: Int { Int(self.progress * 100) } private enum CodingKeys : String, CodingKey { - case id, localLibraryItemId, localEpisodeId, duration, progress, currentTime, isFinished, lastUpdate, startedAt, finishedAt, serverConnectionConfigId, serverAddress, serverUserId, libraryItemId, episodeId + case id, localLibraryItemId, localEpisodeId, duration, progress, currentTime, isFinished, ebookLocation, ebookProgress, lastUpdate, startedAt, finishedAt, serverConnectionConfigId, serverAddress, serverUserId, libraryItemId, episodeId } override init() { @@ -47,6 +49,8 @@ class LocalMediaProgress: Object, Codable { progress = try values.decode(Double.self, forKey: .progress) currentTime = try values.decode(Double.self, forKey: .currentTime) isFinished = try values.decode(Bool.self, forKey: .isFinished) + ebookLocation = try values.decodeIfPresent(String.self, forKey: .ebookLocation) + ebookProgress = try values.doubleOrStringDecoder(key: .ebookProgress) lastUpdate = try values.decode(Double.self, forKey: .lastUpdate) startedAt = try values.decode(Double.self, forKey: .startedAt) finishedAt = try values.decodeIfPresent(Double.self, forKey: .finishedAt) @@ -70,6 +74,8 @@ class LocalMediaProgress: Object, Codable { try container.encode(currentTime, forKey: .currentTime) } try container.encode(isFinished, forKey: .isFinished) + try container.encode(ebookLocation, forKey: .ebookLocation) + try container.encode(ebookProgress, forKey: .ebookProgress) try container.encode(lastUpdate, forKey: .lastUpdate) try container.encode(startedAt, forKey: .startedAt) try container.encode(finishedAt, forKey: .finishedAt) @@ -97,6 +103,7 @@ extension LocalMediaProgress { self.progress = 0.0 self.currentTime = 0.0 self.isFinished = false + self.ebookProgress = 0.0 self.lastUpdate = Date().timeIntervalSince1970 * 1000 self.startedAt = 0 self.finishedAt = nil @@ -114,6 +121,8 @@ extension LocalMediaProgress { self.progress = progress.progress self.currentTime = progress.currentTime self.isFinished = progress.isFinished + self.ebookLocation = progress.ebookLocation + self.ebookProgress = progress.ebookProgress self.lastUpdate = progress.lastUpdate self.startedAt = progress.startedAt self.finishedAt = progress.finishedAt @@ -148,6 +157,8 @@ extension LocalMediaProgress { func updateFromServerMediaProgress(_ serverMediaProgress: MediaProgress) throws { try self.realm?.write { self.isFinished = serverMediaProgress.isFinished + self.ebookLocation = serverMediaProgress.ebookLocation + self.ebookProgress = serverMediaProgress.ebookProgress self.progress = serverMediaProgress.progress self.currentTime = serverMediaProgress.currentTime self.duration = serverMediaProgress.duration @@ -157,6 +168,14 @@ extension LocalMediaProgress { } } + func updateEbookProgress(ebookLocation:String, ebookProgress:Double) throws { + try self.realm?.write { + self.ebookLocation = ebookLocation + self.ebookProgress = ebookProgress + self.lastUpdate = Date().timeIntervalSince1970 * 1000 + } + } + static func getLocalMediaProgressId(localLibraryItemId: String?, localEpisodeId: String?) -> String? { if let itemId = localLibraryItemId, let episodeId = localEpisodeId { return "\(itemId)-\(episodeId)"