From 8d74d0c5df59013018fc353a9d4c76e509c05283 Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Fri, 12 Jun 2026 18:40:22 +0000 Subject: [PATCH] refactor(media): remove LocalMediaUpdater interface in favor of MediaMetadataUpdater Make LocalMediaRepository extend MediaMetadataUpdater directly instead of the now-removed LocalMediaUpdater, eliminating the redundant intermediate interface. Add no-op updatePlaybackPosition stubs to all LocalMediaRepository implementations since server-side position tracking belongs in the remote layer of the composite. JellyfinMediaMetadataUpdaterImpl continues to act as the composite that combines LocalMediaRepository (local cache) with JellyfinApiClient (remote server) under the single MediaMetadataUpdater contract. --- .../core/data/CompositeLocalMediaRepository.kt | 12 ++++++++++++ .../bbara/purefin/core/data/LocalMediaRepository.kt | 2 +- .../hu/bbara/purefin/core/data/LocalMediaUpdater.kt | 9 --------- .../hu/bbara/purefin/core/module/RepositoryModule.kt | 4 ---- .../data/catalog/InMemoryLocalMediaRepository.kt | 8 ++++++++ .../data/catalog/OfflineLocalMediaRepository.kt | 8 ++++++++ 6 files changed, 29 insertions(+), 14 deletions(-) delete mode 100644 core/src/main/java/hu/bbara/purefin/core/data/LocalMediaUpdater.kt diff --git a/core/src/main/java/hu/bbara/purefin/core/data/CompositeLocalMediaRepository.kt b/core/src/main/java/hu/bbara/purefin/core/data/CompositeLocalMediaRepository.kt index 13fee447..1fe7eb17 100644 --- a/core/src/main/java/hu/bbara/purefin/core/data/CompositeLocalMediaRepository.kt +++ b/core/src/main/java/hu/bbara/purefin/core/data/CompositeLocalMediaRepository.kt @@ -102,6 +102,18 @@ class CompositeLocalMediaRepository @Inject constructor( ) } + override suspend fun updatePlaybackPosition( + mediaId: UUID, + playbackPositionTicks: Long, + runtimeTicks: Long, + ) { + // Server-side operation — delegates to active repository (both are no-ops) + runOnlineOrOfflineNoOp( + onlineAction = { onlineRepository.updatePlaybackPosition(mediaId, playbackPositionTicks, runtimeTicks) }, + offlineAction = { offlineRepository.updatePlaybackPosition(mediaId, playbackPositionTicks, runtimeTicks) }, + ) + } + private suspend fun getFromActiveRepository( onlineRead: suspend () -> Flow, offlineRead: suspend () -> Flow, diff --git a/core/src/main/java/hu/bbara/purefin/core/data/LocalMediaRepository.kt b/core/src/main/java/hu/bbara/purefin/core/data/LocalMediaRepository.kt index 0c7a07bb..d2e39997 100644 --- a/core/src/main/java/hu/bbara/purefin/core/data/LocalMediaRepository.kt +++ b/core/src/main/java/hu/bbara/purefin/core/data/LocalMediaRepository.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import java.util.UUID -interface LocalMediaRepository : LocalMediaUpdater { +interface LocalMediaRepository : MediaMetadataUpdater { val movies: StateFlow> val series: StateFlow> val episodes: StateFlow> diff --git a/core/src/main/java/hu/bbara/purefin/core/data/LocalMediaUpdater.kt b/core/src/main/java/hu/bbara/purefin/core/data/LocalMediaUpdater.kt deleted file mode 100644 index d9fd3417..00000000 --- a/core/src/main/java/hu/bbara/purefin/core/data/LocalMediaUpdater.kt +++ /dev/null @@ -1,9 +0,0 @@ -package hu.bbara.purefin.core.data - -import java.util.UUID - -interface LocalMediaUpdater { - suspend fun updateWatchProgress(mediaId: UUID, positionMs: Long, durationMs: Long) - suspend fun updateWatchProgressPercent(mediaId: UUID, progressPercent: Double) - suspend fun markAsWatched(mediaId: UUID, watched: Boolean) -} diff --git a/core/src/main/java/hu/bbara/purefin/core/module/RepositoryModule.kt b/core/src/main/java/hu/bbara/purefin/core/module/RepositoryModule.kt index 2e46146e..78bcab5f 100644 --- a/core/src/main/java/hu/bbara/purefin/core/module/RepositoryModule.kt +++ b/core/src/main/java/hu/bbara/purefin/core/module/RepositoryModule.kt @@ -6,7 +6,6 @@ import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import hu.bbara.purefin.core.data.CompositeLocalMediaRepository import hu.bbara.purefin.core.data.LocalMediaRepository -import hu.bbara.purefin.core.data.LocalMediaUpdater @Module @@ -15,7 +14,4 @@ abstract class RepositoryModule { @Binds abstract fun bindMediaRepository(impl: CompositeLocalMediaRepository): LocalMediaRepository - - @Binds - abstract fun bindMediaProgressWrite(impl: CompositeLocalMediaRepository): LocalMediaUpdater } diff --git a/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryLocalMediaRepository.kt b/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryLocalMediaRepository.kt index 155b0e06..1f538ecb 100644 --- a/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryLocalMediaRepository.kt +++ b/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryLocalMediaRepository.kt @@ -214,6 +214,14 @@ class InMemoryLocalMediaRepository @Inject constructor( } } + override suspend fun updatePlaybackPosition( + mediaId: UUID, + playbackPositionTicks: Long, + runtimeTicks: Long, + ) { + // Server-side operation — not persisted locally + } + private fun updateLoadedSeriesEpisode(updatedEpisode: Episode) { seriesState.update { current -> val series = current[updatedEpisode.seriesId] ?: return@update current diff --git a/data/src/main/java/hu/bbara/purefin/data/catalog/OfflineLocalMediaRepository.kt b/data/src/main/java/hu/bbara/purefin/data/catalog/OfflineLocalMediaRepository.kt index 36a00ba3..88081b6c 100644 --- a/data/src/main/java/hu/bbara/purefin/data/catalog/OfflineLocalMediaRepository.kt +++ b/data/src/main/java/hu/bbara/purefin/data/catalog/OfflineLocalMediaRepository.kt @@ -71,6 +71,14 @@ class OfflineLocalMediaRepository @Inject constructor( // Do nothing } + override suspend fun updatePlaybackPosition( + mediaId: UUID, + playbackPositionTicks: Long, + runtimeTicks: Long, + ) { + // Server-side operation — not persisted offline + } + override suspend fun saveMovies(movies: List) { localDataSource.saveMovies(movies) }