From f335d8735f79a4208687638e83c9d336271f725b Mon Sep 17 00:00:00 2001 From: ronaldheft Date: Sun, 21 Aug 2022 10:59:43 -0400 Subject: [PATCH 1/2] Fix progress sync not updating playback object --- ios/App/App/plugins/AbsAudioPlayer.swift | 2 +- ios/App/Shared/player/PlayerProgress.swift | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/ios/App/App/plugins/AbsAudioPlayer.swift b/ios/App/App/plugins/AbsAudioPlayer.swift index 32c989f3..34e00a77 100644 --- a/ios/App/App/plugins/AbsAudioPlayer.swift +++ b/ios/App/App/plugins/AbsAudioPlayer.swift @@ -38,7 +38,7 @@ public class AbsAudioPlayer: CAPPlugin { do { // Fetch the most recent active session - let activeSession = try await Realm().objects(PlaybackSession.self).where({ $0.isActiveSession == true }).last + let activeSession = try await Realm().objects(PlaybackSession.self).where({ $0.isActiveSession == true }).last?.freeze() if let activeSession = activeSession { await PlayerProgress.syncFromServer() try self.startPlaybackSession(activeSession, playWhenReady: false, playbackRate: PlayerSettings.main().playbackRate) diff --git a/ios/App/Shared/player/PlayerProgress.swift b/ios/App/Shared/player/PlayerProgress.swift index 0ee8961d..1b50f2a4 100644 --- a/ios/App/Shared/player/PlayerProgress.swift +++ b/ios/App/Shared/player/PlayerProgress.swift @@ -76,16 +76,25 @@ class PlayerProgress { } private static func updateLocalSessionFromServerMediaProgress() async { - NSLog("checkCurrentSessionProgress: Checking if local media progress was updated on server") - guard let session = PlayerHandler.getPlaybackSession()?.freeze() else { return } + NSLog("updateLocalSessionFromServerMediaProgress: Checking if local media progress was updated on server") + guard let session = try! await Realm().objects(PlaybackSession.self).last(where: { $0.isActiveSession == true })?.freeze() else { + NSLog("updateLocalSessionFromServerMediaProgress: Failed to get session") + return + } // Fetch the current progress let progress = await ApiClient.getMediaProgress(libraryItemId: session.libraryItemId!, episodeId: session.episodeId) - guard let progress = progress else { return } + guard let progress = progress else { + NSLog("updateLocalSessionFromServerMediaProgress: No progress object") + return + } // Determine which session is newer let serverLastUpdate = progress.lastUpdate - guard let localLastUpdate = session.updatedAt else { return } + guard let localLastUpdate = session.updatedAt else { + NSLog("updateLocalSessionFromServerMediaProgress: No local session updatedAt") + return + } let serverCurrentTime = progress.currentTime let localCurrentTime = session.currentTime @@ -94,12 +103,16 @@ class PlayerProgress { // Update the session, if needed if serverIsNewerThanLocal && currentTimeIsDifferent { + NSLog("updateLocalSessionFromServerMediaProgress: Server has newer time than local serverLastUpdate=\(serverLastUpdate) localLastUpdate=\(localLastUpdate)") guard let session = session.thaw() else { return } session.update { session.currentTime = serverCurrentTime session.updatedAt = serverLastUpdate } + NSLog("updateLocalSessionFromServerMediaProgress: Updated session currentTime newCurrentTime=\(serverCurrentTime) previousCurrentTime=\(localCurrentTime)") PlayerHandler.seek(amount: session.currentTime) + } else { + NSLog("updateLocalSessionFromServerMediaProgress: Local session does not need updating; local has latest progress") } } From 872931f5077d4ae724fb24257bc5c6a422b62a01 Mon Sep 17 00:00:00 2001 From: ronaldheft Date: Sun, 21 Aug 2022 11:05:16 -0400 Subject: [PATCH 2/2] Guard against player actions before player is initialized --- ios/App/Shared/player/AudioPlayer.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ios/App/Shared/player/AudioPlayer.swift b/ios/App/Shared/player/AudioPlayer.swift index 5c8db6a1..6a16c494 100644 --- a/ios/App/Shared/player/AudioPlayer.swift +++ b/ios/App/Shared/player/AudioPlayer.swift @@ -167,6 +167,8 @@ class AudioPlayer: NSObject { // MARK: - Methods public func play(allowSeekBack: Bool = false) { + guard self.isInitialized() else { return } + if allowSeekBack { let diffrence = Date.timeIntervalSinceReferenceDate - lastPlayTime var time: Int? @@ -202,6 +204,8 @@ class AudioPlayer: NSObject { } public func pause() { + guard self.isInitialized() else { return } + self.audioPlayer.pause() self.status = 0 self.rate = 0.0