Update:iOS saving progress for offline ebooks

This commit is contained in:
advplyr 2023-06-24 09:41:14 -05:00
parent f8fbeef9b7
commit f42c624cba
4 changed files with 50 additions and 2 deletions

View file

@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// Override point for customization after application launch. // Override point for customization after application launch.
let configuration = Realm.Configuration( let configuration = Realm.Configuration(
schemaVersion: 12, schemaVersion: 13,
migrationBlock: { [weak self] migration, oldSchemaVersion in migrationBlock: { [weak self] migration, oldSchemaVersion in
if (oldSchemaVersion < 1) { if (oldSchemaVersion < 1) {
self?.logger.log("Realm schema version was \(oldSchemaVersion)") self?.logger.log("Realm schema version was \(oldSchemaVersion)")

View file

@ -25,4 +25,5 @@ CAP_PLUGIN(AbsDatabase, "AbsDatabase",
CAP_PLUGIN_METHOD(syncServerMediaProgressWithLocalMediaProgress, CAPPluginReturnPromise); CAP_PLUGIN_METHOD(syncServerMediaProgressWithLocalMediaProgress, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(updateLocalMediaProgressFinished, CAPPluginReturnPromise); CAP_PLUGIN_METHOD(updateLocalMediaProgressFinished, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(updateDeviceSettings, CAPPluginReturnPromise); CAP_PLUGIN_METHOD(updateDeviceSettings, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(updateLocalEbookProgress, CAPPluginReturnPromise);
) )

View file

@ -251,4 +251,32 @@ public class AbsDatabase: CAPPlugin {
// call.resolve([ "value": [] ]) // call.resolve([ "value": [] ])
getDeviceData(call) 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
}
}
} }

View file

@ -16,6 +16,8 @@ class LocalMediaProgress: Object, Codable {
@Persisted var progress: Double = 0 @Persisted var progress: Double = 0
@Persisted var currentTime: Double = 0 @Persisted var currentTime: Double = 0
@Persisted var isFinished: Bool = false @Persisted var isFinished: Bool = false
@Persisted var ebookLocation: String?
@Persisted var ebookProgress: Double?
@Persisted var lastUpdate: Double = 0 @Persisted var lastUpdate: Double = 0
@Persisted var startedAt: Double = 0 @Persisted var startedAt: Double = 0
@Persisted var finishedAt: Double? @Persisted var finishedAt: Double?
@ -29,7 +31,7 @@ class LocalMediaProgress: Object, Codable {
var progressPercent: Int { Int(self.progress * 100) } var progressPercent: Int { Int(self.progress * 100) }
private enum CodingKeys : String, CodingKey { 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() { override init() {
@ -47,6 +49,8 @@ class LocalMediaProgress: Object, Codable {
progress = try values.decode(Double.self, forKey: .progress) progress = try values.decode(Double.self, forKey: .progress)
currentTime = try values.decode(Double.self, forKey: .currentTime) currentTime = try values.decode(Double.self, forKey: .currentTime)
isFinished = try values.decode(Bool.self, forKey: .isFinished) 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) lastUpdate = try values.decode(Double.self, forKey: .lastUpdate)
startedAt = try values.decode(Double.self, forKey: .startedAt) startedAt = try values.decode(Double.self, forKey: .startedAt)
finishedAt = try values.decodeIfPresent(Double.self, forKey: .finishedAt) 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(currentTime, forKey: .currentTime)
} }
try container.encode(isFinished, forKey: .isFinished) 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(lastUpdate, forKey: .lastUpdate)
try container.encode(startedAt, forKey: .startedAt) try container.encode(startedAt, forKey: .startedAt)
try container.encode(finishedAt, forKey: .finishedAt) try container.encode(finishedAt, forKey: .finishedAt)
@ -97,6 +103,7 @@ extension LocalMediaProgress {
self.progress = 0.0 self.progress = 0.0
self.currentTime = 0.0 self.currentTime = 0.0
self.isFinished = false self.isFinished = false
self.ebookProgress = 0.0
self.lastUpdate = Date().timeIntervalSince1970 * 1000 self.lastUpdate = Date().timeIntervalSince1970 * 1000
self.startedAt = 0 self.startedAt = 0
self.finishedAt = nil self.finishedAt = nil
@ -114,6 +121,8 @@ extension LocalMediaProgress {
self.progress = progress.progress self.progress = progress.progress
self.currentTime = progress.currentTime self.currentTime = progress.currentTime
self.isFinished = progress.isFinished self.isFinished = progress.isFinished
self.ebookLocation = progress.ebookLocation
self.ebookProgress = progress.ebookProgress
self.lastUpdate = progress.lastUpdate self.lastUpdate = progress.lastUpdate
self.startedAt = progress.startedAt self.startedAt = progress.startedAt
self.finishedAt = progress.finishedAt self.finishedAt = progress.finishedAt
@ -148,6 +157,8 @@ extension LocalMediaProgress {
func updateFromServerMediaProgress(_ serverMediaProgress: MediaProgress) throws { func updateFromServerMediaProgress(_ serverMediaProgress: MediaProgress) throws {
try self.realm?.write { try self.realm?.write {
self.isFinished = serverMediaProgress.isFinished self.isFinished = serverMediaProgress.isFinished
self.ebookLocation = serverMediaProgress.ebookLocation
self.ebookProgress = serverMediaProgress.ebookProgress
self.progress = serverMediaProgress.progress self.progress = serverMediaProgress.progress
self.currentTime = serverMediaProgress.currentTime self.currentTime = serverMediaProgress.currentTime
self.duration = serverMediaProgress.duration 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? { static func getLocalMediaProgressId(localLibraryItemId: String?, localEpisodeId: String?) -> String? {
if let itemId = localLibraryItemId, let episodeId = localEpisodeId { if let itemId = localLibraryItemId, let episodeId = localEpisodeId {
return "\(itemId)-\(episodeId)" return "\(itemId)-\(episodeId)"