From 7412d0899f1a70858140b87d77d47ce7e5324040 Mon Sep 17 00:00:00 2001 From: advplyr Date: Fri, 15 Dec 2023 16:04:58 -0600 Subject: [PATCH] Fix:Syncing when media is open in audio player and playing on another device #984 - Local playback session IDs have been updated to UUIDs instead of prefixing local_play_ --- .../app/data/LocalLibraryItem.kt | 2 +- .../models/local/LocalLibraryItem.swift | 2 +- ios/App/Shared/player/PlayerHandler.swift | 2 +- ios/App/Shared/util/NowPlayingInfo.swift | 3 +-- layouts/default.vue | 19 +++++++++---------- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt b/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt index b2bc2423..c6a25cbd 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt @@ -81,7 +81,7 @@ class LocalLibraryItem( @JsonIgnore fun getPlaybackSession(episode:PodcastEpisode?, deviceInfo:DeviceInfo):PlaybackSession { val localEpisodeId = episode?.id - val sessionId = "play_local_${UUID.randomUUID()}" + val sessionId = "${UUID.randomUUID()}" // Get current progress for local media val mediaProgressId = if (localEpisodeId.isNullOrEmpty()) id else "$id-$localEpisodeId" diff --git a/ios/App/Shared/models/local/LocalLibraryItem.swift b/ios/App/Shared/models/local/LocalLibraryItem.swift index f99998bf..22434353 100644 --- a/ios/App/Shared/models/local/LocalLibraryItem.swift +++ b/ios/App/Shared/models/local/LocalLibraryItem.swift @@ -164,7 +164,7 @@ extension LocalLibraryItem { func getPlaybackSession(episode: PodcastEpisode?) -> PlaybackSession { let localEpisodeId = episode?.id - let sessionId = "play_local_\(UUID().uuidString)" + let sessionId = UUID().uuidString // Get current progress from local media let mediaProgressId = (localEpisodeId != nil) ? "\(self.id)-\(localEpisodeId!)" : self.id diff --git a/ios/App/Shared/player/PlayerHandler.swift b/ios/App/Shared/player/PlayerHandler.swift index 298e41b5..8b6541bc 100644 --- a/ios/App/Shared/player/PlayerHandler.swift +++ b/ios/App/Shared/player/PlayerHandler.swift @@ -21,7 +21,7 @@ class PlayerHandler { cleanupOldSessions(currentSessionId: sessionId) // Set now playing info - NowPlayingInfo.shared.setSessionMetadata(metadata: NowPlayingMetadata(id: session.id, itemId: session.libraryItemId!, title: session.displayTitle ?? "Unknown title", author: session.displayAuthor, series: nil)) + NowPlayingInfo.shared.setSessionMetadata(metadata: NowPlayingMetadata(id: session.id, itemId: session.libraryItemId!, title: session.displayTitle ?? "Unknown title", author: session.displayAuthor, series: nil, isLocal: session.isLocal)) // Create the audio player player = AudioPlayer(sessionId: sessionId, playWhenReady: playWhenReady, playbackRate: playbackRate) diff --git a/ios/App/Shared/util/NowPlayingInfo.swift b/ios/App/Shared/util/NowPlayingInfo.swift index 1ccf2a8e..6393611c 100644 --- a/ios/App/Shared/util/NowPlayingInfo.swift +++ b/ios/App/Shared/util/NowPlayingInfo.swift @@ -14,6 +14,7 @@ struct NowPlayingMetadata { var title: String var author: String? var series: String? + var isLocal: Bool var coverUrl: URL? { if self.isLocal { @@ -25,8 +26,6 @@ struct NowPlayingMetadata { return url } } - - var isLocal: Bool { id.starts(with: "play_local_") } } class NowPlayingInfo { diff --git a/layouts/default.vue b/layouts/default.vue index cd4ef429..ad290976 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -221,23 +221,22 @@ export default { const prog = payload.data // MediaProgress console.log(`[default] userMediaProgressUpdate checking for local media progress ${payload.id}`) - // Update local media progress if exists + // Check if this media item is currently open in the player, paused, and this progress update is coming from a different session + const isMediaOpenInPlayer = this.$store.getters['getIsMediaStreaming'](prog.libraryItemId, prog.episodeId) + if (isMediaOpenInPlayer && this.$store.getters['getCurrentPlaybackSessionId'] !== payload.sessionId && !this.$store.state.playerIsPlaying) { + console.log('[default] userMediaProgressUpdated for current open media item', payload.data.currentTime) + this.$eventBus.$emit('playback-time-update', payload.data.currentTime) + } + + // Get local media progress if exists const localProg = await this.$db.getLocalMediaProgressForServerItem({ libraryItemId: prog.libraryItemId, episodeId: prog.episodeId }) let newLocalMediaProgress = null + // Progress update is more recent then local progress if (localProg && localProg.lastUpdate < prog.lastUpdate) { if (localProg.currentTime == prog.currentTime && localProg.isFinished == prog.isFinished) { console.log('[default] syncing progress server lastUpdate > local lastUpdate but currentTime and isFinished is equal') return - } else { - console.log(`[default] syncing progress server lastUpdate > local lastUpdate. server currentTime=${prog.currentTime} local currentTime=${localProg.currentTime} | server/local isFinished=${prog.isFinished}/${localProg.isFinished}`) - } - - // Check if this media item is currently open in the player, paused, and this progress update is coming from a different session - const isMediaOpenInPlayer = this.$store.getters['getIsMediaStreaming'](prog.libraryItemId, prog.episodeId) - if (isMediaOpenInPlayer && this.$store.getters['getCurrentPlaybackSessionId'] !== payload.sessionId && !this.$store.state.playerIsPlaying) { - console.log('[default] userMediaProgressUpdated for current open media item', payload.data.currentTime) - this.$eventBus.$emit('playback-time-update', payload.data.currentTime) } // Server progress is more up-to-date