Merge pull request #327 from ronaldheft/bug-ios-playback-on-session-resume

Fix playback session starting sometimes on app launch
This commit is contained in:
advplyr 2022-08-21 11:15:23 -05:00 committed by GitHub
commit a576eff700
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 5 deletions

View file

@ -38,7 +38,7 @@ public class AbsAudioPlayer: CAPPlugin {
do { do {
// Fetch the most recent active session // 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 { if let activeSession = activeSession {
await PlayerProgress.syncFromServer() await PlayerProgress.syncFromServer()
try self.startPlaybackSession(activeSession, playWhenReady: false, playbackRate: PlayerSettings.main().playbackRate) try self.startPlaybackSession(activeSession, playWhenReady: false, playbackRate: PlayerSettings.main().playbackRate)

View file

@ -167,6 +167,8 @@ class AudioPlayer: NSObject {
// MARK: - Methods // MARK: - Methods
public func play(allowSeekBack: Bool = false) { public func play(allowSeekBack: Bool = false) {
guard self.isInitialized() else { return }
if allowSeekBack { if allowSeekBack {
let diffrence = Date.timeIntervalSinceReferenceDate - lastPlayTime let diffrence = Date.timeIntervalSinceReferenceDate - lastPlayTime
var time: Int? var time: Int?
@ -202,6 +204,8 @@ class AudioPlayer: NSObject {
} }
public func pause() { public func pause() {
guard self.isInitialized() else { return }
self.audioPlayer.pause() self.audioPlayer.pause()
self.status = 0 self.status = 0
self.rate = 0.0 self.rate = 0.0

View file

@ -76,16 +76,25 @@ class PlayerProgress {
} }
private static func updateLocalSessionFromServerMediaProgress() async { private static func updateLocalSessionFromServerMediaProgress() async {
NSLog("checkCurrentSessionProgress: Checking if local media progress was updated on server") NSLog("updateLocalSessionFromServerMediaProgress: Checking if local media progress was updated on server")
guard let session = PlayerHandler.getPlaybackSession()?.freeze() else { return } 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 // Fetch the current progress
let progress = await ApiClient.getMediaProgress(libraryItemId: session.libraryItemId!, episodeId: session.episodeId) 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 // Determine which session is newer
let serverLastUpdate = progress.lastUpdate 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 serverCurrentTime = progress.currentTime
let localCurrentTime = session.currentTime let localCurrentTime = session.currentTime
@ -94,12 +103,16 @@ class PlayerProgress {
// Update the session, if needed // Update the session, if needed
if serverIsNewerThanLocal && currentTimeIsDifferent { if serverIsNewerThanLocal && currentTimeIsDifferent {
NSLog("updateLocalSessionFromServerMediaProgress: Server has newer time than local serverLastUpdate=\(serverLastUpdate) localLastUpdate=\(localLastUpdate)")
guard let session = session.thaw() else { return } guard let session = session.thaw() else { return }
session.update { session.update {
session.currentTime = serverCurrentTime session.currentTime = serverCurrentTime
session.updatedAt = serverLastUpdate session.updatedAt = serverLastUpdate
} }
NSLog("updateLocalSessionFromServerMediaProgress: Updated session currentTime newCurrentTime=\(serverCurrentTime) previousCurrentTime=\(localCurrentTime)")
PlayerHandler.seek(amount: session.currentTime) PlayerHandler.seek(amount: session.currentTime)
} else {
NSLog("updateLocalSessionFromServerMediaProgress: Local session does not need updating; local has latest progress")
} }
} }