diff --git a/core/src/main/java/hu/bbara/purefin/core/data/OfflineCatalogStore.kt b/core/src/main/java/hu/bbara/purefin/core/data/OfflineMediaManager.kt similarity index 95% rename from core/src/main/java/hu/bbara/purefin/core/data/OfflineCatalogStore.kt rename to core/src/main/java/hu/bbara/purefin/core/data/OfflineMediaManager.kt index c9f02604..1a441bba 100644 --- a/core/src/main/java/hu/bbara/purefin/core/data/OfflineCatalogStore.kt +++ b/core/src/main/java/hu/bbara/purefin/core/data/OfflineMediaManager.kt @@ -6,7 +6,7 @@ import hu.bbara.purefin.model.Season import hu.bbara.purefin.model.Series import java.util.UUID -interface OfflineCatalogStore { +interface OfflineMediaManager { suspend fun saveMovies(movies: List) suspend fun saveSeries(series: List) suspend fun saveSeason(season: Season) diff --git a/core/src/main/java/hu/bbara/purefin/core/download/MediaDownloadManager.kt b/core/src/main/java/hu/bbara/purefin/core/download/MediaDownloadManager.kt index 3c52a31e..4cd3e3f7 100644 --- a/core/src/main/java/hu/bbara/purefin/core/download/MediaDownloadManager.kt +++ b/core/src/main/java/hu/bbara/purefin/core/download/MediaDownloadManager.kt @@ -10,7 +10,7 @@ import androidx.media3.exoplayer.offline.DownloadManager import androidx.media3.exoplayer.offline.DownloadRequest import dagger.hilt.android.qualifiers.ApplicationContext import hu.bbara.purefin.core.data.DownloadMediaSourceResolver -import hu.bbara.purefin.core.data.OfflineCatalogStore +import hu.bbara.purefin.core.data.OfflineMediaManager import hu.bbara.purefin.core.data.SmartDownloadStore import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers @@ -36,7 +36,7 @@ class MediaDownloadManager @Inject constructor( @ApplicationContext private val context: Context, private val downloadManager: DownloadManager, private val downloadMediaSourceResolver: DownloadMediaSourceResolver, - private val offlineCatalogStore: OfflineCatalogStore, + private val offlineMediaManager: OfflineMediaManager, private val smartDownloadStore: SmartDownloadStore, ) : MediaDownloadController { @@ -125,7 +125,7 @@ class MediaDownloadManager @Inject constructor( return@withContext } - offlineCatalogStore.saveMovies(listOf(source.movie)) + offlineMediaManager.saveMovies(listOf(source.movie)) Timber.tag(TAG).d("Starting download for '${source.movie.title}' from: ${source.playbackUrl}") val request = buildDownloadRequest( @@ -147,7 +147,7 @@ class MediaDownloadManager @Inject constructor( withContext(Dispatchers.IO) { PurefinDownloadService.sendRemoveDownload(context, movieId.toString()) try { - offlineCatalogStore.deleteMovie(movieId) + offlineMediaManager.deleteMovie(movieId) } catch (e: Exception) { Timber.tag(TAG).e(e, "Failed to remove movie from offline DB") } @@ -162,15 +162,15 @@ class MediaDownloadManager @Inject constructor( return@withContext } - if (offlineCatalogStore.getSeriesBasic(source.series.id) == null) { - offlineCatalogStore.saveSeries(listOf(source.series)) + if (offlineMediaManager.getSeriesBasic(source.series.id) == null) { + offlineMediaManager.saveSeries(listOf(source.series)) } - if (offlineCatalogStore.getSeason(source.season.id) == null) { - offlineCatalogStore.saveSeason(source.season) + if (offlineMediaManager.getSeason(source.season.id) == null) { + offlineMediaManager.saveSeason(source.season) } - offlineCatalogStore.saveEpisode(source.episode) + offlineMediaManager.saveEpisode(source.episode) Timber.tag(TAG).d("Starting download for episode '${source.episode.title}' from: ${source.playbackUrl}") val request = buildDownloadRequest( @@ -200,7 +200,7 @@ class MediaDownloadManager @Inject constructor( withContext(Dispatchers.IO) { PurefinDownloadService.sendRemoveDownload(context, episodeId.toString()) try { - offlineCatalogStore.deleteEpisodeAndCleanup(episodeId) + offlineMediaManager.deleteEpisodeAndCleanup(episodeId) } catch (e: Exception) { Timber.tag(TAG).e(e, "Failed to remove episode from offline DB") } @@ -217,7 +217,7 @@ class MediaDownloadManager @Inject constructor( override suspend fun deleteSmartDownloads(seriesId: UUID) { withContext(Dispatchers.IO) { smartDownloadStore.disable(seriesId) - offlineCatalogStore.getEpisodesBySeries(seriesId).forEach { episode -> + offlineMediaManager.getEpisodesBySeries(seriesId).forEach { episode -> cancelEpisodeDownload(episode.id) } } @@ -243,7 +243,7 @@ class MediaDownloadManager @Inject constructor( private suspend fun syncSmartDownloadsForSeries(seriesId: UUID) { withContext(Dispatchers.IO) { // 1. Get currently downloaded episodes for this series - val downloadedEpisodes = offlineCatalogStore.getEpisodesBySeries(seriesId) + val downloadedEpisodes = offlineMediaManager.getEpisodesBySeries(seriesId) // 2. Check watched status from server and delete watched downloads val unwatchedDownloaded = mutableListOf() 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 8420a502..36a00ba3 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 @@ -1,9 +1,11 @@ package hu.bbara.purefin.data.catalog import hu.bbara.purefin.core.data.LocalMediaRepository +import hu.bbara.purefin.core.data.OfflineMediaManager import hu.bbara.purefin.data.offline.room.offline.OfflineRoomMediaLocalDataSource import hu.bbara.purefin.model.Episode import hu.bbara.purefin.model.Movie +import hu.bbara.purefin.model.Season import hu.bbara.purefin.model.Series import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -20,7 +22,7 @@ import javax.inject.Singleton @Singleton class OfflineLocalMediaRepository @Inject constructor( private val localDataSource: OfflineRoomMediaLocalDataSource, -) : LocalMediaRepository { +) : LocalMediaRepository, OfflineMediaManager { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) override val movies: StateFlow> = localDataSource.moviesFlow @@ -68,4 +70,40 @@ class OfflineLocalMediaRepository @Inject constructor( override suspend fun markAsWatched(mediaId: UUID, watched: Boolean) { // Do nothing } + + override suspend fun saveMovies(movies: List) { + localDataSource.saveMovies(movies) + } + + override suspend fun saveSeries(series: List) { + localDataSource.saveSeries(series) + } + + override suspend fun saveSeason(season: Season) { + localDataSource.saveSeason(season) + } + + override suspend fun saveEpisode(episode: Episode) { + localDataSource.saveEpisode(episode) + } + + override suspend fun getSeriesBasic(seriesId: UUID): Series? { + return localDataSource.getSeriesBasic(seriesId) + } + + override suspend fun getSeason(seasonId: UUID): Season? { + return localDataSource.getSeason(seasonId) + } + + override suspend fun deleteMovie(movieId: UUID) { + localDataSource.deleteMovie(movieId) + } + + override suspend fun deleteEpisodeAndCleanup(episodeId: UUID) { + localDataSource.deleteEpisodeAndCleanup(episodeId) + } + + override suspend fun getEpisodesBySeries(seriesId: UUID): List { + return localDataSource.getEpisodesBySeries(seriesId) + } } diff --git a/data/src/main/java/hu/bbara/purefin/data/offline/OfflineBindingsModule.kt b/data/src/main/java/hu/bbara/purefin/data/offline/OfflineBindingsModule.kt index 146c13d1..557c3350 100644 --- a/data/src/main/java/hu/bbara/purefin/data/offline/OfflineBindingsModule.kt +++ b/data/src/main/java/hu/bbara/purefin/data/offline/OfflineBindingsModule.kt @@ -4,15 +4,16 @@ import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import hu.bbara.purefin.core.data.OfflineCatalogStore +import hu.bbara.purefin.core.data.OfflineMediaManager import hu.bbara.purefin.core.data.SmartDownloadStore +import hu.bbara.purefin.data.catalog.OfflineLocalMediaRepository @Module @InstallIn(SingletonComponent::class) abstract class OfflineBindingsModule { @Binds - abstract fun bindOfflineCatalogStore(impl: RoomOfflineCatalogStore): OfflineCatalogStore + abstract fun bindOfflineMediaManager(impl: OfflineLocalMediaRepository): OfflineMediaManager @Binds abstract fun bindSmartDownloadStore(impl: RoomSmartDownloadStore): SmartDownloadStore diff --git a/data/src/main/java/hu/bbara/purefin/data/offline/RoomOfflineCatalogStore.kt b/data/src/main/java/hu/bbara/purefin/data/offline/RoomOfflineCatalogStore.kt deleted file mode 100644 index f2f87427..00000000 --- a/data/src/main/java/hu/bbara/purefin/data/offline/RoomOfflineCatalogStore.kt +++ /dev/null @@ -1,52 +0,0 @@ -package hu.bbara.purefin.data.offline - -import hu.bbara.purefin.core.data.OfflineCatalogStore -import hu.bbara.purefin.data.offline.room.offline.OfflineRoomMediaLocalDataSource -import hu.bbara.purefin.model.Episode -import hu.bbara.purefin.model.Movie -import hu.bbara.purefin.model.Season -import hu.bbara.purefin.model.Series -import java.util.UUID -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class RoomOfflineCatalogStore @Inject constructor( - private val localDataSource: OfflineRoomMediaLocalDataSource, -) : OfflineCatalogStore { - override suspend fun saveMovies(movies: List) { - localDataSource.saveMovies(movies) - } - - override suspend fun saveSeries(series: List) { - localDataSource.saveSeries(series) - } - - override suspend fun saveSeason(season: Season) { - localDataSource.saveSeason(season) - } - - override suspend fun saveEpisode(episode: Episode) { - localDataSource.saveEpisode(episode) - } - - override suspend fun getSeriesBasic(seriesId: UUID): Series? { - return localDataSource.getSeriesBasic(seriesId) - } - - override suspend fun getSeason(seasonId: UUID): Season? { - return localDataSource.getSeason(seasonId) - } - - override suspend fun deleteMovie(movieId: UUID) { - localDataSource.deleteMovie(movieId) - } - - override suspend fun deleteEpisodeAndCleanup(episodeId: UUID) { - localDataSource.deleteEpisodeAndCleanup(episodeId) - } - - override suspend fun getEpisodesBySeries(seriesId: UUID): List { - return localDataSource.getEpisodesBySeries(seriesId) - } -}