diff --git a/app/src/main/java/com/nuvio/tv/data/repository/TraktProgressService.kt b/app/src/main/java/com/nuvio/tv/data/repository/TraktProgressService.kt index fd9f5bdf..d3566e1c 100644 --- a/app/src/main/java/com/nuvio/tv/data/repository/TraktProgressService.kt +++ b/app/src/main/java/com/nuvio/tv/data/repository/TraktProgressService.kt @@ -30,6 +30,9 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest @@ -298,8 +301,7 @@ class TraktProgressService @Inject constructor( val optimistic = progress.copy( progressPercent = derivedPercent, - source = WatchProgress.SOURCE_TRAKT_PLAYBACK, - lastWatched = now + source = WatchProgress.SOURCE_TRAKT_PLAYBACK ) optimisticProgress.update { current -> @@ -369,8 +371,7 @@ class TraktProgressService @Inject constructor( fun observeWatchedShowSeeds(): Flow> { return combine( - watchedShowSeedsState - .onStart { emit(getWatchedShowSeedsSnapshot(forceRefresh = false)) }, + watchedShowSeedsState, hiddenProgressShowIds ) { seeds, _ -> seeds.filter { !isShowHiddenFromProgress(it.contentId) } @@ -796,17 +797,21 @@ class TraktProgressService @Inject constructor( getWatchedMoviesSnapshot(forceRefresh = true) } - if (force && hasLoadedWatchedShowSeeds) { - getWatchedShowSeedsSnapshot(forceRefresh = true) - } + val needSeedsRefresh = force || + (watchedShowSeedsStale && hasLoadedWatchedShowSeeds) + coroutineScope { + val progressDeferred = async { fetchAllProgressSnapshot(force = force) } + val seedsDeferred = if (needSeedsRefresh) { + async { getWatchedShowSeedsSnapshot(forceRefresh = true) } + } else null - val snapshot = fetchAllProgressSnapshot(force = force) - remoteProgress.value = snapshot - hasLoadedRemoteProgress.value = true - reconcileOptimistic(snapshot) - hydrateMetadata(snapshot) - if (!force && watchedShowSeedsStale && hasLoadedWatchedShowSeeds) { - getWatchedShowSeedsSnapshot(forceRefresh = true) + val snapshot = progressDeferred.await() + seedsDeferred?.await() + + remoteProgress.value = snapshot + hasLoadedRemoteProgress.value = true + reconcileOptimistic(snapshot) + hydrateMetadata(snapshot) } } @@ -1357,13 +1362,22 @@ class TraktProgressService @Inject constructor( } private suspend fun fetchAllProgressSnapshot(force: Boolean = false): List { - val recentCompletedEpisodes = fetchRecentEpisodeHistorySnapshot() val playbackStartAt = recentWatchWindowMs()?.let { windowMs -> toTraktUtcDateTime(System.currentTimeMillis() - windowMs) } - val inProgressMovies = getPlayback("movies", force = force, startAt = playbackStartAt).mapNotNull { mapPlaybackMovie(it) } - val inProgressEpisodes = getPlayback("episodes", force = force, startAt = playbackStartAt) - .mapNotNull { mapPlaybackEpisode(it, applyAddonRemap = true) } + + val (recentCompletedEpisodes, inProgressMovies, inProgressEpisodes) = coroutineScope { + val historyDeferred = async { fetchRecentEpisodeHistorySnapshot() } + val moviesDeferred = async { + getPlayback("movies", force = force, startAt = playbackStartAt) + .mapNotNull { mapPlaybackMovie(it) } + } + val episodesDeferred = async { + getPlayback("episodes", force = force, startAt = playbackStartAt) + .mapNotNull { mapPlaybackEpisode(it, applyAddonRemap = true) } + } + Triple(historyDeferred.await(), moviesDeferred.await(), episodesDeferred.await()) + } val mergedByKey = linkedMapOf() @@ -1390,7 +1404,8 @@ class TraktProgressService @Inject constructor( "${progress.contentId}_s${progress.season}e${progress.episode}" in completedEpisodeKeys } - return mergedByKey.values.sortedByDescending { it.lastWatched } + val finalSnapshot = mergedByKey.values.sortedByDescending { it.lastWatched } + return finalSnapshot } private suspend fun fetchRecentEpisodeHistorySnapshot(): List { diff --git a/app/src/main/java/com/nuvio/tv/ui/screens/home/HomeViewModelContinueWatching.kt b/app/src/main/java/com/nuvio/tv/ui/screens/home/HomeViewModelContinueWatching.kt index ea801d0c..0dda8abc 100644 --- a/app/src/main/java/com/nuvio/tv/ui/screens/home/HomeViewModelContinueWatching.kt +++ b/app/src/main/java/com/nuvio/tv/ui/screens/home/HomeViewModelContinueWatching.kt @@ -1098,7 +1098,7 @@ internal fun mergeContinueWatchingItems( filteredNextUpItems.forEach { combined.add(it.info.sortTimestamp to it) } val seen = mutableSetOf() - return combined + val result = combined .sortedByDescending { it.first } .map { it.second } .filter { item -> @@ -1108,6 +1108,8 @@ internal fun mergeContinueWatchingItems( } contentId.isBlank() || seen.add(contentId) } + + return result } private suspend fun HomeViewModel.buildNextUpItem(