From 43b35310cf80a23d8c0372b7928e84b15b14c8fd Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 30 May 2026 12:35:51 +0530 Subject: [PATCH] feat: throttle push watch progress while playback --- .../kotlin/com/nuvio/app/core/sync/SyncManager.kt | 2 +- .../com/nuvio/app/features/player/PlayerScreen.kt | 1 + .../nuvio/app/features/watched/WatchedRepository.kt | 9 ++++++--- .../watching/application/WatchingActions.kt | 6 +++--- .../watchprogress/WatchProgressRepository.kt | 13 +++++++++---- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/sync/SyncManager.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/sync/SyncManager.kt index ed9617ef..afaecb15 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/core/sync/SyncManager.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/core/sync/SyncManager.kt @@ -21,7 +21,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch private const val FOREGROUND_PULL_DELAY_MS = 2500L -private const val FOREGROUND_PULL_MIN_INTERVAL_MS = 60_000L +private const val FOREGROUND_PULL_MIN_INTERVAL_MS = 30 * 60_000L object SyncManager { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt index 7c354fb4..859a4373 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreen.kt @@ -1857,6 +1857,7 @@ fun PlayerScreen( WatchProgressRepository.upsertPlaybackProgress( session = playbackSession, snapshot = playbackSnapshot, + syncRemote = false, ) } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watched/WatchedRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watched/WatchedRepository.kt index fffae188..66050e9b 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watched/WatchedRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watched/WatchedRepository.kt @@ -147,13 +147,14 @@ object WatchedRepository { markWatched(items = items, traktHistorySync = WatchedTraktHistorySync.Mirror) } - internal fun markWatchedFromPlaybackCompletion(item: WatchedItem) { - markWatched(items = listOf(item), traktHistorySync = WatchedTraktHistorySync.Skip) + internal fun markWatchedFromPlaybackCompletion(item: WatchedItem, syncRemote: Boolean = true) { + markWatched(items = listOf(item), traktHistorySync = WatchedTraktHistorySync.Skip, syncRemote = syncRemote) } private fun markWatched( items: Collection, traktHistorySync: WatchedTraktHistorySync, + syncRemote: Boolean = true, ) { ensureLoaded() if (items.isEmpty()) return @@ -167,7 +168,9 @@ object WatchedRepository { } publish() persist() - pushMarksToServer(timestampedItems, traktHistorySync) + if (syncRemote) { + pushMarksToServer(timestampedItems, traktHistorySync) + } } fun unmarkWatched(item: WatchedItem) { diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/application/WatchingActions.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/application/WatchingActions.kt index 0b73570a..984dfbec 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/application/WatchingActions.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/application/WatchingActions.kt @@ -117,7 +117,7 @@ object WatchingActions { ) } - fun onProgressEntryUpdated(entry: WatchProgressEntry) { + fun onProgressEntryUpdated(entry: WatchProgressEntry, syncRemote: Boolean = true) { if (!entry.isCompleted) return val watchedItem = WatchedItem( @@ -129,9 +129,9 @@ object WatchingActions { episode = entry.episodeNumber, markedAtEpochMs = entry.lastUpdatedEpochMs, ) - WatchedRepository.markWatchedFromPlaybackCompletion(watchedItem) + WatchedRepository.markWatchedFromPlaybackCompletion(watchedItem, syncRemote = syncRemote) - if (!entry.isEpisode) return + if (!syncRemote || !entry.isEpisode) return actionScope.launch { val meta = runCatching { MetaDetailsRepository.fetch( diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressRepository.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressRepository.kt index 8533b87f..7de51f8c 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watchprogress/WatchProgressRepository.kt @@ -419,17 +419,19 @@ object WatchProgressRepository { fun upsertPlaybackProgress( session: WatchProgressPlaybackSession, snapshot: PlayerPlaybackSnapshot, + syncRemote: Boolean = true, ) { ensureLoaded() - upsert(session = session, snapshot = snapshot, persist = true) + upsert(session = session, snapshot = snapshot, persist = true, syncRemote = syncRemote) } fun flushPlaybackProgress( session: WatchProgressPlaybackSession, snapshot: PlayerPlaybackSnapshot, + syncRemote: Boolean = true, ) { ensureLoaded() - upsert(session = session, snapshot = snapshot, persist = true) + upsert(session = session, snapshot = snapshot, persist = true, syncRemote = syncRemote) } fun clearProgress(videoId: String) { @@ -561,6 +563,7 @@ object WatchProgressRepository { session: WatchProgressPlaybackSession, snapshot: PlayerPlaybackSnapshot, persist: Boolean, + syncRemote: Boolean, ) { val positionMs = snapshot.positionMs.coerceAtLeast(0L) val durationMs = snapshot.durationMs.coerceAtLeast(0L) @@ -613,9 +616,11 @@ object WatchProgressRepository { if (entry.poster.isNullOrBlank() || entry.background.isNullOrBlank()) { resolveRemoteMetadata() } - pushScrobbleToServer(entry) + if (syncRemote) { + pushScrobbleToServer(entry) + } if (shouldCascadeCompletedProgressToWatchedHistory(entry, useTraktProgress)) { - WatchingActions.onProgressEntryUpdated(entry) + WatchingActions.onProgressEntryUpdated(entry, syncRemote = syncRemote) } }