From 36e89f35d9b136a4c60197deffe3b68ed629bb89 Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Sat, 2 May 2026 16:53:48 +0200 Subject: [PATCH] refactor: rename media repository files for consistency --- ...ry.kt => CompositeLocalMediaRepository.kt} | 10 +++---- ...aRepository.kt => LocalMediaRepository.kt} | 2 +- .../feature/browse/home/AppViewModel.kt | 4 +-- .../content/episode/EpisodeScreenViewModel.kt | 4 +-- .../content/movie/MovieScreenViewModel.kt | 4 +-- .../feature/content/series/SeriesViewModel.kt | 4 +-- .../feature/downloads/DownloadsViewModel.kt | 4 +-- .../purefin/feature/search/SearchViewModel.kt | 4 +-- .../bbara/purefin/module/RepositoryModule.kt | 8 ++--- .../player/viewmodel/PlayerViewModel.kt | 4 +-- .../catalog/InMemoryAppContentRepository.kt | 2 +- ...ory.kt => InMemoryLocalMediaRepository.kt} | 6 ++-- ...tory.kt => OfflineLocalMediaRepository.kt} | 6 ++-- .../data/jellyfin/client/JellyfinApiClient.kt | 30 +++++++++++++++++++ .../data/module/MediaRepositoryModule.kt | 10 +++---- 15 files changed, 66 insertions(+), 36 deletions(-) rename core/src/main/java/hu/bbara/purefin/data/{CompositeMediaRepository.kt => CompositeLocalMediaRepository.kt} (89%) rename core/src/main/java/hu/bbara/purefin/data/{MediaRepository.kt => LocalMediaRepository.kt} (92%) rename data/src/main/java/hu/bbara/purefin/data/catalog/{InMemoryMediaRepository.kt => InMemoryLocalMediaRepository.kt} (98%) rename data/src/main/java/hu/bbara/purefin/data/catalog/{OfflineMediaRepository.kt => OfflineLocalMediaRepository.kt} (94%) diff --git a/core/src/main/java/hu/bbara/purefin/data/CompositeMediaRepository.kt b/core/src/main/java/hu/bbara/purefin/data/CompositeLocalMediaRepository.kt similarity index 89% rename from core/src/main/java/hu/bbara/purefin/data/CompositeMediaRepository.kt rename to core/src/main/java/hu/bbara/purefin/data/CompositeLocalMediaRepository.kt index 3e350957..ec0ac2e4 100644 --- a/core/src/main/java/hu/bbara/purefin/data/CompositeMediaRepository.kt +++ b/core/src/main/java/hu/bbara/purefin/data/CompositeLocalMediaRepository.kt @@ -22,15 +22,15 @@ import javax.inject.Singleton @OptIn(ExperimentalCoroutinesApi::class) @Singleton -class CompositeMediaRepository @Inject constructor( - @Offline private val offlineRepository: MediaRepository, - @Online private val onlineRepository: MediaRepository, -) : MediaRepository { +class CompositeLocalMediaRepository @Inject constructor( + @Offline private val offlineRepository: LocalMediaRepository, + @Online private val onlineRepository: LocalMediaRepository, +) : LocalMediaRepository { 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 = flowOf(onlineRepository) + private val activeRepository: Flow = flowOf(onlineRepository) override val movies: StateFlow> = activeRepository .flatMapLatest { it.movies } diff --git a/core/src/main/java/hu/bbara/purefin/data/MediaRepository.kt b/core/src/main/java/hu/bbara/purefin/data/LocalMediaRepository.kt similarity index 92% rename from core/src/main/java/hu/bbara/purefin/data/MediaRepository.kt rename to core/src/main/java/hu/bbara/purefin/data/LocalMediaRepository.kt index 6abd115a..86e90e95 100644 --- a/core/src/main/java/hu/bbara/purefin/data/MediaRepository.kt +++ b/core/src/main/java/hu/bbara/purefin/data/LocalMediaRepository.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import java.util.UUID -interface MediaRepository : MediaProgressWriter { +interface LocalMediaRepository : MediaProgressWriter { val movies: StateFlow> val series: StateFlow> val episodes: StateFlow> diff --git a/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt b/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt index 50f7bf6d..704ab150 100644 --- a/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt +++ b/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt @@ -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.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository 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: MediaRepository, + private val mediaCatalogReader: LocalMediaRepository, private val userSessionRepository: UserSessionRepository, private val navigationManager: NavigationManager, private val mediaDownloadManager: MediaDownloadController, diff --git a/core/src/main/java/hu/bbara/purefin/feature/content/episode/EpisodeScreenViewModel.kt b/core/src/main/java/hu/bbara/purefin/feature/content/episode/EpisodeScreenViewModel.kt index 2e101b56..849cc5ad 100644 --- a/core/src/main/java/hu/bbara/purefin/feature/content/episode/EpisodeScreenViewModel.kt +++ b/core/src/main/java/hu/bbara/purefin/feature/content/episode/EpisodeScreenViewModel.kt @@ -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.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository 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: MediaRepository, + private val mediaCatalogReader: LocalMediaRepository, private val navigationManager: NavigationManager, private val mediaDownloadManager: MediaDownloadController, ): ViewModel() { diff --git a/core/src/main/java/hu/bbara/purefin/feature/content/movie/MovieScreenViewModel.kt b/core/src/main/java/hu/bbara/purefin/feature/content/movie/MovieScreenViewModel.kt index 01a63c91..9609ff88 100644 --- a/core/src/main/java/hu/bbara/purefin/feature/content/movie/MovieScreenViewModel.kt +++ b/core/src/main/java/hu/bbara/purefin/feature/content/movie/MovieScreenViewModel.kt @@ -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.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository 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: MediaRepository, + private val mediaCatalogReader: LocalMediaRepository, private val navigationManager: NavigationManager, private val mediaDownloadManager: MediaDownloadController, ): ViewModel() { diff --git a/core/src/main/java/hu/bbara/purefin/feature/content/series/SeriesViewModel.kt b/core/src/main/java/hu/bbara/purefin/feature/content/series/SeriesViewModel.kt index 671d287c..bdacebad 100644 --- a/core/src/main/java/hu/bbara/purefin/feature/content/series/SeriesViewModel.kt +++ b/core/src/main/java/hu/bbara/purefin/feature/content/series/SeriesViewModel.kt @@ -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.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository 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: MediaRepository, + private val mediaCatalogReader: LocalMediaRepository, private val navigationManager: NavigationManager, private val mediaDownloadManager: MediaDownloadController, ) : ViewModel() { diff --git a/core/src/main/java/hu/bbara/purefin/feature/downloads/DownloadsViewModel.kt b/core/src/main/java/hu/bbara/purefin/feature/downloads/DownloadsViewModel.kt index 9662c4af..c8e28b8e 100644 --- a/core/src/main/java/hu/bbara/purefin/feature/downloads/DownloadsViewModel.kt +++ b/core/src/main/java/hu/bbara/purefin/feature/downloads/DownloadsViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import hu.bbara.purefin.Offline -import hu.bbara.purefin.data.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository import hu.bbara.purefin.download.MediaDownloadController import hu.bbara.purefin.image.ArtworkKind import hu.bbara.purefin.image.ImageUrlBuilder @@ -23,7 +23,7 @@ import javax.inject.Inject @HiltViewModel class DownloadsViewModel @Inject constructor( - @Offline private val offlineCatalogReader: MediaRepository, + @Offline private val offlineCatalogReader: LocalMediaRepository, private val navigationManager: NavigationManager, private val downloadManager: MediaDownloadController, ) : ViewModel() { diff --git a/core/src/main/java/hu/bbara/purefin/feature/search/SearchViewModel.kt b/core/src/main/java/hu/bbara/purefin/feature/search/SearchViewModel.kt index 3e502d79..70b3d060 100644 --- a/core/src/main/java/hu/bbara/purefin/feature/search/SearchViewModel.kt +++ b/core/src/main/java/hu/bbara/purefin/feature/search/SearchViewModel.kt @@ -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.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository 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: MediaRepository, + private val mediaCatalogReader: LocalMediaRepository, private val userSessionRepository: UserSessionRepository, private val navigationManager: NavigationManager, ) : ViewModel() { diff --git a/core/src/main/java/hu/bbara/purefin/module/RepositoryModule.kt b/core/src/main/java/hu/bbara/purefin/module/RepositoryModule.kt index 0511d8a5..d244c713 100644 --- a/core/src/main/java/hu/bbara/purefin/module/RepositoryModule.kt +++ b/core/src/main/java/hu/bbara/purefin/module/RepositoryModule.kt @@ -4,9 +4,9 @@ import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import hu.bbara.purefin.data.CompositeMediaRepository +import hu.bbara.purefin.data.CompositeLocalMediaRepository import hu.bbara.purefin.data.MediaProgressWriter -import hu.bbara.purefin.data.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository @Module @@ -14,8 +14,8 @@ import hu.bbara.purefin.data.MediaRepository abstract class RepositoryModule { @Binds - abstract fun bindMediaRepository(impl: CompositeMediaRepository): MediaRepository + abstract fun bindMediaRepository(impl: CompositeLocalMediaRepository): LocalMediaRepository @Binds - abstract fun bindMediaProgressWrite(impl: CompositeMediaRepository): MediaProgressWriter + abstract fun bindMediaProgressWrite(impl: CompositeLocalMediaRepository): MediaProgressWriter } diff --git a/core/src/main/java/hu/bbara/purefin/player/viewmodel/PlayerViewModel.kt b/core/src/main/java/hu/bbara/purefin/player/viewmodel/PlayerViewModel.kt index 559cc629..8f586fee 100644 --- a/core/src/main/java/hu/bbara/purefin/player/viewmodel/PlayerViewModel.kt +++ b/core/src/main/java/hu/bbara/purefin/player/viewmodel/PlayerViewModel.kt @@ -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.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository 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: MediaRepository, + private val mediaCatalogReader: LocalMediaRepository, private val progressManager: ProgressManager, ) : ViewModel() { companion object { diff --git a/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryAppContentRepository.kt b/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryAppContentRepository.kt index f60e2b08..ae23a09d 100644 --- a/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryAppContentRepository.kt +++ b/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryAppContentRepository.kt @@ -48,7 +48,7 @@ class InMemoryAppContentRepository @Inject constructor( val userSessionRepository: UserSessionRepository, val jellyfinApiClient: JellyfinApiClient, private val homeCacheDataStore: DataStore, - private val onlineMediaRepository: InMemoryMediaRepository, + private val onlineMediaRepository: InMemoryLocalMediaRepository, private val networkMonitor: NetworkMonitor, ) : HomeRepository { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) diff --git a/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryMediaRepository.kt b/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryLocalMediaRepository.kt similarity index 98% rename from data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryMediaRepository.kt rename to data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryLocalMediaRepository.kt index bb363575..88340104 100644 --- a/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryMediaRepository.kt +++ b/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryLocalMediaRepository.kt @@ -1,7 +1,7 @@ package hu.bbara.purefin.data.catalog import android.util.Log -import hu.bbara.purefin.data.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository import hu.bbara.purefin.data.UserSessionRepository import hu.bbara.purefin.data.converter.toEpisode import hu.bbara.purefin.data.converter.toMovie @@ -31,10 +31,10 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class InMemoryMediaRepository @Inject constructor( +class InMemoryLocalMediaRepository @Inject constructor( private val userSessionRepository: UserSessionRepository, private val jellyfinApiClient: JellyfinApiClient, -) : MediaRepository { +) : LocalMediaRepository { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) diff --git a/data/src/main/java/hu/bbara/purefin/data/catalog/OfflineMediaRepository.kt b/data/src/main/java/hu/bbara/purefin/data/catalog/OfflineLocalMediaRepository.kt similarity index 94% rename from data/src/main/java/hu/bbara/purefin/data/catalog/OfflineMediaRepository.kt rename to data/src/main/java/hu/bbara/purefin/data/catalog/OfflineLocalMediaRepository.kt index 4c30beca..fb4a4ade 100644 --- a/data/src/main/java/hu/bbara/purefin/data/catalog/OfflineMediaRepository.kt +++ b/data/src/main/java/hu/bbara/purefin/data/catalog/OfflineLocalMediaRepository.kt @@ -1,6 +1,6 @@ package hu.bbara.purefin.data.catalog -import hu.bbara.purefin.data.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository import hu.bbara.purefin.data.offline.room.offline.OfflineRoomMediaLocalDataSource import hu.bbara.purefin.model.Episode import hu.bbara.purefin.model.Genre @@ -20,9 +20,9 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class OfflineMediaRepository @Inject constructor( +class OfflineLocalMediaRepository @Inject constructor( private val localDataSource: OfflineRoomMediaLocalDataSource, -) : MediaRepository { +) : LocalMediaRepository { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) override val movies: StateFlow> = localDataSource.moviesFlow diff --git a/data/src/main/java/hu/bbara/purefin/data/jellyfin/client/JellyfinApiClient.kt b/data/src/main/java/hu/bbara/purefin/data/jellyfin/client/JellyfinApiClient.kt index e04b522e..e3f4edeb 100644 --- a/data/src/main/java/hu/bbara/purefin/data/jellyfin/client/JellyfinApiClient.kt +++ b/data/src/main/java/hu/bbara/purefin/data/jellyfin/client/JellyfinApiClient.kt @@ -107,6 +107,36 @@ class JellyfinApiClient @Inject constructor( } } + suspend fun searchBySearchTerm(searchTerm: String): List = withContext(Dispatchers.IO) { + logApiFailure("searchBySearchTerm") { + if (!ensureConfigured()) { + return@logApiFailure emptyList() + } + val response = api.itemsApi.getItems( + userId = getUserId(), + includeItemTypes = listOf(BaseItemKind.MOVIE, BaseItemKind.SERIES), + searchTerm = searchTerm, + ) + Log.d("searchBySearchTerm", response.content.toString()) + response.content.items + } + } + + suspend fun searchByGenre(genres: List): List = withContext(Dispatchers.IO) { + logApiFailure("searchMovie") { + if (!ensureConfigured()) { + return@logApiFailure emptyList() + } + val response = api.itemsApi.getItems( + userId = getUserId(), + includeItemTypes = listOf(BaseItemKind.MOVIE, BaseItemKind.SERIES), + genres = genres + ) + Log.d("searchByGenre", response.content.toString()) + response.content.items + } + } + suspend fun getLibraries(): List = withContext(Dispatchers.IO) { logApiFailure("getLibraries") { if (!ensureConfigured()) { diff --git a/data/src/main/java/hu/bbara/purefin/data/module/MediaRepositoryModule.kt b/data/src/main/java/hu/bbara/purefin/data/module/MediaRepositoryModule.kt index b54af7d6..f8b8c55f 100644 --- a/data/src/main/java/hu/bbara/purefin/data/module/MediaRepositoryModule.kt +++ b/data/src/main/java/hu/bbara/purefin/data/module/MediaRepositoryModule.kt @@ -7,10 +7,10 @@ import dagger.hilt.components.SingletonComponent import hu.bbara.purefin.Offline import hu.bbara.purefin.Online import hu.bbara.purefin.data.HomeRepository -import hu.bbara.purefin.data.MediaRepository +import hu.bbara.purefin.data.LocalMediaRepository import hu.bbara.purefin.data.catalog.InMemoryAppContentRepository -import hu.bbara.purefin.data.catalog.InMemoryMediaRepository -import hu.bbara.purefin.data.catalog.OfflineMediaRepository +import hu.bbara.purefin.data.catalog.InMemoryLocalMediaRepository +import hu.bbara.purefin.data.catalog.OfflineLocalMediaRepository @Module @InstallIn(SingletonComponent::class) @@ -18,11 +18,11 @@ abstract class MediaRepositoryModule { @Binds @Online - abstract fun bindOnlineRepository(impl: InMemoryMediaRepository): MediaRepository + abstract fun bindOnlineRepository(impl: InMemoryLocalMediaRepository): LocalMediaRepository @Binds @Offline - abstract fun bindOfflineRepository(impl: OfflineMediaRepository): MediaRepository + abstract fun bindOfflineRepository(impl: OfflineLocalMediaRepository): LocalMediaRepository @Binds abstract fun bindHomeRepository(impl: InMemoryAppContentRepository): HomeRepository