refactor: rename media repository files for consistency

This commit is contained in:
2026-05-02 16:53:48 +02:00
parent 217e8df417
commit 36e89f35d9
15 changed files with 66 additions and 36 deletions

View File

@@ -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<MediaRepository> = flowOf(onlineRepository)
private val activeRepository: Flow<LocalMediaRepository> = flowOf(onlineRepository)
override val movies: StateFlow<Map<UUID, Movie>> = activeRepository
.flatMapLatest { it.movies }

View File

@@ -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<Map<UUID, Movie>>
val series: StateFlow<Map<UUID, Series>>
val episodes: StateFlow<Map<UUID, Episode>>

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.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,

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.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() {

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.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() {

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.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() {

View File

@@ -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() {

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.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() {

View File

@@ -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
}

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.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 {

View File

@@ -48,7 +48,7 @@ class InMemoryAppContentRepository @Inject constructor(
val userSessionRepository: UserSessionRepository,
val jellyfinApiClient: JellyfinApiClient,
private val homeCacheDataStore: DataStore<HomeCache>,
private val onlineMediaRepository: InMemoryMediaRepository,
private val onlineMediaRepository: InMemoryLocalMediaRepository,
private val networkMonitor: NetworkMonitor,
) : HomeRepository {
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)

View File

@@ -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)

View File

@@ -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<Map<UUID, Movie>> = localDataSource.moviesFlow

View File

@@ -107,6 +107,36 @@ class JellyfinApiClient @Inject constructor(
}
}
suspend fun searchBySearchTerm(searchTerm: String): List<BaseItemDto> = 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<String>): List<BaseItemDto> = 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<BaseItemDto> = withContext(Dispatchers.IO) {
logApiFailure("getLibraries") {
if (!ensureConfigured()) {

View File

@@ -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