refactor: merge media catalog reader into repository

This commit is contained in:
2026-05-02 16:51:55 +02:00
parent 672d8e1d64
commit 217e8df417
10 changed files with 35 additions and 40 deletions

View File

@@ -25,12 +25,12 @@ import javax.inject.Singleton
class CompositeMediaRepository @Inject constructor(
@Offline private val offlineRepository: MediaRepository,
@Online private val onlineRepository: MediaRepository,
) : MediaCatalogReader, MediaProgressWriter {
) : MediaRepository {
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
// TODO move this into the domain layer and there you can use NetworkMonitor. Data should be free of android stuff.
private val activeRepository: Flow<MediaCatalogReader> = flowOf(onlineRepository)
private val activeRepository: Flow<MediaRepository> = flowOf(onlineRepository)
override val movies: StateFlow<Map<UUID, Movie>> = activeRepository
.flatMapLatest { it.movies }

View File

@@ -1,21 +0,0 @@
package hu.bbara.purefin.data
import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.model.Genre
import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.model.Series
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import java.util.UUID
//TODO rename MediaRepository
interface MediaCatalogReader {
val movies: StateFlow<Map<UUID, Movie>>
val series: StateFlow<Map<UUID, Series>>
val episodes: StateFlow<Map<UUID, Episode>>
val genres: StateFlow<Set<Genre>>
suspend fun getMovie(id: UUID): Flow<Movie?>
suspend fun getSeries(id: UUID): Flow<Series?>
suspend fun getEpisode(id: UUID): Flow<Episode?>
fun observeSeriesWithContent(seriesId: UUID): Flow<Series?>
}

View File

@@ -1,4 +1,20 @@
package hu.bbara.purefin.data
interface MediaRepository : MediaCatalogReader, MediaProgressWriter {
import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.model.Genre
import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.model.Series
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import java.util.UUID
interface MediaRepository : MediaProgressWriter {
val movies: StateFlow<Map<UUID, Movie>>
val series: StateFlow<Map<UUID, Series>>
val episodes: StateFlow<Map<UUID, Episode>>
val genres: StateFlow<Set<Genre>>
suspend fun getMovie(id: UUID): Flow<Movie?>
suspend fun getSeries(id: UUID): Flow<Series?>
suspend fun getEpisode(id: UUID): Flow<Episode?>
fun observeSeriesWithContent(seriesId: UUID): Flow<Series?>
}

View File

@@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import hu.bbara.purefin.data.HomeRepository
import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.data.MediaRepository
import hu.bbara.purefin.data.UserSessionRepository
import hu.bbara.purefin.download.MediaDownloadController
import hu.bbara.purefin.model.LibraryKind
@@ -34,7 +34,7 @@ import javax.inject.Inject
@HiltViewModel
class AppViewModel @Inject constructor(
private val homeRepository: HomeRepository,
private val mediaCatalogReader: MediaCatalogReader,
private val mediaCatalogReader: MediaRepository,
private val userSessionRepository: UserSessionRepository,
private val navigationManager: NavigationManager,
private val mediaDownloadManager: MediaDownloadController,

View File

@@ -3,7 +3,7 @@ package hu.bbara.purefin.feature.content.episode
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.data.MediaRepository
import hu.bbara.purefin.download.DownloadState
import hu.bbara.purefin.download.MediaDownloadController
import hu.bbara.purefin.model.Episode
@@ -22,7 +22,7 @@ import javax.inject.Inject
@HiltViewModel
class EpisodeScreenViewModel @Inject constructor(
private val mediaCatalogReader: MediaCatalogReader,
private val mediaCatalogReader: MediaRepository,
private val navigationManager: NavigationManager,
private val mediaDownloadManager: MediaDownloadController,
): ViewModel() {

View File

@@ -3,7 +3,7 @@ package hu.bbara.purefin.feature.content.movie
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.data.MediaRepository
import hu.bbara.purefin.download.DownloadState
import hu.bbara.purefin.download.MediaDownloadController
import hu.bbara.purefin.model.Movie
@@ -21,7 +21,7 @@ import javax.inject.Inject
@HiltViewModel
class MovieScreenViewModel @Inject constructor(
private val mediaCatalogReader: MediaCatalogReader,
private val mediaCatalogReader: MediaRepository,
private val navigationManager: NavigationManager,
private val mediaDownloadManager: MediaDownloadController,
): ViewModel() {

View File

@@ -3,7 +3,7 @@ package hu.bbara.purefin.feature.content.series
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.data.MediaRepository
import hu.bbara.purefin.download.DownloadState
import hu.bbara.purefin.download.MediaDownloadController
import hu.bbara.purefin.model.Episode
@@ -25,7 +25,7 @@ import javax.inject.Inject
@HiltViewModel
class SeriesViewModel @Inject constructor(
private val mediaCatalogReader: MediaCatalogReader,
private val mediaCatalogReader: MediaRepository,
private val navigationManager: NavigationManager,
private val mediaDownloadManager: MediaDownloadController,
) : ViewModel() {

View File

@@ -3,7 +3,7 @@ package hu.bbara.purefin.feature.search
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.data.MediaRepository
import hu.bbara.purefin.data.UserSessionRepository
import hu.bbara.purefin.image.ArtworkKind
import hu.bbara.purefin.image.ImageUrlBuilder
@@ -26,7 +26,7 @@ import javax.inject.Inject
@HiltViewModel
@OptIn(FlowPreview::class)
class SearchViewModel @Inject constructor(
private val mediaCatalogReader: MediaCatalogReader,
private val mediaCatalogReader: MediaRepository,
private val userSessionRepository: UserSessionRepository,
private val navigationManager: NavigationManager,
) : ViewModel() {

View File

@@ -5,8 +5,8 @@ import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import hu.bbara.purefin.data.CompositeMediaRepository
import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.data.MediaProgressWriter
import hu.bbara.purefin.data.MediaRepository
@Module
@@ -14,7 +14,7 @@ import hu.bbara.purefin.data.MediaProgressWriter
abstract class RepositoryModule {
@Binds
abstract fun bindMediaCatalogReader(impl: CompositeMediaRepository): MediaCatalogReader
abstract fun bindMediaRepository(impl: CompositeMediaRepository): MediaRepository
@Binds
abstract fun bindMediaProgressWrite(impl: CompositeMediaRepository): MediaProgressWriter

View File

@@ -5,7 +5,7 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.data.MediaRepository
import hu.bbara.purefin.image.ArtworkKind
import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.model.PlayableMedia
@@ -31,7 +31,7 @@ import javax.inject.Inject
class PlayerViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
private val playerManager: PlayerManager,
private val mediaCatalogReader: MediaCatalogReader,
private val mediaCatalogReader: MediaRepository,
private val progressManager: ProgressManager,
) : ViewModel() {
companion object {