diff --git a/.gitignore b/.gitignore
index 8ccc4f8..3ea61a1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,7 +9,7 @@
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
-/build
+**/build
/captures
.externalNativeBuild
.cxx
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 8c4dd43..f413d51 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -47,6 +47,11 @@ kotlin {
}
dependencies {
+ implementation(project(":core:model"))
+ implementation(project(":core:data"))
+ implementation(project(":feature:download"))
+ implementation(project(":core:player"))
+ implementation(project(":feature:shared"))
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.lifecycle.viewmodel.compose)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3862882..82ad2fa 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -33,7 +33,7 @@
android:exported="false"
android:theme="@style/Theme.Purefin" />
diff --git a/app/src/main/java/hu/bbara/purefin/PurefinActivity.kt b/app/src/main/java/hu/bbara/purefin/PurefinActivity.kt
index 215ee86..222072a 100644
--- a/app/src/main/java/hu/bbara/purefin/PurefinActivity.kt
+++ b/app/src/main/java/hu/bbara/purefin/PurefinActivity.kt
@@ -31,15 +31,15 @@ import coil3.network.okhttp.OkHttpNetworkFetcherFactory
import coil3.request.crossfade
import coil3.util.DebugLogger
import dagger.hilt.android.AndroidEntryPoint
-import hu.bbara.purefin.client.JellyfinApiClient
-import hu.bbara.purefin.client.JellyfinAuthInterceptor
import hu.bbara.purefin.common.ui.PurefinWaitingScreen
+import hu.bbara.purefin.core.data.client.JellyfinApiClient
+import hu.bbara.purefin.core.data.client.JellyfinAuthInterceptor
+import hu.bbara.purefin.core.data.navigation.LocalNavigationManager
+import hu.bbara.purefin.core.data.navigation.NavigationCommand
+import hu.bbara.purefin.core.data.navigation.NavigationManager
+import hu.bbara.purefin.core.data.navigation.Route
+import hu.bbara.purefin.core.data.session.UserSessionRepository
import hu.bbara.purefin.login.ui.LoginScreen
-import hu.bbara.purefin.navigation.LocalNavigationManager
-import hu.bbara.purefin.navigation.NavigationCommand
-import hu.bbara.purefin.navigation.NavigationManager
-import hu.bbara.purefin.navigation.Route
-import hu.bbara.purefin.session.UserSessionRepository
import hu.bbara.purefin.ui.theme.AppTheme
import kotlinx.coroutines.launch
import okhttp3.OkHttpClient
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/ContentMockData.kt b/app/src/main/java/hu/bbara/purefin/app/content/ContentMockData.kt
index dc328f2..68b7159 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/ContentMockData.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/content/ContentMockData.kt
@@ -1,14 +1,14 @@
package hu.bbara.purefin.app.content
-import hu.bbara.purefin.app.content.episode.EpisodeUiModel
-import hu.bbara.purefin.app.content.movie.MovieUiModel
-import hu.bbara.purefin.app.content.series.SeriesCastMemberUiModel
-import hu.bbara.purefin.app.content.series.SeriesEpisodeUiModel
-import hu.bbara.purefin.app.content.series.SeriesSeasonUiModel
-import hu.bbara.purefin.app.content.series.SeriesUiModel
+import hu.bbara.purefin.feature.shared.content.episode.EpisodeUiModel
+import hu.bbara.purefin.feature.shared.content.movie.MovieUiModel
+import hu.bbara.purefin.feature.shared.content.series.SeriesCastMemberUiModel
+import hu.bbara.purefin.feature.shared.content.series.SeriesEpisodeUiModel
+import hu.bbara.purefin.feature.shared.content.series.SeriesSeasonUiModel
+import hu.bbara.purefin.feature.shared.content.series.SeriesUiModel
import org.jellyfin.sdk.model.UUID
-import hu.bbara.purefin.app.content.episode.CastMember as EpisodeCastMember
-import hu.bbara.purefin.app.content.movie.CastMember as MovieCastMember
+import hu.bbara.purefin.feature.shared.content.episode.CastMember as EpisodeCastMember
+import hu.bbara.purefin.feature.shared.content.movie.CastMember as MovieCastMember
object ContentMockData {
fun series(): SeriesUiModel {
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeComponents.kt b/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeComponents.kt
index 2cf47be..d490199 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeComponents.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeComponents.kt
@@ -37,7 +37,7 @@ import hu.bbara.purefin.common.ui.components.GhostIconButton
import hu.bbara.purefin.common.ui.components.MediaActionButton
import hu.bbara.purefin.common.ui.components.MediaPlaybackSettings
import hu.bbara.purefin.common.ui.components.MediaResumeButton
-import hu.bbara.purefin.data.model.Episode
+import hu.bbara.purefin.core.model.Episode
import hu.bbara.purefin.player.PlayerActivity
@Composable
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt b/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt
index c656832..919d5c3 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreen.kt
@@ -16,8 +16,9 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import hu.bbara.purefin.common.ui.PurefinWaitingScreen
import hu.bbara.purefin.common.ui.components.MediaHero
-import hu.bbara.purefin.data.model.Episode
-import hu.bbara.purefin.navigation.EpisodeDto
+import hu.bbara.purefin.core.data.navigation.EpisodeDto
+import hu.bbara.purefin.core.model.Episode
+import hu.bbara.purefin.feature.shared.content.episode.EpisodeScreenViewModel
@Composable
fun EpisodeScreen(
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieComponents.kt b/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieComponents.kt
index f220630..6514d23 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieComponents.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieComponents.kt
@@ -39,7 +39,8 @@ import hu.bbara.purefin.common.ui.components.GhostIconButton
import hu.bbara.purefin.common.ui.components.MediaActionButton
import hu.bbara.purefin.common.ui.components.MediaPlaybackSettings
import hu.bbara.purefin.common.ui.components.MediaResumeButton
-import hu.bbara.purefin.download.DownloadState
+import hu.bbara.purefin.feature.download.DownloadState
+import hu.bbara.purefin.feature.shared.content.movie.MovieUiModel
import hu.bbara.purefin.player.PlayerActivity
@Composable
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt b/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt
index ffc7cff..f7dc32b 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreen.kt
@@ -22,8 +22,10 @@ import androidx.hilt.navigation.compose.hiltViewModel
import hu.bbara.purefin.app.content.ContentMockData
import hu.bbara.purefin.common.ui.PurefinWaitingScreen
import hu.bbara.purefin.common.ui.components.MediaHero
-import hu.bbara.purefin.download.DownloadState
-import hu.bbara.purefin.navigation.MovieDto
+import hu.bbara.purefin.core.data.navigation.MovieDto
+import hu.bbara.purefin.feature.download.DownloadState
+import hu.bbara.purefin.feature.shared.content.movie.MovieScreenViewModel
+import hu.bbara.purefin.feature.shared.content.movie.MovieUiModel
@Composable
fun MovieScreen(
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesComponents.kt b/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesComponents.kt
index d4a38c8..4693674 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesComponents.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesComponents.kt
@@ -53,10 +53,11 @@ import hu.bbara.purefin.common.ui.components.MediaActionButton
import hu.bbara.purefin.common.ui.components.MediaProgressBar
import hu.bbara.purefin.common.ui.components.PurefinAsyncImage
import hu.bbara.purefin.common.ui.components.WatchStateIndicator
-import hu.bbara.purefin.data.model.CastMember
-import hu.bbara.purefin.data.model.Episode
-import hu.bbara.purefin.data.model.Season
-import hu.bbara.purefin.data.model.Series
+import hu.bbara.purefin.core.model.CastMember
+import hu.bbara.purefin.core.model.Episode
+import hu.bbara.purefin.core.model.Season
+import hu.bbara.purefin.core.model.Series
+import hu.bbara.purefin.feature.shared.content.series.SeriesViewModel
@Composable
internal fun SeriesTopBar(
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt b/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt
index 99c88c1..36c079a 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesScreen.kt
@@ -24,9 +24,10 @@ import androidx.hilt.navigation.compose.hiltViewModel
import hu.bbara.purefin.common.ui.MediaSynopsis
import hu.bbara.purefin.common.ui.PurefinWaitingScreen
import hu.bbara.purefin.common.ui.components.MediaHero
-import hu.bbara.purefin.data.model.Season
-import hu.bbara.purefin.data.model.Series
-import hu.bbara.purefin.navigation.SeriesDto
+import hu.bbara.purefin.core.data.navigation.SeriesDto
+import hu.bbara.purefin.core.model.Season
+import hu.bbara.purefin.core.model.Series
+import hu.bbara.purefin.feature.shared.content.series.SeriesViewModel
@Composable
fun SeriesScreen(
diff --git a/app/src/main/java/hu/bbara/purefin/app/home/HomeNavigation.kt b/app/src/main/java/hu/bbara/purefin/app/home/HomeNavigation.kt
index 41303bb..6f83d74 100644
--- a/app/src/main/java/hu/bbara/purefin/app/home/HomeNavigation.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/home/HomeNavigation.kt
@@ -1,7 +1,7 @@
package hu.bbara.purefin.app.home
import androidx.navigation3.runtime.EntryProviderScope
-import hu.bbara.purefin.navigation.Route
+import hu.bbara.purefin.core.data.navigation.Route
/**
* Navigation 3 entry definition for the Home section.
diff --git a/app/src/main/java/hu/bbara/purefin/app/home/HomePage.kt b/app/src/main/java/hu/bbara/purefin/app/home/HomePage.kt
index b54cd8f..11eddfb 100644
--- a/app/src/main/java/hu/bbara/purefin/app/home/HomePage.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/home/HomePage.kt
@@ -25,6 +25,7 @@ import hu.bbara.purefin.app.home.ui.HomeDrawerContent
import hu.bbara.purefin.app.home.ui.HomeMockData
import hu.bbara.purefin.app.home.ui.HomeNavItem
import hu.bbara.purefin.app.home.ui.HomeTopBar
+import hu.bbara.purefin.feature.shared.home.HomePageViewModel
import kotlinx.coroutines.launch
import org.jellyfin.sdk.model.api.CollectionType
@@ -74,7 +75,7 @@ fun HomePage(
primaryNavItems = libraryNavItems,
secondaryNavItems = HomeMockData.secondaryNavItems,
user = HomeMockData.user,
- onLibrarySelected = viewModel::onLibrarySelected,
+ onLibrarySelected = { item -> viewModel.onLibrarySelected(item.id, item.label) },
onLogout = viewModel::logout
)
}
diff --git a/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeContent.kt b/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeContent.kt
index 80a2a1f..81413cf 100644
--- a/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeContent.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeContent.kt
@@ -10,6 +10,10 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
+import hu.bbara.purefin.feature.shared.home.ContinueWatchingItem
+import hu.bbara.purefin.feature.shared.home.LibraryItem
+import hu.bbara.purefin.feature.shared.home.NextUpItem
+import hu.bbara.purefin.feature.shared.home.PosterItem
import org.jellyfin.sdk.model.UUID
@Composable
diff --git a/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeModels.kt b/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeModels.kt
index 293ef58..ac6dd1e 100644
--- a/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeModels.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeModels.kt
@@ -1,85 +1,7 @@
package hu.bbara.purefin.app.home.ui
import androidx.compose.ui.graphics.vector.ImageVector
-import hu.bbara.purefin.data.model.Episode
-import hu.bbara.purefin.data.model.Movie
-import hu.bbara.purefin.data.model.Series
import org.jellyfin.sdk.model.UUID
-import org.jellyfin.sdk.model.api.BaseItemKind
-import org.jellyfin.sdk.model.api.CollectionType
-
-data class ContinueWatchingItem(
- val type: BaseItemKind,
- val movie: Movie? = null,
- val episode: Episode? = null
-) {
- val id: UUID = when (type) {
- BaseItemKind.MOVIE -> movie!!.id
- BaseItemKind.EPISODE -> episode!!.id
- else -> throw UnsupportedOperationException("Unsupported item type: $type")
- }
- val primaryText: String = when (type) {
- BaseItemKind.MOVIE -> movie!!.title
- BaseItemKind.EPISODE -> episode!!.title
- else -> throw UnsupportedOperationException("Unsupported item type: $type")
- }
- val secondaryText: String = when (type) {
- BaseItemKind.MOVIE -> movie!!.year
- BaseItemKind.EPISODE -> episode!!.releaseDate
- else -> throw UnsupportedOperationException("Unsupported item type: $type")
- }
- val progress: Double = when (type) {
- BaseItemKind.MOVIE -> movie!!.progress ?: 0.0
- BaseItemKind.EPISODE -> episode!!.progress ?: 0.0
- else -> throw UnsupportedOperationException("Unsupported item type: $type")
- }
-}
-
-data class NextUpItem(
- val episode: Episode
-) {
- val id: UUID = episode.id
- val primaryText: String = episode.title
- val secondaryText: String = episode.releaseDate
-}
-
-data class LibraryItem(
- val id: UUID,
- val name: String,
- val type: CollectionType,
- val isEmpty: Boolean
-)
-
-data class PosterItem(
- val type: BaseItemKind,
- val movie: Movie? = null,
- val series: Series? = null,
- val episode: Episode? = null
-) {
- val id: UUID = when (type) {
- BaseItemKind.MOVIE -> movie!!.id
- BaseItemKind.EPISODE -> episode!!.id
- BaseItemKind.SERIES -> series!!.id
- else -> throw IllegalArgumentException("Invalid type: $type")
- }
- val title: String = when (type) {
- BaseItemKind.MOVIE -> movie!!.title
- BaseItemKind.EPISODE -> episode!!.title
- BaseItemKind.SERIES -> series!!.name
- else -> throw IllegalArgumentException("Invalid type: $type")
- }
- val imageUrl: String = when (type) {
- BaseItemKind.MOVIE -> movie!!.heroImageUrl
- BaseItemKind.EPISODE -> episode!!.heroImageUrl
- BaseItemKind.SERIES -> series!!.heroImageUrl
- else -> throw IllegalArgumentException("Invalid type: $type")
- }
- fun watched() = when (type) {
- BaseItemKind.MOVIE -> movie!!.watched
- BaseItemKind.EPISODE -> episode!!.watched
- else -> throw IllegalArgumentException("Invalid type: $type")
- }
-}
data class HomeNavItem(
val id: UUID,
diff --git a/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeSections.kt b/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeSections.kt
index b028303..1efe5c3 100644
--- a/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeSections.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/home/ui/HomeSections.kt
@@ -40,6 +40,9 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil3.request.ImageRequest
import hu.bbara.purefin.common.ui.PosterCard
+import hu.bbara.purefin.feature.shared.home.ContinueWatchingItem
+import hu.bbara.purefin.feature.shared.home.NextUpItem
+import hu.bbara.purefin.feature.shared.home.PosterItem
import hu.bbara.purefin.common.ui.components.MediaProgressBar
import hu.bbara.purefin.common.ui.components.PurefinAsyncImage
import hu.bbara.purefin.player.PlayerActivity
diff --git a/app/src/main/java/hu/bbara/purefin/app/library/ui/LibraryScreen.kt b/app/src/main/java/hu/bbara/purefin/app/library/ui/LibraryScreen.kt
index 42aaa39..a3406d3 100644
--- a/app/src/main/java/hu/bbara/purefin/app/library/ui/LibraryScreen.kt
+++ b/app/src/main/java/hu/bbara/purefin/app/library/ui/LibraryScreen.kt
@@ -21,11 +21,11 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
-import hu.bbara.purefin.app.home.ui.PosterItem
-import hu.bbara.purefin.app.library.LibraryViewModel
import hu.bbara.purefin.common.ui.PosterCard
import hu.bbara.purefin.common.ui.components.PurefinIconButton
-import hu.bbara.purefin.navigation.LibraryDto
+import hu.bbara.purefin.core.data.navigation.LibraryDto
+import hu.bbara.purefin.feature.shared.home.PosterItem
+import hu.bbara.purefin.feature.shared.library.LibraryViewModel
@Composable
fun LibraryScreen(
diff --git a/app/src/main/java/hu/bbara/purefin/common/ui/MediaDetailComponents.kt b/app/src/main/java/hu/bbara/purefin/common/ui/MediaDetailComponents.kt
index 38f85f5..e3edf62 100644
--- a/app/src/main/java/hu/bbara/purefin/common/ui/MediaDetailComponents.kt
+++ b/app/src/main/java/hu/bbara/purefin/common/ui/MediaDetailComponents.kt
@@ -34,7 +34,7 @@ import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import hu.bbara.purefin.common.ui.components.PurefinAsyncImage
-import hu.bbara.purefin.data.model.CastMember
+import hu.bbara.purefin.core.model.CastMember
@Composable
fun MediaMetaChip(
diff --git a/app/src/main/java/hu/bbara/purefin/common/ui/PosterCard.kt b/app/src/main/java/hu/bbara/purefin/common/ui/PosterCard.kt
index 8c97feb..851172d 100644
--- a/app/src/main/java/hu/bbara/purefin/common/ui/PosterCard.kt
+++ b/app/src/main/java/hu/bbara/purefin/common/ui/PosterCard.kt
@@ -23,10 +23,10 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil3.request.ImageRequest
-import hu.bbara.purefin.app.home.ui.PosterItem
import hu.bbara.purefin.common.ui.components.PurefinAsyncImage
import hu.bbara.purefin.common.ui.components.UnwatchedEpisodeIndicator
import hu.bbara.purefin.common.ui.components.WatchStateIndicator
+import hu.bbara.purefin.feature.shared.home.PosterItem
import org.jellyfin.sdk.model.UUID
import org.jellyfin.sdk.model.api.BaseItemKind
@@ -49,11 +49,10 @@ fun PosterCard(
when (posterItem.type) {
BaseItemKind.MOVIE -> onMovieSelected(posterItem.id)
BaseItemKind.SERIES -> onSeriesSelected(posterItem.id)
- BaseItemKind.EPISODE -> onEpisodeSelected(
- posterItem.episode!!.seriesId,
- posterItem.episode.seasonId,
- posterItem.episode.id
- )
+ BaseItemKind.EPISODE -> {
+ val ep = posterItem.episode!!
+ onEpisodeSelected(ep.seriesId, ep.seasonId, ep.id)
+ }
else -> {}
}
}
@@ -79,20 +78,26 @@ fun PosterCard(
contentScale = ContentScale.Crop
)
when (item.type) {
- BaseItemKind.MOVIE -> WatchStateIndicator(
- size = 28,
- modifier = Modifier.align(Alignment.TopEnd)
- .padding(8.dp),
- watched = item.movie!!.watched,
- started = (item.movie.progress ?: 0.0) > 0
- )
- BaseItemKind.EPISODE -> WatchStateIndicator(
- size = 28,
- modifier = Modifier.align(Alignment.TopEnd)
- .padding(8.dp),
- watched = item.episode!!.watched,
- started = (item.episode.progress ?: 0.0) > 0
- )
+ BaseItemKind.MOVIE -> {
+ val m = item.movie!!
+ WatchStateIndicator(
+ size = 28,
+ modifier = Modifier.align(Alignment.TopEnd)
+ .padding(8.dp),
+ watched = m.watched,
+ started = (m.progress ?: 0.0) > 0
+ )
+ }
+ BaseItemKind.EPISODE -> {
+ val ep = item.episode!!
+ WatchStateIndicator(
+ size = 28,
+ modifier = Modifier.align(Alignment.TopEnd)
+ .padding(8.dp),
+ watched = ep.watched,
+ started = (ep.progress ?: 0.0) > 0
+ )
+ }
BaseItemKind.SERIES -> UnwatchedEpisodeIndicator(
size = 28,
modifier = Modifier.align(Alignment.TopEnd)
diff --git a/app/src/main/java/hu/bbara/purefin/login/ui/LoginScreen.kt b/app/src/main/java/hu/bbara/purefin/login/ui/LoginScreen.kt
index 52af391..2291d44 100644
--- a/app/src/main/java/hu/bbara/purefin/login/ui/LoginScreen.kt
+++ b/app/src/main/java/hu/bbara/purefin/login/ui/LoginScreen.kt
@@ -41,7 +41,7 @@ import hu.bbara.purefin.common.ui.PurefinComplexTextField
import hu.bbara.purefin.common.ui.PurefinPasswordField
import hu.bbara.purefin.common.ui.PurefinTextButton
import hu.bbara.purefin.common.ui.PurefinWaitingScreen
-import hu.bbara.purefin.login.viewmodel.LoginViewModel
+import hu.bbara.purefin.feature.shared.login.LoginViewModel
import kotlinx.coroutines.launch
@Composable
diff --git a/app/src/main/java/hu/bbara/purefin/navigation/NavigationModule.kt b/app/src/main/java/hu/bbara/purefin/navigation/NavigationModule.kt
index c2f31d5..bf42c4a 100644
--- a/app/src/main/java/hu/bbara/purefin/navigation/NavigationModule.kt
+++ b/app/src/main/java/hu/bbara/purefin/navigation/NavigationModule.kt
@@ -6,6 +6,7 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityRetainedComponent
import dagger.multibindings.IntoSet
+import hu.bbara.purefin.core.data.navigation.Route
@Module
@InstallIn(ActivityRetainedComponent::class)
diff --git a/app/src/main/java/hu/bbara/purefin/navigation/RouteEntryBuilder.kt b/app/src/main/java/hu/bbara/purefin/navigation/RouteEntryBuilder.kt
index 7a3a4bc..c77ef0d 100644
--- a/app/src/main/java/hu/bbara/purefin/navigation/RouteEntryBuilder.kt
+++ b/app/src/main/java/hu/bbara/purefin/navigation/RouteEntryBuilder.kt
@@ -6,6 +6,7 @@ import hu.bbara.purefin.app.content.movie.MovieScreen
import hu.bbara.purefin.app.content.series.SeriesScreen
import hu.bbara.purefin.app.home.HomePage
import hu.bbara.purefin.app.library.ui.LibraryScreen
+import hu.bbara.purefin.core.data.navigation.Route
import hu.bbara.purefin.login.ui.LoginScreen
fun EntryProviderScope.appRouteEntryBuilder() {
diff --git a/app/src/main/java/hu/bbara/purefin/player/PlayerActivity.kt b/app/src/main/java/hu/bbara/purefin/player/PlayerActivity.kt
index 71c464a..8b55a30 100644
--- a/app/src/main/java/hu/bbara/purefin/player/PlayerActivity.kt
+++ b/app/src/main/java/hu/bbara/purefin/player/PlayerActivity.kt
@@ -11,8 +11,8 @@ import androidx.core.view.WindowInsetsControllerCompat
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import dagger.hilt.android.AndroidEntryPoint
+import hu.bbara.purefin.core.player.viewmodel.PlayerViewModel
import hu.bbara.purefin.player.ui.PlayerScreen
-import hu.bbara.purefin.player.viewmodel.PlayerViewModel
import hu.bbara.purefin.ui.theme.AppTheme
@AndroidEntryPoint
diff --git a/app/src/main/java/hu/bbara/purefin/player/stream/MediaSourceSelector.kt b/app/src/main/java/hu/bbara/purefin/player/stream/MediaSourceSelector.kt
deleted file mode 100644
index 47c688f..0000000
--- a/app/src/main/java/hu/bbara/purefin/player/stream/MediaSourceSelector.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package hu.bbara.purefin.player.stream
-
-class MediaSourceSelector {
-}
\ No newline at end of file
diff --git a/app/src/main/java/hu/bbara/purefin/player/ui/PlayerScreen.kt b/app/src/main/java/hu/bbara/purefin/player/ui/PlayerScreen.kt
index 5f08f7a..fc080e5 100644
--- a/app/src/main/java/hu/bbara/purefin/player/ui/PlayerScreen.kt
+++ b/app/src/main/java/hu/bbara/purefin/player/ui/PlayerScreen.kt
@@ -39,6 +39,7 @@ import androidx.media3.ui.AspectRatioFrameLayout
import androidx.media3.ui.PlayerView
import hu.bbara.purefin.common.ui.components.EmptyValueTimedVisibility
import hu.bbara.purefin.common.ui.components.ValueChangeTimedVisibility
+import hu.bbara.purefin.core.player.viewmodel.PlayerViewModel
import hu.bbara.purefin.player.ui.components.PersistentOverlayContainer
import hu.bbara.purefin.player.ui.components.PlayerAdjustmentIndicator
import hu.bbara.purefin.player.ui.components.PlayerControlsOverlay
@@ -46,7 +47,6 @@ import hu.bbara.purefin.player.ui.components.PlayerGesturesLayer
import hu.bbara.purefin.player.ui.components.PlayerLoadingErrorEndCard
import hu.bbara.purefin.player.ui.components.PlayerQueuePanel
import hu.bbara.purefin.player.ui.components.rememberPersistentOverlayController
-import hu.bbara.purefin.player.viewmodel.PlayerViewModel
import kotlin.math.abs
import kotlin.math.roundToInt
diff --git a/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerControlsOverlay.kt b/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerControlsOverlay.kt
index f9ffd31..c2dcafd 100644
--- a/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerControlsOverlay.kt
+++ b/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerControlsOverlay.kt
@@ -37,8 +37,8 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import hu.bbara.purefin.common.ui.components.GhostIconButton
import hu.bbara.purefin.common.ui.components.PurefinIconButton
-import hu.bbara.purefin.player.model.PlayerUiState
-import hu.bbara.purefin.player.model.TrackOption
+import hu.bbara.purefin.core.player.model.PlayerUiState
+import hu.bbara.purefin.core.player.model.TrackOption
@Composable
fun PlayerControlsOverlay(
diff --git a/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerLoadingErrorEndCard.kt b/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerLoadingErrorEndCard.kt
index fec89ae..5382810 100644
--- a/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerLoadingErrorEndCard.kt
+++ b/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerLoadingErrorEndCard.kt
@@ -19,7 +19,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
-import hu.bbara.purefin.player.model.PlayerUiState
+import hu.bbara.purefin.core.player.model.PlayerUiState
@Composable
fun PlayerLoadingErrorEndCard(
diff --git a/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerQueuePanel.kt b/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerQueuePanel.kt
index 42e3922..c271a65 100644
--- a/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerQueuePanel.kt
+++ b/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerQueuePanel.kt
@@ -31,7 +31,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import hu.bbara.purefin.common.ui.components.PurefinAsyncImage
-import hu.bbara.purefin.player.model.PlayerUiState
+import hu.bbara.purefin.core.player.model.PlayerUiState
@Composable
fun PlayerQueuePanel(
diff --git a/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerSeekBar.kt b/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerSeekBar.kt
index e360fd2..2def2fa 100644
--- a/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerSeekBar.kt
+++ b/app/src/main/java/hu/bbara/purefin/player/ui/components/PlayerSeekBar.kt
@@ -16,8 +16,8 @@ import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
-import hu.bbara.purefin.player.model.MarkerType
-import hu.bbara.purefin.player.model.TimedMarker
+import hu.bbara.purefin.core.player.model.MarkerType
+import hu.bbara.purefin.core.player.model.TimedMarker
@Composable
fun PlayerSeekBar(
diff --git a/app/src/main/java/hu/bbara/purefin/player/ui/components/TrackSelectionButtons.kt b/app/src/main/java/hu/bbara/purefin/player/ui/components/TrackSelectionButtons.kt
index 7a267f1..8b14f87 100644
--- a/app/src/main/java/hu/bbara/purefin/player/ui/components/TrackSelectionButtons.kt
+++ b/app/src/main/java/hu/bbara/purefin/player/ui/components/TrackSelectionButtons.kt
@@ -27,7 +27,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import hu.bbara.purefin.common.ui.components.PurefinIconButton
-import hu.bbara.purefin.player.model.TrackOption
+import hu.bbara.purefin.core.player.model.TrackOption
@Composable
fun QualitySelectionButton(
diff --git a/build.gradle.kts b/build.gradle.kts
index 1b4e189..5950d80 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,8 +1,10 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
alias(libs.plugins.android.application) apply false
+ alias(libs.plugins.android.library) apply false
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.kotlin.compose) apply false
+ alias(libs.plugins.kotlin.serialization) apply false
alias(libs.plugins.ksp) apply false
alias(libs.plugins.hilt) apply false
}
\ No newline at end of file
diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts
new file mode 100644
index 0000000..9afea19
--- /dev/null
+++ b/core/data/build.gradle.kts
@@ -0,0 +1,52 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
+plugins {
+ alias(libs.plugins.android.library)
+ alias(libs.plugins.kotlin.android)
+ alias(libs.plugins.kotlin.compose)
+ alias(libs.plugins.kotlin.serialization)
+ alias(libs.plugins.hilt)
+ alias(libs.plugins.ksp)
+}
+
+android {
+ namespace = "hu.bbara.purefin.core.data"
+ compileSdk = 36
+
+ defaultConfig {
+ minSdk = 29
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+
+ buildFeatures {
+ compose = true
+ }
+}
+
+kotlin {
+ compilerOptions {
+ jvmTarget.set(JvmTarget.JVM_11)
+ }
+}
+
+dependencies {
+ implementation(project(":core:model"))
+ implementation(libs.jellyfin.core)
+ implementation(libs.kotlinx.serialization.json)
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
+ implementation(libs.datastore)
+ implementation(libs.okhttp)
+ implementation(libs.logging.interceptor)
+ implementation(libs.coil.compose)
+ implementation(libs.coil.network.okhttp)
+ implementation(libs.androidx.room.ktx)
+ ksp(libs.androidx.room.compiler)
+ implementation(libs.androidx.navigation3.runtime)
+ implementation(platform(libs.androidx.compose.bom))
+ implementation(libs.androidx.compose.ui)
+}
diff --git a/app/src/main/java/hu/bbara/purefin/data/ActiveMediaRepository.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/ActiveMediaRepository.kt
similarity index 87%
rename from app/src/main/java/hu/bbara/purefin/data/ActiveMediaRepository.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/ActiveMediaRepository.kt
index 45ca20b..c46ad13 100644
--- a/app/src/main/java/hu/bbara/purefin/data/ActiveMediaRepository.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/ActiveMediaRepository.kt
@@ -1,13 +1,14 @@
-package hu.bbara.purefin.data
+package hu.bbara.purefin.core.data
-import hu.bbara.purefin.data.local.room.OfflineRepository
-import hu.bbara.purefin.data.local.room.OnlineRepository
-import hu.bbara.purefin.data.model.Episode
-import hu.bbara.purefin.data.model.Library
-import hu.bbara.purefin.data.model.Media
-import hu.bbara.purefin.data.model.Movie
-import hu.bbara.purefin.data.model.Series
-import hu.bbara.purefin.session.UserSessionRepository
+import hu.bbara.purefin.core.data.local.room.OfflineRepository
+import hu.bbara.purefin.core.data.local.room.OnlineRepository
+import hu.bbara.purefin.core.data.session.UserSessionRepository
+import hu.bbara.purefin.core.model.Episode
+import hu.bbara.purefin.core.model.Library
+import hu.bbara.purefin.core.model.Media
+import hu.bbara.purefin.core.model.MediaRepositoryState
+import hu.bbara.purefin.core.model.Movie
+import hu.bbara.purefin.core.model.Series
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
diff --git a/app/src/main/java/hu/bbara/purefin/data/InMemoryMediaRepository.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/InMemoryMediaRepository.kt
similarity index 95%
rename from app/src/main/java/hu/bbara/purefin/data/InMemoryMediaRepository.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/InMemoryMediaRepository.kt
index 2f1fe7a..c49bf38 100644
--- a/app/src/main/java/hu/bbara/purefin/data/InMemoryMediaRepository.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/InMemoryMediaRepository.kt
@@ -1,20 +1,21 @@
-package hu.bbara.purefin.data
+package hu.bbara.purefin.core.data
import androidx.datastore.core.DataStore
-import hu.bbara.purefin.client.JellyfinApiClient
-import hu.bbara.purefin.data.cache.CachedMediaItem
-import hu.bbara.purefin.data.cache.HomeCache
-import hu.bbara.purefin.data.local.room.OfflineDatabase
-import hu.bbara.purefin.data.local.room.OfflineRoomMediaLocalDataSource
-import hu.bbara.purefin.data.local.room.RoomMediaLocalDataSource
-import hu.bbara.purefin.data.model.Episode
-import hu.bbara.purefin.data.model.Library
-import hu.bbara.purefin.data.model.Media
-import hu.bbara.purefin.data.model.Movie
-import hu.bbara.purefin.data.model.Season
-import hu.bbara.purefin.data.model.Series
-import hu.bbara.purefin.image.JellyfinImageHelper
-import hu.bbara.purefin.session.UserSessionRepository
+import hu.bbara.purefin.core.data.cache.CachedMediaItem
+import hu.bbara.purefin.core.data.cache.HomeCache
+import hu.bbara.purefin.core.data.client.JellyfinApiClient
+import hu.bbara.purefin.core.data.image.JellyfinImageHelper
+import hu.bbara.purefin.core.data.local.room.OfflineDatabase
+import hu.bbara.purefin.core.data.local.room.OfflineRoomMediaLocalDataSource
+import hu.bbara.purefin.core.data.local.room.RoomMediaLocalDataSource
+import hu.bbara.purefin.core.data.session.UserSessionRepository
+import hu.bbara.purefin.core.model.Episode
+import hu.bbara.purefin.core.model.Library
+import hu.bbara.purefin.core.model.Media
+import hu.bbara.purefin.core.model.MediaRepositoryState
+import hu.bbara.purefin.core.model.Movie
+import hu.bbara.purefin.core.model.Season
+import hu.bbara.purefin.core.model.Series
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
diff --git a/app/src/main/java/hu/bbara/purefin/data/MediaRepository.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/MediaRepository.kt
similarity index 70%
rename from app/src/main/java/hu/bbara/purefin/data/MediaRepository.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/MediaRepository.kt
index 489820d..bbae58c 100644
--- a/app/src/main/java/hu/bbara/purefin/data/MediaRepository.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/MediaRepository.kt
@@ -1,10 +1,11 @@
-package hu.bbara.purefin.data
+package hu.bbara.purefin.core.data
-import hu.bbara.purefin.data.model.Episode
-import hu.bbara.purefin.data.model.Library
-import hu.bbara.purefin.data.model.Media
-import hu.bbara.purefin.data.model.Movie
-import hu.bbara.purefin.data.model.Series
+import hu.bbara.purefin.core.model.Episode
+import hu.bbara.purefin.core.model.Library
+import hu.bbara.purefin.core.model.Media
+import hu.bbara.purefin.core.model.MediaRepositoryState
+import hu.bbara.purefin.core.model.Movie
+import hu.bbara.purefin.core.model.Series
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import java.util.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/data/MediaRepositoryModule.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/MediaRepositoryModule.kt
similarity index 79%
rename from app/src/main/java/hu/bbara/purefin/data/MediaRepositoryModule.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/MediaRepositoryModule.kt
index dc1c5f9..e80cb06 100644
--- a/app/src/main/java/hu/bbara/purefin/data/MediaRepositoryModule.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/MediaRepositoryModule.kt
@@ -1,11 +1,11 @@
-package hu.bbara.purefin.data
+package hu.bbara.purefin.core.data
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
-import hu.bbara.purefin.data.local.room.OnlineRepository
-import hu.bbara.purefin.data.local.room.OfflineRepository
+import hu.bbara.purefin.core.data.local.room.OfflineRepository
+import hu.bbara.purefin.core.data.local.room.OnlineRepository
@Module
@InstallIn(SingletonComponent::class)
diff --git a/app/src/main/java/hu/bbara/purefin/data/OfflineMediaRepository.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/OfflineMediaRepository.kt
similarity index 86%
rename from app/src/main/java/hu/bbara/purefin/data/OfflineMediaRepository.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/OfflineMediaRepository.kt
index b6a8e61..1875f38 100644
--- a/app/src/main/java/hu/bbara/purefin/data/OfflineMediaRepository.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/OfflineMediaRepository.kt
@@ -1,12 +1,13 @@
-package hu.bbara.purefin.data
+package hu.bbara.purefin.core.data
-import hu.bbara.purefin.data.local.room.OfflineDatabase
-import hu.bbara.purefin.data.local.room.OfflineRoomMediaLocalDataSource
-import hu.bbara.purefin.data.model.Episode
-import hu.bbara.purefin.data.model.Library
-import hu.bbara.purefin.data.model.Media
-import hu.bbara.purefin.data.model.Movie
-import hu.bbara.purefin.data.model.Series
+import hu.bbara.purefin.core.data.local.room.OfflineDatabase
+import hu.bbara.purefin.core.data.local.room.OfflineRoomMediaLocalDataSource
+import hu.bbara.purefin.core.model.Episode
+import hu.bbara.purefin.core.model.Library
+import hu.bbara.purefin.core.model.Media
+import hu.bbara.purefin.core.model.MediaRepositoryState
+import hu.bbara.purefin.core.model.Movie
+import hu.bbara.purefin.core.model.Series
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
diff --git a/app/src/main/java/hu/bbara/purefin/data/cache/HomeCache.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/cache/HomeCache.kt
similarity index 90%
rename from app/src/main/java/hu/bbara/purefin/data/cache/HomeCache.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/cache/HomeCache.kt
index dc08861..2c01de2 100644
--- a/app/src/main/java/hu/bbara/purefin/data/cache/HomeCache.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/cache/HomeCache.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.cache
+package hu.bbara.purefin.core.data.cache
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/hu/bbara/purefin/data/cache/HomeCacheModule.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/cache/HomeCacheModule.kt
similarity index 95%
rename from app/src/main/java/hu/bbara/purefin/data/cache/HomeCacheModule.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/cache/HomeCacheModule.kt
index 740546c..8aaaa82 100644
--- a/app/src/main/java/hu/bbara/purefin/data/cache/HomeCacheModule.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/cache/HomeCacheModule.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.cache
+package hu.bbara.purefin.core.data.cache
import android.content.Context
import androidx.datastore.core.DataStore
diff --git a/app/src/main/java/hu/bbara/purefin/data/cache/HomeCacheSerializer.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/cache/HomeCacheSerializer.kt
similarity index 95%
rename from app/src/main/java/hu/bbara/purefin/data/cache/HomeCacheSerializer.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/cache/HomeCacheSerializer.kt
index ecdbc7d..a27d962 100644
--- a/app/src/main/java/hu/bbara/purefin/data/cache/HomeCacheSerializer.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/cache/HomeCacheSerializer.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.cache
+package hu.bbara.purefin.core.data.cache
import androidx.datastore.core.CorruptionException
import androidx.datastore.core.Serializer
diff --git a/app/src/main/java/hu/bbara/purefin/client/AndroidDeviceProfile.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/client/AndroidDeviceProfile.kt
similarity index 99%
rename from app/src/main/java/hu/bbara/purefin/client/AndroidDeviceProfile.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/client/AndroidDeviceProfile.kt
index 28d432f..bfd37cb 100644
--- a/app/src/main/java/hu/bbara/purefin/client/AndroidDeviceProfile.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/client/AndroidDeviceProfile.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.client
+package hu.bbara.purefin.core.data.client
import android.media.MediaCodecList
import android.util.Log
diff --git a/app/src/main/java/hu/bbara/purefin/client/CodecDebugHelper.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/client/CodecDebugHelper.kt
similarity index 96%
rename from app/src/main/java/hu/bbara/purefin/client/CodecDebugHelper.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/client/CodecDebugHelper.kt
index f81adfa..b12e9b3 100644
--- a/app/src/main/java/hu/bbara/purefin/client/CodecDebugHelper.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/client/CodecDebugHelper.kt
@@ -1,6 +1,5 @@
-package hu.bbara.purefin.client
+package hu.bbara.purefin.core.data.client
-import android.media.MediaCodecInfo
import android.media.MediaCodecList
import android.util.Log
diff --git a/app/src/main/java/hu/bbara/purefin/client/JellyfinApiClient.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/client/JellyfinApiClient.kt
similarity index 99%
rename from app/src/main/java/hu/bbara/purefin/client/JellyfinApiClient.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/client/JellyfinApiClient.kt
index c27c5f9..63ccb80 100644
--- a/app/src/main/java/hu/bbara/purefin/client/JellyfinApiClient.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/client/JellyfinApiClient.kt
@@ -1,9 +1,9 @@
-package hu.bbara.purefin.client
+package hu.bbara.purefin.core.data.client
import android.content.Context
import android.util.Log
import dagger.hilt.android.qualifiers.ApplicationContext
-import hu.bbara.purefin.session.UserSessionRepository
+import hu.bbara.purefin.core.data.session.UserSessionRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext
diff --git a/app/src/main/java/hu/bbara/purefin/client/JellyfinAuthInterceptor.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/client/JellyfinAuthInterceptor.kt
similarity index 89%
rename from app/src/main/java/hu/bbara/purefin/client/JellyfinAuthInterceptor.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/client/JellyfinAuthInterceptor.kt
index dd670c4..067b883 100644
--- a/app/src/main/java/hu/bbara/purefin/client/JellyfinAuthInterceptor.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/client/JellyfinAuthInterceptor.kt
@@ -1,6 +1,6 @@
-package hu.bbara.purefin.client
+package hu.bbara.purefin.core.data.client
-import hu.bbara.purefin.session.UserSessionRepository
+import hu.bbara.purefin.core.data.session.UserSessionRepository
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
diff --git a/app/src/main/java/hu/bbara/purefin/domain/usecase/RefreshHomeDataUseCase.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/domain/usecase/RefreshHomeDataUseCase.kt
similarity index 67%
rename from app/src/main/java/hu/bbara/purefin/domain/usecase/RefreshHomeDataUseCase.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/domain/usecase/RefreshHomeDataUseCase.kt
index f85ebb1..b9e78bd 100644
--- a/app/src/main/java/hu/bbara/purefin/domain/usecase/RefreshHomeDataUseCase.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/domain/usecase/RefreshHomeDataUseCase.kt
@@ -1,6 +1,6 @@
-package hu.bbara.purefin.domain.usecase
+package hu.bbara.purefin.core.data.domain.usecase
-import hu.bbara.purefin.data.MediaRepository
+import hu.bbara.purefin.core.data.MediaRepository
import javax.inject.Inject
class RefreshHomeDataUseCase @Inject constructor(
diff --git a/app/src/main/java/hu/bbara/purefin/domain/usecase/UpdateWatchProgressUseCase.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/domain/usecase/UpdateWatchProgressUseCase.kt
similarity index 76%
rename from app/src/main/java/hu/bbara/purefin/domain/usecase/UpdateWatchProgressUseCase.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/domain/usecase/UpdateWatchProgressUseCase.kt
index 56397b0..a079064 100644
--- a/app/src/main/java/hu/bbara/purefin/domain/usecase/UpdateWatchProgressUseCase.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/domain/usecase/UpdateWatchProgressUseCase.kt
@@ -1,6 +1,6 @@
-package hu.bbara.purefin.domain.usecase
+package hu.bbara.purefin.core.data.domain.usecase
-import hu.bbara.purefin.data.MediaRepository
+import hu.bbara.purefin.core.data.MediaRepository
import java.util.UUID
import javax.inject.Inject
diff --git a/app/src/main/java/hu/bbara/purefin/image/ImageModule.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/image/ImageModule.kt
similarity index 81%
rename from app/src/main/java/hu/bbara/purefin/image/ImageModule.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/image/ImageModule.kt
index 40863b3..9b132cb 100644
--- a/app/src/main/java/hu/bbara/purefin/image/ImageModule.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/image/ImageModule.kt
@@ -1,10 +1,10 @@
-package hu.bbara.purefin.image
+package hu.bbara.purefin.core.data.image
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
-import hu.bbara.purefin.client.JellyfinAuthInterceptor
+import hu.bbara.purefin.core.data.client.JellyfinAuthInterceptor
import okhttp3.OkHttpClient
import javax.inject.Singleton
diff --git a/app/src/main/java/hu/bbara/purefin/image/JellyfinImageHelper.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/image/JellyfinImageHelper.kt
similarity index 92%
rename from app/src/main/java/hu/bbara/purefin/image/JellyfinImageHelper.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/image/JellyfinImageHelper.kt
index 0ccb8cd..fea52e1 100644
--- a/app/src/main/java/hu/bbara/purefin/image/JellyfinImageHelper.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/image/JellyfinImageHelper.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.image
+package hu.bbara.purefin.core.data.image
import org.jellyfin.sdk.model.UUID
import org.jellyfin.sdk.model.api.ImageType
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/CastMemberEntity.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/CastMemberEntity.kt
similarity index 91%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/CastMemberEntity.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/CastMemberEntity.kt
index 7463def..9c33f32 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/CastMemberEntity.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/CastMemberEntity.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.Entity
import androidx.room.Index
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/DatabaseQualifiers.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/DatabaseQualifiers.kt
similarity index 95%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/DatabaseQualifiers.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/DatabaseQualifiers.kt
index 00ce1c4..99e7508 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/DatabaseQualifiers.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/DatabaseQualifiers.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import javax.inject.Qualifier
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/EpisodeEntity.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/EpisodeEntity.kt
similarity index 94%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/EpisodeEntity.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/EpisodeEntity.kt
index 36596ab..617fa09 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/EpisodeEntity.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/EpisodeEntity.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.Entity
import androidx.room.ForeignKey
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/LibraryEntity.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/LibraryEntity.kt
similarity index 82%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/LibraryEntity.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/LibraryEntity.kt
index 4216f69..056923c 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/LibraryEntity.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/LibraryEntity.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.Entity
import androidx.room.PrimaryKey
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/MediaDatabase.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/MediaDatabase.kt
similarity index 63%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/MediaDatabase.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/MediaDatabase.kt
index 131b558..4fa7b2b 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/MediaDatabase.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/MediaDatabase.kt
@@ -1,14 +1,15 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
-import hu.bbara.purefin.data.local.room.dao.CastMemberDao
-import hu.bbara.purefin.data.local.room.dao.EpisodeDao
-import hu.bbara.purefin.data.local.room.dao.MovieDao
-import hu.bbara.purefin.data.local.room.dao.SeasonDao
-import hu.bbara.purefin.data.local.room.dao.SeriesDao
-import hu.bbara.purefin.data.local.room.dao.LibraryDao
+import hu.bbara.purefin.core.data.local.room.dao.CastMemberDao
+import hu.bbara.purefin.core.data.local.room.dao.EpisodeDao
+import hu.bbara.purefin.core.data.local.room.dao.LibraryDao
+import hu.bbara.purefin.core.data.local.room.dao.MovieDao
+import hu.bbara.purefin.core.data.local.room.dao.SeasonDao
+import hu.bbara.purefin.core.data.local.room.dao.SeriesDao
+
@Database(
entities = [
MovieEntity::class,
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/MediaDatabaseModule.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/MediaDatabaseModule.kt
similarity index 90%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/MediaDatabaseModule.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/MediaDatabaseModule.kt
index c3565a5..f0103d6 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/MediaDatabaseModule.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/MediaDatabaseModule.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import android.content.Context
import androidx.room.Room
@@ -7,12 +7,12 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
-import hu.bbara.purefin.data.local.room.dao.CastMemberDao
-import hu.bbara.purefin.data.local.room.dao.EpisodeDao
-import hu.bbara.purefin.data.local.room.dao.LibraryDao
-import hu.bbara.purefin.data.local.room.dao.MovieDao
-import hu.bbara.purefin.data.local.room.dao.SeasonDao
-import hu.bbara.purefin.data.local.room.dao.SeriesDao
+import hu.bbara.purefin.core.data.local.room.dao.CastMemberDao
+import hu.bbara.purefin.core.data.local.room.dao.EpisodeDao
+import hu.bbara.purefin.core.data.local.room.dao.LibraryDao
+import hu.bbara.purefin.core.data.local.room.dao.MovieDao
+import hu.bbara.purefin.core.data.local.room.dao.SeasonDao
+import hu.bbara.purefin.core.data.local.room.dao.SeriesDao
import javax.inject.Singleton
@Module
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/MovieEntity.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/MovieEntity.kt
similarity index 94%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/MovieEntity.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/MovieEntity.kt
index 0cd005d..c1236bb 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/MovieEntity.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/MovieEntity.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.Entity
import androidx.room.ForeignKey
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/OfflineMediaDatabase.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/OfflineMediaDatabase.kt
similarity index 63%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/OfflineMediaDatabase.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/OfflineMediaDatabase.kt
index c6c8e8e..6d61bde 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/OfflineMediaDatabase.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/OfflineMediaDatabase.kt
@@ -1,14 +1,14 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
-import hu.bbara.purefin.data.local.room.dao.CastMemberDao
-import hu.bbara.purefin.data.local.room.dao.EpisodeDao
-import hu.bbara.purefin.data.local.room.dao.MovieDao
-import hu.bbara.purefin.data.local.room.dao.SeasonDao
-import hu.bbara.purefin.data.local.room.dao.SeriesDao
-import hu.bbara.purefin.data.local.room.dao.LibraryDao
+import hu.bbara.purefin.core.data.local.room.dao.CastMemberDao
+import hu.bbara.purefin.core.data.local.room.dao.EpisodeDao
+import hu.bbara.purefin.core.data.local.room.dao.LibraryDao
+import hu.bbara.purefin.core.data.local.room.dao.MovieDao
+import hu.bbara.purefin.core.data.local.room.dao.SeasonDao
+import hu.bbara.purefin.core.data.local.room.dao.SeriesDao
@Database(
entities = [
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/OfflineRoomMediaLocalDataSource.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/OfflineRoomMediaLocalDataSource.kt
similarity index 94%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/OfflineRoomMediaLocalDataSource.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/OfflineRoomMediaLocalDataSource.kt
index bfc80e9..4a9bb75 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/OfflineRoomMediaLocalDataSource.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/OfflineRoomMediaLocalDataSource.kt
@@ -1,23 +1,22 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.withTransaction
-import hu.bbara.purefin.data.local.room.dao.CastMemberDao
-import hu.bbara.purefin.data.local.room.dao.EpisodeDao
-import hu.bbara.purefin.data.local.room.dao.LibraryDao
-import hu.bbara.purefin.data.local.room.dao.MovieDao
-import hu.bbara.purefin.data.local.room.dao.SeasonDao
-import hu.bbara.purefin.data.local.room.dao.SeriesDao
-import hu.bbara.purefin.data.model.CastMember
-import hu.bbara.purefin.data.model.Episode
-import hu.bbara.purefin.data.model.Library
-import hu.bbara.purefin.data.model.Movie
-import hu.bbara.purefin.data.model.Season
-import hu.bbara.purefin.data.model.Series
+import hu.bbara.purefin.core.data.local.room.dao.CastMemberDao
+import hu.bbara.purefin.core.data.local.room.dao.EpisodeDao
+import hu.bbara.purefin.core.data.local.room.dao.LibraryDao
+import hu.bbara.purefin.core.data.local.room.dao.MovieDao
+import hu.bbara.purefin.core.data.local.room.dao.SeasonDao
+import hu.bbara.purefin.core.data.local.room.dao.SeriesDao
+import hu.bbara.purefin.core.model.CastMember
+import hu.bbara.purefin.core.model.Episode
+import hu.bbara.purefin.core.model.Library
+import hu.bbara.purefin.core.model.Movie
+import hu.bbara.purefin.core.model.Season
+import hu.bbara.purefin.core.model.Series
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import org.jellyfin.sdk.model.api.CollectionType
import java.util.UUID
-import javax.inject.Inject
import javax.inject.Singleton
@Singleton
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/RoomMediaLocalDataSource.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/RoomMediaLocalDataSource.kt
similarity index 94%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/RoomMediaLocalDataSource.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/RoomMediaLocalDataSource.kt
index 976ddd1..3d91762 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/RoomMediaLocalDataSource.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/RoomMediaLocalDataSource.kt
@@ -1,24 +1,23 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.withTransaction
-import hu.bbara.purefin.data.local.room.dao.CastMemberDao
-import hu.bbara.purefin.data.local.room.dao.EpisodeDao
-import hu.bbara.purefin.data.local.room.dao.LibraryDao
-import hu.bbara.purefin.data.local.room.dao.MovieDao
-import hu.bbara.purefin.data.local.room.dao.SeasonDao
-import hu.bbara.purefin.data.local.room.dao.SeriesDao
-import hu.bbara.purefin.data.model.CastMember
-import hu.bbara.purefin.data.model.Episode
-import hu.bbara.purefin.data.model.Library
-import hu.bbara.purefin.data.model.Movie
-import hu.bbara.purefin.data.model.Season
-import hu.bbara.purefin.data.model.Series
+import hu.bbara.purefin.core.data.local.room.dao.CastMemberDao
+import hu.bbara.purefin.core.data.local.room.dao.EpisodeDao
+import hu.bbara.purefin.core.data.local.room.dao.LibraryDao
+import hu.bbara.purefin.core.data.local.room.dao.MovieDao
+import hu.bbara.purefin.core.data.local.room.dao.SeasonDao
+import hu.bbara.purefin.core.data.local.room.dao.SeriesDao
+import hu.bbara.purefin.core.model.CastMember
+import hu.bbara.purefin.core.model.Episode
+import hu.bbara.purefin.core.model.Library
+import hu.bbara.purefin.core.model.Movie
+import hu.bbara.purefin.core.model.Season
+import hu.bbara.purefin.core.model.Series
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import org.jellyfin.sdk.model.api.CollectionType
import java.util.UUID
import javax.inject.Singleton
-import kotlin.collections.map
@Singleton
class RoomMediaLocalDataSource(
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/RoomRelations.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/RoomRelations.kt
similarity index 94%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/RoomRelations.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/RoomRelations.kt
index 2cd99df..6178021 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/RoomRelations.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/RoomRelations.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.Embedded
import androidx.room.Relation
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/SeasonEntity.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/SeasonEntity.kt
similarity index 93%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/SeasonEntity.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/SeasonEntity.kt
index 8601ef06..2cc38fe 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/SeasonEntity.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/SeasonEntity.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.Entity
import androidx.room.ForeignKey
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/SeriesEntity.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/SeriesEntity.kt
similarity index 93%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/SeriesEntity.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/SeriesEntity.kt
index fe28673..f5ff477 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/SeriesEntity.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/SeriesEntity.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.Entity
import androidx.room.ForeignKey
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/UuidConverters.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/UuidConverters.kt
similarity index 87%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/UuidConverters.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/UuidConverters.kt
index aed88e5..d1f8cdb 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/UuidConverters.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/UuidConverters.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.local.room
+package hu.bbara.purefin.core.data.local.room
import androidx.room.TypeConverter
import java.util.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/CastMemberDao.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/CastMemberDao.kt
similarity index 89%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/dao/CastMemberDao.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/CastMemberDao.kt
index 71bdd96..ef496b6 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/CastMemberDao.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/CastMemberDao.kt
@@ -1,9 +1,9 @@
-package hu.bbara.purefin.data.local.room.dao
+package hu.bbara.purefin.core.data.local.room.dao
import androidx.room.Dao
import androidx.room.Query
import androidx.room.Upsert
-import hu.bbara.purefin.data.local.room.CastMemberEntity
+import hu.bbara.purefin.core.data.local.room.CastMemberEntity
import java.util.UUID
@Dao
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/EpisodeDao.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/EpisodeDao.kt
similarity index 92%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/dao/EpisodeDao.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/EpisodeDao.kt
index cfdd003..30fff42 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/EpisodeDao.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/EpisodeDao.kt
@@ -1,9 +1,9 @@
-package hu.bbara.purefin.data.local.room.dao
+package hu.bbara.purefin.core.data.local.room.dao
import androidx.room.Dao
import androidx.room.Query
import androidx.room.Upsert
-import hu.bbara.purefin.data.local.room.EpisodeEntity
+import hu.bbara.purefin.core.data.local.room.EpisodeEntity
import kotlinx.coroutines.flow.Flow
import java.util.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/LibraryDao.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/LibraryDao.kt
similarity index 77%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/dao/LibraryDao.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/LibraryDao.kt
index 0ca53d1..6293622 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/LibraryDao.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/LibraryDao.kt
@@ -1,10 +1,10 @@
-package hu.bbara.purefin.data.local.room.dao
+package hu.bbara.purefin.core.data.local.room.dao
import androidx.room.Dao
import androidx.room.Query
import androidx.room.Upsert
-import hu.bbara.purefin.data.local.room.LibraryEntity
-import hu.bbara.purefin.data.local.room.LibraryWithContent
+import hu.bbara.purefin.core.data.local.room.LibraryEntity
+import hu.bbara.purefin.core.data.local.room.LibraryWithContent
import kotlinx.coroutines.flow.Flow
@Dao
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/MovieDao.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/MovieDao.kt
similarity index 88%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/dao/MovieDao.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/MovieDao.kt
index ee07a4b..17da509 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/MovieDao.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/MovieDao.kt
@@ -1,9 +1,9 @@
-package hu.bbara.purefin.data.local.room.dao
+package hu.bbara.purefin.core.data.local.room.dao
import androidx.room.Dao
import androidx.room.Query
import androidx.room.Upsert
-import hu.bbara.purefin.data.local.room.MovieEntity
+import hu.bbara.purefin.core.data.local.room.MovieEntity
import kotlinx.coroutines.flow.Flow
import java.util.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/SeasonDao.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/SeasonDao.kt
similarity index 87%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/dao/SeasonDao.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/SeasonDao.kt
index 6eb6118..24129f2 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/SeasonDao.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/SeasonDao.kt
@@ -1,9 +1,9 @@
-package hu.bbara.purefin.data.local.room.dao
+package hu.bbara.purefin.core.data.local.room.dao
import androidx.room.Dao
import androidx.room.Query
import androidx.room.Upsert
-import hu.bbara.purefin.data.local.room.SeasonEntity
+import hu.bbara.purefin.core.data.local.room.SeasonEntity
import java.util.UUID
@Dao
diff --git a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/SeriesDao.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/SeriesDao.kt
similarity index 83%
rename from app/src/main/java/hu/bbara/purefin/data/local/room/dao/SeriesDao.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/SeriesDao.kt
index 25f9102..396dc9e 100644
--- a/app/src/main/java/hu/bbara/purefin/data/local/room/dao/SeriesDao.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/local/room/dao/SeriesDao.kt
@@ -1,11 +1,11 @@
-package hu.bbara.purefin.data.local.room.dao
+package hu.bbara.purefin.core.data.local.room.dao
import androidx.room.Dao
import androidx.room.Query
import androidx.room.Transaction
import androidx.room.Upsert
-import hu.bbara.purefin.data.local.room.SeriesEntity
-import hu.bbara.purefin.data.local.room.SeriesWithSeasonsAndEpisodes
+import hu.bbara.purefin.core.data.local.room.SeriesEntity
+import hu.bbara.purefin.core.data.local.room.SeriesWithSeasonsAndEpisodes
import kotlinx.coroutines.flow.Flow
import java.util.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/navigation/EpisodeDto.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/EpisodeDto.kt
similarity index 88%
rename from app/src/main/java/hu/bbara/purefin/navigation/EpisodeDto.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/navigation/EpisodeDto.kt
index 720fa84..6991a98 100644
--- a/app/src/main/java/hu/bbara/purefin/navigation/EpisodeDto.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/EpisodeDto.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.navigation
+package hu.bbara.purefin.core.data.navigation
import kotlinx.serialization.Serializable
import org.jellyfin.sdk.model.serializer.UUIDSerializer
diff --git a/app/src/main/java/hu/bbara/purefin/navigation/LibraryDto.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/LibraryDto.kt
similarity index 85%
rename from app/src/main/java/hu/bbara/purefin/navigation/LibraryDto.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/navigation/LibraryDto.kt
index f4f220d..9d33944 100644
--- a/app/src/main/java/hu/bbara/purefin/navigation/LibraryDto.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/LibraryDto.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.navigation
+package hu.bbara.purefin.core.data.navigation
import kotlinx.serialization.Serializable
import org.jellyfin.sdk.model.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/navigation/MovieDto.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/MovieDto.kt
similarity index 82%
rename from app/src/main/java/hu/bbara/purefin/navigation/MovieDto.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/navigation/MovieDto.kt
index 58c782f..9631879 100644
--- a/app/src/main/java/hu/bbara/purefin/navigation/MovieDto.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/MovieDto.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.navigation
+package hu.bbara.purefin.core.data.navigation
import kotlinx.serialization.Serializable
import org.jellyfin.sdk.model.serializer.UUIDSerializer
diff --git a/app/src/main/java/hu/bbara/purefin/navigation/NavigationManager.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/NavigationManager.kt
similarity index 96%
rename from app/src/main/java/hu/bbara/purefin/navigation/NavigationManager.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/navigation/NavigationManager.kt
index c535f18..7d9b4a9 100644
--- a/app/src/main/java/hu/bbara/purefin/navigation/NavigationManager.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/NavigationManager.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.navigation
+package hu.bbara.purefin.core.data.navigation
import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.staticCompositionLocalOf
diff --git a/app/src/main/java/hu/bbara/purefin/navigation/NavigationManagerModule.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/NavigationManagerModule.kt
similarity index 88%
rename from app/src/main/java/hu/bbara/purefin/navigation/NavigationManagerModule.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/navigation/NavigationManagerModule.kt
index e5c87b0..e143a89 100644
--- a/app/src/main/java/hu/bbara/purefin/navigation/NavigationManagerModule.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/NavigationManagerModule.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.navigation
+package hu.bbara.purefin.core.data.navigation
import dagger.Module
import dagger.Provides
diff --git a/app/src/main/java/hu/bbara/purefin/navigation/Route.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/Route.kt
similarity index 92%
rename from app/src/main/java/hu/bbara/purefin/navigation/Route.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/navigation/Route.kt
index 2403582..f5bf938 100644
--- a/app/src/main/java/hu/bbara/purefin/navigation/Route.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/Route.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.navigation
+package hu.bbara.purefin.core.data.navigation
import androidx.navigation3.runtime.NavKey
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/hu/bbara/purefin/navigation/SeriesDto.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/SeriesDto.kt
similarity index 83%
rename from app/src/main/java/hu/bbara/purefin/navigation/SeriesDto.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/navigation/SeriesDto.kt
index a750f67..9a5fa50 100644
--- a/app/src/main/java/hu/bbara/purefin/navigation/SeriesDto.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/navigation/SeriesDto.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.navigation
+package hu.bbara.purefin.core.data.navigation
import kotlinx.serialization.Serializable
import org.jellyfin.sdk.model.serializer.UUIDSerializer
diff --git a/app/src/main/java/hu/bbara/purefin/session/UserSession.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSession.kt
similarity index 89%
rename from app/src/main/java/hu/bbara/purefin/session/UserSession.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSession.kt
index 3622a00..6dcf94f 100644
--- a/app/src/main/java/hu/bbara/purefin/session/UserSession.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSession.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.session
+package hu.bbara.purefin.core.data.session
import kotlinx.serialization.Serializable
import org.jellyfin.sdk.model.serializer.UUIDSerializer
diff --git a/app/src/main/java/hu/bbara/purefin/session/UserSessionModule.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSessionModule.kt
similarity index 96%
rename from app/src/main/java/hu/bbara/purefin/session/UserSessionModule.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSessionModule.kt
index 6e13047..867e826 100644
--- a/app/src/main/java/hu/bbara/purefin/session/UserSessionModule.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSessionModule.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.session
+package hu.bbara.purefin.core.data.session
import android.content.Context
import androidx.datastore.core.DataStore
diff --git a/app/src/main/java/hu/bbara/purefin/session/UserSessionRepository.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSessionRepository.kt
similarity index 97%
rename from app/src/main/java/hu/bbara/purefin/session/UserSessionRepository.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSessionRepository.kt
index de57eff..21b4219 100644
--- a/app/src/main/java/hu/bbara/purefin/session/UserSessionRepository.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSessionRepository.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.session
+package hu.bbara.purefin.core.data.session
import androidx.datastore.core.DataStore
import kotlinx.coroutines.flow.Flow
diff --git a/app/src/main/java/hu/bbara/purefin/session/UserSessionSerializer.kt b/core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSessionSerializer.kt
similarity index 95%
rename from app/src/main/java/hu/bbara/purefin/session/UserSessionSerializer.kt
rename to core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSessionSerializer.kt
index 35ac4fa..f3f173e 100644
--- a/app/src/main/java/hu/bbara/purefin/session/UserSessionSerializer.kt
+++ b/core/data/src/main/java/hu/bbara/purefin/core/data/session/UserSessionSerializer.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.session
+package hu.bbara.purefin.core.data.session
import androidx.datastore.core.CorruptionException
import androidx.datastore.core.Serializer
diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts
new file mode 100644
index 0000000..f0d118d
--- /dev/null
+++ b/core/model/build.gradle.kts
@@ -0,0 +1,30 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
+plugins {
+ alias(libs.plugins.android.library)
+ alias(libs.plugins.kotlin.android)
+}
+
+android {
+ namespace = "hu.bbara.purefin.core.model"
+ compileSdk = 36
+
+ defaultConfig {
+ minSdk = 29
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+}
+
+kotlin {
+ compilerOptions {
+ jvmTarget.set(JvmTarget.JVM_11)
+ }
+}
+
+dependencies {
+ implementation(libs.jellyfin.core)
+}
diff --git a/app/src/main/java/hu/bbara/purefin/data/model/CastMember.kt b/core/model/src/main/java/hu/bbara/purefin/core/model/CastMember.kt
similarity index 71%
rename from app/src/main/java/hu/bbara/purefin/data/model/CastMember.kt
rename to core/model/src/main/java/hu/bbara/purefin/core/model/CastMember.kt
index e25ace4..92c12b8 100644
--- a/app/src/main/java/hu/bbara/purefin/data/model/CastMember.kt
+++ b/core/model/src/main/java/hu/bbara/purefin/core/model/CastMember.kt
@@ -1,7 +1,7 @@
-package hu.bbara.purefin.data.model
+package hu.bbara.purefin.core.model
data class CastMember(
val name: String,
val role: String,
val imageUrl: String?
-)
\ No newline at end of file
+)
diff --git a/app/src/main/java/hu/bbara/purefin/data/model/Episode.kt b/core/model/src/main/java/hu/bbara/purefin/core/model/Episode.kt
similarity index 91%
rename from app/src/main/java/hu/bbara/purefin/data/model/Episode.kt
rename to core/model/src/main/java/hu/bbara/purefin/core/model/Episode.kt
index ecc84ac..5cb1691 100644
--- a/app/src/main/java/hu/bbara/purefin/data/model/Episode.kt
+++ b/core/model/src/main/java/hu/bbara/purefin/core/model/Episode.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.model
+package hu.bbara.purefin.core.model
import java.util.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/data/model/Library.kt b/core/model/src/main/java/hu/bbara/purefin/core/model/Library.kt
similarity index 94%
rename from app/src/main/java/hu/bbara/purefin/data/model/Library.kt
rename to core/model/src/main/java/hu/bbara/purefin/core/model/Library.kt
index 399a359..1c36060 100644
--- a/app/src/main/java/hu/bbara/purefin/data/model/Library.kt
+++ b/core/model/src/main/java/hu/bbara/purefin/core/model/Library.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.model
+package hu.bbara.purefin.core.model
import org.jellyfin.sdk.model.api.CollectionType
import java.util.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/data/model/Media.kt b/core/model/src/main/java/hu/bbara/purefin/core/model/Media.kt
similarity index 93%
rename from app/src/main/java/hu/bbara/purefin/data/model/Media.kt
rename to core/model/src/main/java/hu/bbara/purefin/core/model/Media.kt
index 20c19aa..adc42c5 100644
--- a/app/src/main/java/hu/bbara/purefin/data/model/Media.kt
+++ b/core/model/src/main/java/hu/bbara/purefin/core/model/Media.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.model
+package hu.bbara.purefin.core.model
import org.jellyfin.sdk.model.api.BaseItemKind
import java.util.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/data/MediaRepositoryState.kt b/core/model/src/main/java/hu/bbara/purefin/core/model/MediaRepositoryState.kt
similarity index 85%
rename from app/src/main/java/hu/bbara/purefin/data/MediaRepositoryState.kt
rename to core/model/src/main/java/hu/bbara/purefin/core/model/MediaRepositoryState.kt
index db6132d..63ec393 100644
--- a/app/src/main/java/hu/bbara/purefin/data/MediaRepositoryState.kt
+++ b/core/model/src/main/java/hu/bbara/purefin/core/model/MediaRepositoryState.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data
+package hu.bbara.purefin.core.model
sealed interface MediaRepositoryState {
data object Loading : MediaRepositoryState
diff --git a/app/src/main/java/hu/bbara/purefin/data/model/Movie.kt b/core/model/src/main/java/hu/bbara/purefin/core/model/Movie.kt
similarity index 91%
rename from app/src/main/java/hu/bbara/purefin/data/model/Movie.kt
rename to core/model/src/main/java/hu/bbara/purefin/core/model/Movie.kt
index e62cd6c..74eb21a 100644
--- a/app/src/main/java/hu/bbara/purefin/data/model/Movie.kt
+++ b/core/model/src/main/java/hu/bbara/purefin/core/model/Movie.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.model
+package hu.bbara.purefin.core.model
import java.util.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/data/model/Season.kt b/core/model/src/main/java/hu/bbara/purefin/core/model/Season.kt
similarity index 84%
rename from app/src/main/java/hu/bbara/purefin/data/model/Season.kt
rename to core/model/src/main/java/hu/bbara/purefin/core/model/Season.kt
index 85f9b44..b01a43f 100644
--- a/app/src/main/java/hu/bbara/purefin/data/model/Season.kt
+++ b/core/model/src/main/java/hu/bbara/purefin/core/model/Season.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.model
+package hu.bbara.purefin.core.model
import java.util.UUID
@@ -10,5 +10,4 @@ data class Season(
val unwatchedEpisodeCount: Int,
val episodeCount: Int,
val episodes: List
-) {
-}
+)
diff --git a/app/src/main/java/hu/bbara/purefin/data/model/Series.kt b/core/model/src/main/java/hu/bbara/purefin/core/model/Series.kt
similarity index 88%
rename from app/src/main/java/hu/bbara/purefin/data/model/Series.kt
rename to core/model/src/main/java/hu/bbara/purefin/core/model/Series.kt
index 2b6b3a9..4a0a9d3 100644
--- a/app/src/main/java/hu/bbara/purefin/data/model/Series.kt
+++ b/core/model/src/main/java/hu/bbara/purefin/core/model/Series.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.data.model
+package hu.bbara.purefin.core.model
import java.util.UUID
@@ -13,5 +13,4 @@ data class Series(
val seasonCount: Int,
val seasons: List,
val cast: List
-) {
-}
+)
diff --git a/core/player/build.gradle.kts b/core/player/build.gradle.kts
new file mode 100644
index 0000000..d176a9f
--- /dev/null
+++ b/core/player/build.gradle.kts
@@ -0,0 +1,42 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
+plugins {
+ alias(libs.plugins.android.library)
+ alias(libs.plugins.kotlin.android)
+ alias(libs.plugins.kotlin.serialization)
+ alias(libs.plugins.hilt)
+ alias(libs.plugins.ksp)
+}
+
+android {
+ namespace = "hu.bbara.purefin.core.player"
+ compileSdk = 36
+
+ defaultConfig {
+ minSdk = 29
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+}
+
+kotlin {
+ compilerOptions {
+ jvmTarget.set(JvmTarget.JVM_11)
+ }
+}
+
+dependencies {
+ implementation(project(":core:model"))
+ implementation(project(":core:data"))
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
+ implementation(libs.medi3.exoplayer)
+ implementation(libs.media3.datasource.okhttp)
+ implementation(libs.datastore)
+ implementation(libs.kotlinx.serialization.json)
+ implementation(libs.jellyfin.core)
+ implementation(libs.okhttp)
+}
diff --git a/app/src/main/java/hu/bbara/purefin/player/data/PlayerMediaRepository.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/data/PlayerMediaRepository.kt
similarity index 97%
rename from app/src/main/java/hu/bbara/purefin/player/data/PlayerMediaRepository.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/data/PlayerMediaRepository.kt
index ce76df0..d90ac58 100644
--- a/app/src/main/java/hu/bbara/purefin/player/data/PlayerMediaRepository.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/data/PlayerMediaRepository.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.player.data
+package hu.bbara.purefin.core.player.data
import android.util.Log
import androidx.annotation.OptIn
@@ -9,9 +9,9 @@ import androidx.media3.common.MediaMetadata
import androidx.media3.common.MimeTypes
import androidx.media3.common.util.UnstableApi
import dagger.hilt.android.scopes.ViewModelScoped
-import hu.bbara.purefin.client.JellyfinApiClient
-import hu.bbara.purefin.image.JellyfinImageHelper
-import hu.bbara.purefin.session.UserSessionRepository
+import hu.bbara.purefin.core.data.client.JellyfinApiClient
+import hu.bbara.purefin.core.data.image.JellyfinImageHelper
+import hu.bbara.purefin.core.data.session.UserSessionRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext
diff --git a/app/src/main/java/hu/bbara/purefin/player/manager/PlayerManager.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/manager/PlayerManager.kt
similarity index 96%
rename from app/src/main/java/hu/bbara/purefin/player/manager/PlayerManager.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/manager/PlayerManager.kt
index 73e0f4e..ba2e996 100644
--- a/app/src/main/java/hu/bbara/purefin/player/manager/PlayerManager.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/manager/PlayerManager.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.player.manager
+package hu.bbara.purefin.core.player.manager
import androidx.annotation.OptIn
import androidx.media3.common.C
@@ -9,14 +9,13 @@ import androidx.media3.common.TrackSelectionOverride
import androidx.media3.common.Tracks
import androidx.media3.common.util.UnstableApi
import dagger.hilt.android.scopes.ViewModelScoped
-import hu.bbara.purefin.player.model.QueueItemUi
-import hu.bbara.purefin.player.model.TrackOption
-import hu.bbara.purefin.player.model.TrackType
-import hu.bbara.purefin.player.preference.AudioTrackProperties
-import hu.bbara.purefin.player.preference.SubtitleTrackProperties
-import hu.bbara.purefin.player.preference.TrackMatcher
-import hu.bbara.purefin.player.preference.TrackPreferencesRepository
-import javax.inject.Inject
+import hu.bbara.purefin.core.player.model.QueueItemUi
+import hu.bbara.purefin.core.player.model.TrackOption
+import hu.bbara.purefin.core.player.model.TrackType
+import hu.bbara.purefin.core.player.preference.AudioTrackProperties
+import hu.bbara.purefin.core.player.preference.SubtitleTrackProperties
+import hu.bbara.purefin.core.player.preference.TrackMatcher
+import hu.bbara.purefin.core.player.preference.TrackPreferencesRepository
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
@@ -29,6 +28,7 @@ import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
+import javax.inject.Inject
/**
* Encapsulates the Media3 [Player] wiring and exposes reactive updates for the UI layer.
diff --git a/app/src/main/java/hu/bbara/purefin/player/manager/ProgressManager.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/manager/ProgressManager.kt
similarity index 96%
rename from app/src/main/java/hu/bbara/purefin/player/manager/ProgressManager.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/manager/ProgressManager.kt
index 5c2cb94..8597b1b 100644
--- a/app/src/main/java/hu/bbara/purefin/player/manager/ProgressManager.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/manager/ProgressManager.kt
@@ -1,9 +1,9 @@
-package hu.bbara.purefin.player.manager
+package hu.bbara.purefin.core.player.manager
import android.util.Log
import dagger.hilt.android.scopes.ViewModelScoped
-import hu.bbara.purefin.client.JellyfinApiClient
-import hu.bbara.purefin.domain.usecase.UpdateWatchProgressUseCase
+import hu.bbara.purefin.core.data.client.JellyfinApiClient
+import hu.bbara.purefin.core.data.domain.usecase.UpdateWatchProgressUseCase
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
diff --git a/app/src/main/java/hu/bbara/purefin/player/manager/TrackMapper.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/manager/TrackMapper.kt
similarity index 97%
rename from app/src/main/java/hu/bbara/purefin/player/manager/TrackMapper.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/manager/TrackMapper.kt
index 3941afc..6747807 100644
--- a/app/src/main/java/hu/bbara/purefin/player/manager/TrackMapper.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/manager/TrackMapper.kt
@@ -1,12 +1,12 @@
-package hu.bbara.purefin.player.manager
+package hu.bbara.purefin.core.player.manager
import androidx.annotation.OptIn
import androidx.media3.common.C
import androidx.media3.common.Format
import androidx.media3.common.Tracks
import androidx.media3.common.util.UnstableApi
-import hu.bbara.purefin.player.model.TrackOption
-import hu.bbara.purefin.player.model.TrackType
+import hu.bbara.purefin.core.player.model.TrackOption
+import hu.bbara.purefin.core.player.model.TrackType
import javax.inject.Inject
data class TrackSelectionState(
diff --git a/app/src/main/java/hu/bbara/purefin/player/model/PlayerUiModels.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/model/PlayerUiModels.kt
similarity index 97%
rename from app/src/main/java/hu/bbara/purefin/player/model/PlayerUiModels.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/model/PlayerUiModels.kt
index c96592d..a35868e 100644
--- a/app/src/main/java/hu/bbara/purefin/player/model/PlayerUiModels.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/model/PlayerUiModels.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.player.model
+package hu.bbara.purefin.core.player.model
data class PlayerUiState(
val isPlaying: Boolean = false,
diff --git a/app/src/main/java/hu/bbara/purefin/player/model/VideoItem.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/model/VideoItem.kt
similarity index 78%
rename from app/src/main/java/hu/bbara/purefin/player/model/VideoItem.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/model/VideoItem.kt
index e788408..4c45990 100644
--- a/app/src/main/java/hu/bbara/purefin/player/model/VideoItem.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/model/VideoItem.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.player.model
+package hu.bbara.purefin.core.player.model
import android.net.Uri
import androidx.media3.common.MediaItem
diff --git a/app/src/main/java/hu/bbara/purefin/player/module/VideoPlayerModule.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/module/VideoPlayerModule.kt
similarity index 98%
rename from app/src/main/java/hu/bbara/purefin/player/module/VideoPlayerModule.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/module/VideoPlayerModule.kt
index aa7b141..9386701 100644
--- a/app/src/main/java/hu/bbara/purefin/player/module/VideoPlayerModule.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/module/VideoPlayerModule.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.player.module
+package hu.bbara.purefin.core.player.module
import android.app.Application
import androidx.annotation.OptIn
diff --git a/app/src/main/java/hu/bbara/purefin/player/preference/TrackMatcher.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackMatcher.kt
similarity index 95%
rename from app/src/main/java/hu/bbara/purefin/player/preference/TrackMatcher.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackMatcher.kt
index 1def1b0..975730d 100644
--- a/app/src/main/java/hu/bbara/purefin/player/preference/TrackMatcher.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackMatcher.kt
@@ -1,7 +1,7 @@
-package hu.bbara.purefin.player.preference
+package hu.bbara.purefin.core.player.preference
-import hu.bbara.purefin.player.model.TrackOption
-import hu.bbara.purefin.player.model.TrackType
+import hu.bbara.purefin.core.player.model.TrackOption
+import hu.bbara.purefin.core.player.model.TrackType
import javax.inject.Inject
class TrackMatcher @Inject constructor() {
diff --git a/app/src/main/java/hu/bbara/purefin/player/preference/TrackPreference.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreference.kt
similarity index 93%
rename from app/src/main/java/hu/bbara/purefin/player/preference/TrackPreference.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreference.kt
index 2f1b5b4..df255e6 100644
--- a/app/src/main/java/hu/bbara/purefin/player/preference/TrackPreference.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreference.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.player.preference
+package hu.bbara.purefin.core.player.preference
import kotlinx.serialization.Serializable
diff --git a/app/src/main/java/hu/bbara/purefin/player/preference/TrackPreferencesModule.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreferencesModule.kt
similarity index 96%
rename from app/src/main/java/hu/bbara/purefin/player/preference/TrackPreferencesModule.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreferencesModule.kt
index 7f46b71..cce6e26 100644
--- a/app/src/main/java/hu/bbara/purefin/player/preference/TrackPreferencesModule.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreferencesModule.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.player.preference
+package hu.bbara.purefin.core.player.preference
import android.content.Context
import androidx.datastore.core.DataStore
diff --git a/app/src/main/java/hu/bbara/purefin/player/preference/TrackPreferencesRepository.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreferencesRepository.kt
similarity index 97%
rename from app/src/main/java/hu/bbara/purefin/player/preference/TrackPreferencesRepository.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreferencesRepository.kt
index bc810a0..93b3937 100644
--- a/app/src/main/java/hu/bbara/purefin/player/preference/TrackPreferencesRepository.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreferencesRepository.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.player.preference
+package hu.bbara.purefin.core.player.preference
import androidx.datastore.core.DataStore
import kotlinx.coroutines.flow.Flow
diff --git a/app/src/main/java/hu/bbara/purefin/player/preference/TrackPreferencesSerializer.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreferencesSerializer.kt
similarity index 95%
rename from app/src/main/java/hu/bbara/purefin/player/preference/TrackPreferencesSerializer.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreferencesSerializer.kt
index 6e58bc1..02435e3 100644
--- a/app/src/main/java/hu/bbara/purefin/player/preference/TrackPreferencesSerializer.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/preference/TrackPreferencesSerializer.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.player.preference
+package hu.bbara.purefin.core.player.preference
import androidx.datastore.core.CorruptionException
import androidx.datastore.core.Serializer
diff --git a/core/player/src/main/java/hu/bbara/purefin/core/player/stream/MediaSourceSelector.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/stream/MediaSourceSelector.kt
new file mode 100644
index 0000000..c8503e7
--- /dev/null
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/stream/MediaSourceSelector.kt
@@ -0,0 +1,4 @@
+package hu.bbara.purefin.core.player.stream
+
+class MediaSourceSelector {
+}
\ No newline at end of file
diff --git a/app/src/main/java/hu/bbara/purefin/player/viewmodel/PlayerViewModel.kt b/core/player/src/main/java/hu/bbara/purefin/core/player/viewmodel/PlayerViewModel.kt
similarity index 94%
rename from app/src/main/java/hu/bbara/purefin/player/viewmodel/PlayerViewModel.kt
rename to core/player/src/main/java/hu/bbara/purefin/core/player/viewmodel/PlayerViewModel.kt
index 9e30a7c..667beac 100644
--- a/app/src/main/java/hu/bbara/purefin/player/viewmodel/PlayerViewModel.kt
+++ b/core/player/src/main/java/hu/bbara/purefin/core/player/viewmodel/PlayerViewModel.kt
@@ -1,16 +1,16 @@
-package hu.bbara.purefin.player.viewmodel
+package hu.bbara.purefin.core.player.viewmodel
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
-import hu.bbara.purefin.player.data.PlayerMediaRepository
-import hu.bbara.purefin.data.MediaRepository
-import hu.bbara.purefin.player.manager.MediaContext
-import hu.bbara.purefin.player.manager.PlayerManager
-import hu.bbara.purefin.player.manager.ProgressManager
-import hu.bbara.purefin.player.model.PlayerUiState
-import hu.bbara.purefin.player.model.TrackOption
+import hu.bbara.purefin.core.data.MediaRepository
+import hu.bbara.purefin.core.player.data.PlayerMediaRepository
+import hu.bbara.purefin.core.player.manager.MediaContext
+import hu.bbara.purefin.core.player.manager.PlayerManager
+import hu.bbara.purefin.core.player.manager.ProgressManager
+import hu.bbara.purefin.core.player.model.PlayerUiState
+import hu.bbara.purefin.core.player.model.TrackOption
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
diff --git a/feature/download/build.gradle.kts b/feature/download/build.gradle.kts
new file mode 100644
index 0000000..f64d614
--- /dev/null
+++ b/feature/download/build.gradle.kts
@@ -0,0 +1,39 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
+plugins {
+ alias(libs.plugins.android.library)
+ alias(libs.plugins.kotlin.android)
+ alias(libs.plugins.hilt)
+ alias(libs.plugins.ksp)
+}
+
+android {
+ namespace = "hu.bbara.purefin.feature.download"
+ compileSdk = 36
+
+ defaultConfig {
+ minSdk = 29
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+}
+
+kotlin {
+ compilerOptions {
+ jvmTarget.set(JvmTarget.JVM_11)
+ }
+}
+
+dependencies {
+ implementation(project(":core:model"))
+ implementation(project(":core:data"))
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
+ implementation(libs.medi3.exoplayer)
+ implementation(libs.media3.datasource.okhttp)
+ implementation(libs.okhttp)
+ implementation(libs.jellyfin.core)
+}
diff --git a/app/src/main/java/hu/bbara/purefin/download/DownloadModule.kt b/feature/download/src/main/java/hu/bbara/purefin/feature/download/DownloadModule.kt
similarity index 98%
rename from app/src/main/java/hu/bbara/purefin/download/DownloadModule.kt
rename to feature/download/src/main/java/hu/bbara/purefin/feature/download/DownloadModule.kt
index f2884ab..42073a3 100644
--- a/app/src/main/java/hu/bbara/purefin/download/DownloadModule.kt
+++ b/feature/download/src/main/java/hu/bbara/purefin/feature/download/DownloadModule.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.download
+package hu.bbara.purefin.feature.download
import android.content.Context
import androidx.annotation.OptIn
diff --git a/app/src/main/java/hu/bbara/purefin/download/DownloadState.kt b/feature/download/src/main/java/hu/bbara/purefin/feature/download/DownloadState.kt
similarity index 85%
rename from app/src/main/java/hu/bbara/purefin/download/DownloadState.kt
rename to feature/download/src/main/java/hu/bbara/purefin/feature/download/DownloadState.kt
index 4ec0e7d..5a75d53 100644
--- a/app/src/main/java/hu/bbara/purefin/download/DownloadState.kt
+++ b/feature/download/src/main/java/hu/bbara/purefin/feature/download/DownloadState.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.download
+package hu.bbara.purefin.feature.download
sealed class DownloadState {
data object NotDownloaded : DownloadState()
diff --git a/app/src/main/java/hu/bbara/purefin/download/MediaDownloadManager.kt b/feature/download/src/main/java/hu/bbara/purefin/feature/download/MediaDownloadManager.kt
similarity index 93%
rename from app/src/main/java/hu/bbara/purefin/download/MediaDownloadManager.kt
rename to feature/download/src/main/java/hu/bbara/purefin/feature/download/MediaDownloadManager.kt
index bd3709c..c0513d2 100644
--- a/app/src/main/java/hu/bbara/purefin/download/MediaDownloadManager.kt
+++ b/feature/download/src/main/java/hu/bbara/purefin/feature/download/MediaDownloadManager.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.download
+package hu.bbara.purefin.feature.download
import android.content.Context
import android.util.Log
@@ -9,13 +9,13 @@ import androidx.media3.exoplayer.offline.Download
import androidx.media3.exoplayer.offline.DownloadManager
import androidx.media3.exoplayer.offline.DownloadRequest
import dagger.hilt.android.qualifiers.ApplicationContext
-import hu.bbara.purefin.client.JellyfinApiClient
-import hu.bbara.purefin.data.local.room.OfflineRoomMediaLocalDataSource
-import hu.bbara.purefin.data.local.room.OfflineDatabase
-import hu.bbara.purefin.data.local.room.dao.MovieDao
-import hu.bbara.purefin.data.model.Movie
-import hu.bbara.purefin.image.JellyfinImageHelper
-import hu.bbara.purefin.session.UserSessionRepository
+import hu.bbara.purefin.core.data.client.JellyfinApiClient
+import hu.bbara.purefin.core.data.image.JellyfinImageHelper
+import hu.bbara.purefin.core.data.local.room.OfflineDatabase
+import hu.bbara.purefin.core.data.local.room.OfflineRoomMediaLocalDataSource
+import hu.bbara.purefin.core.data.local.room.dao.MovieDao
+import hu.bbara.purefin.core.data.session.UserSessionRepository
+import hu.bbara.purefin.core.model.Movie
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
diff --git a/app/src/main/java/hu/bbara/purefin/download/PurefinDownloadService.kt b/feature/download/src/main/java/hu/bbara/purefin/feature/download/PurefinDownloadService.kt
similarity index 97%
rename from app/src/main/java/hu/bbara/purefin/download/PurefinDownloadService.kt
rename to feature/download/src/main/java/hu/bbara/purefin/feature/download/PurefinDownloadService.kt
index 1976a95..3b511d6 100644
--- a/app/src/main/java/hu/bbara/purefin/download/PurefinDownloadService.kt
+++ b/feature/download/src/main/java/hu/bbara/purefin/feature/download/PurefinDownloadService.kt
@@ -1,9 +1,7 @@
-package hu.bbara.purefin.download
+package hu.bbara.purefin.feature.download
import android.app.Notification
-import android.app.PendingIntent
import android.content.Context
-import android.content.Intent
import androidx.annotation.OptIn
import androidx.core.app.NotificationCompat
import androidx.media3.common.util.UnstableApi
@@ -13,11 +11,10 @@ import androidx.media3.exoplayer.offline.DownloadNotificationHelper
import androidx.media3.exoplayer.offline.DownloadRequest
import androidx.media3.exoplayer.offline.DownloadService
import androidx.media3.exoplayer.scheduler.Scheduler
-import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn
+import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.components.SingletonComponent
-import hu.bbara.purefin.R
@OptIn(UnstableApi::class)
class PurefinDownloadService : DownloadService(
diff --git a/feature/download/src/main/res/drawable/ic_launcher_foreground.xml b/feature/download/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/feature/download/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feature/download/src/main/res/values/strings.xml b/feature/download/src/main/res/values/strings.xml
new file mode 100644
index 0000000..627b05b
--- /dev/null
+++ b/feature/download/src/main/res/values/strings.xml
@@ -0,0 +1,5 @@
+
+
+ Downloads
+ Media download progress
+
diff --git a/feature/shared/build.gradle.kts b/feature/shared/build.gradle.kts
new file mode 100644
index 0000000..32dc390
--- /dev/null
+++ b/feature/shared/build.gradle.kts
@@ -0,0 +1,38 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
+plugins {
+ alias(libs.plugins.android.library)
+ alias(libs.plugins.kotlin.android)
+ alias(libs.plugins.hilt)
+ alias(libs.plugins.ksp)
+}
+
+android {
+ namespace = "hu.bbara.purefin.feature.shared"
+ compileSdk = 36
+
+ defaultConfig {
+ minSdk = 29
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+}
+
+kotlin {
+ compilerOptions {
+ jvmTarget.set(JvmTarget.JVM_11)
+ }
+}
+
+dependencies {
+ implementation(project(":core:model"))
+ implementation(project(":core:data"))
+ implementation(project(":feature:download"))
+ implementation(libs.hilt)
+ ksp(libs.hilt.compiler)
+ implementation(libs.jellyfin.core)
+ implementation(libs.androidx.lifecycle.viewmodel.compose)
+}
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeModels.kt b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/episode/EpisodeModels.kt
similarity index 89%
rename from app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeModels.kt
rename to feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/episode/EpisodeModels.kt
index c67463c..b885f61 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeModels.kt
+++ b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/episode/EpisodeModels.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.app.content.episode
+package hu.bbara.purefin.feature.shared.content.episode
import org.jellyfin.sdk.model.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreenViewModel.kt b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/episode/EpisodeScreenViewModel.kt
similarity index 84%
rename from app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreenViewModel.kt
rename to feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/episode/EpisodeScreenViewModel.kt
index f5295fe..b540b37 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/episode/EpisodeScreenViewModel.kt
+++ b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/episode/EpisodeScreenViewModel.kt
@@ -1,11 +1,11 @@
-package hu.bbara.purefin.app.content.episode
+package hu.bbara.purefin.feature.shared.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.model.Episode
-import hu.bbara.purefin.navigation.NavigationManager
+import hu.bbara.purefin.core.data.MediaRepository
+import hu.bbara.purefin.core.data.navigation.NavigationManager
+import hu.bbara.purefin.core.model.Episode
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieModels.kt b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/movie/MovieModels.kt
similarity index 89%
rename from app/src/main/java/hu/bbara/purefin/app/content/movie/MovieModels.kt
rename to feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/movie/MovieModels.kt
index d0a87b2..51cfed7 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieModels.kt
+++ b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/movie/MovieModels.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.app.content.movie
+package hu.bbara.purefin.feature.shared.content.movie
import org.jellyfin.sdk.model.UUID
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreenViewModel.kt b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/movie/MovieScreenViewModel.kt
similarity index 87%
rename from app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreenViewModel.kt
rename to feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/movie/MovieScreenViewModel.kt
index 0bd9755..1d33261 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/movie/MovieScreenViewModel.kt
+++ b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/movie/MovieScreenViewModel.kt
@@ -1,14 +1,14 @@
-package hu.bbara.purefin.app.content.movie
+package hu.bbara.purefin.feature.shared.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.model.Movie
-import hu.bbara.purefin.download.DownloadState
-import hu.bbara.purefin.download.MediaDownloadManager
-import hu.bbara.purefin.navigation.NavigationManager
-import hu.bbara.purefin.navigation.Route
+import hu.bbara.purefin.core.data.MediaRepository
+import hu.bbara.purefin.core.data.navigation.NavigationManager
+import hu.bbara.purefin.core.data.navigation.Route
+import hu.bbara.purefin.core.model.Movie
+import hu.bbara.purefin.feature.download.DownloadState
+import hu.bbara.purefin.feature.download.MediaDownloadManager
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesModels.kt b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/series/SeriesModels.kt
similarity index 95%
rename from app/src/main/java/hu/bbara/purefin/app/content/series/SeriesModels.kt
rename to feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/series/SeriesModels.kt
index 6e92b23..fdd4182 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesModels.kt
+++ b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/series/SeriesModels.kt
@@ -1,4 +1,4 @@
-package hu.bbara.purefin.app.content.series
+package hu.bbara.purefin.feature.shared.content.series
data class SeriesEpisodeUiModel(
val id: String,
diff --git a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesViewModel.kt b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/series/SeriesViewModel.kt
similarity index 84%
rename from app/src/main/java/hu/bbara/purefin/app/content/series/SeriesViewModel.kt
rename to feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/series/SeriesViewModel.kt
index f5c8295..4101a06 100644
--- a/app/src/main/java/hu/bbara/purefin/app/content/series/SeriesViewModel.kt
+++ b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/content/series/SeriesViewModel.kt
@@ -1,13 +1,13 @@
-package hu.bbara.purefin.app.content.series
+package hu.bbara.purefin.feature.shared.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.model.Series
-import hu.bbara.purefin.navigation.EpisodeDto
-import hu.bbara.purefin.navigation.NavigationManager
-import hu.bbara.purefin.navigation.Route
+import hu.bbara.purefin.core.data.MediaRepository
+import hu.bbara.purefin.core.data.navigation.EpisodeDto
+import hu.bbara.purefin.core.data.navigation.NavigationManager
+import hu.bbara.purefin.core.data.navigation.Route
+import hu.bbara.purefin.core.model.Series
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
diff --git a/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/home/HomeModels.kt b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/home/HomeModels.kt
new file mode 100644
index 0000000..5c3f136
--- /dev/null
+++ b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/home/HomeModels.kt
@@ -0,0 +1,81 @@
+package hu.bbara.purefin.feature.shared.home
+
+import hu.bbara.purefin.core.model.Episode
+import hu.bbara.purefin.core.model.Movie
+import hu.bbara.purefin.core.model.Series
+import org.jellyfin.sdk.model.UUID
+import org.jellyfin.sdk.model.api.BaseItemKind
+import org.jellyfin.sdk.model.api.CollectionType
+
+data class ContinueWatchingItem(
+ val type: BaseItemKind,
+ val movie: Movie? = null,
+ val episode: Episode? = null
+) {
+ val id: UUID = when (type) {
+ BaseItemKind.MOVIE -> movie!!.id
+ BaseItemKind.EPISODE -> episode!!.id
+ else -> throw UnsupportedOperationException("Unsupported item type: $type")
+ }
+ val primaryText: String = when (type) {
+ BaseItemKind.MOVIE -> movie!!.title
+ BaseItemKind.EPISODE -> episode!!.title
+ else -> throw UnsupportedOperationException("Unsupported item type: $type")
+ }
+ val secondaryText: String = when (type) {
+ BaseItemKind.MOVIE -> movie!!.year
+ BaseItemKind.EPISODE -> episode!!.releaseDate
+ else -> throw UnsupportedOperationException("Unsupported item type: $type")
+ }
+ val progress: Double = when (type) {
+ BaseItemKind.MOVIE -> movie!!.progress ?: 0.0
+ BaseItemKind.EPISODE -> episode!!.progress ?: 0.0
+ else -> throw UnsupportedOperationException("Unsupported item type: $type")
+ }
+}
+
+data class NextUpItem(
+ val episode: Episode
+) {
+ val id: UUID = episode.id
+ val primaryText: String = episode.title
+ val secondaryText: String = episode.releaseDate
+}
+
+data class LibraryItem(
+ val id: UUID,
+ val name: String,
+ val type: CollectionType,
+ val isEmpty: Boolean
+)
+
+data class PosterItem(
+ val type: BaseItemKind,
+ val movie: Movie? = null,
+ val series: Series? = null,
+ val episode: Episode? = null
+) {
+ val id: UUID = when (type) {
+ BaseItemKind.MOVIE -> movie!!.id
+ BaseItemKind.EPISODE -> episode!!.id
+ BaseItemKind.SERIES -> series!!.id
+ else -> throw IllegalArgumentException("Invalid type: $type")
+ }
+ val title: String = when (type) {
+ BaseItemKind.MOVIE -> movie!!.title
+ BaseItemKind.EPISODE -> episode!!.title
+ BaseItemKind.SERIES -> series!!.name
+ else -> throw IllegalArgumentException("Invalid type: $type")
+ }
+ val imageUrl: String = when (type) {
+ BaseItemKind.MOVIE -> movie!!.heroImageUrl
+ BaseItemKind.EPISODE -> episode!!.heroImageUrl
+ BaseItemKind.SERIES -> series!!.heroImageUrl
+ else -> throw IllegalArgumentException("Invalid type: $type")
+ }
+ fun watched() = when (type) {
+ BaseItemKind.MOVIE -> movie!!.watched
+ BaseItemKind.EPISODE -> episode!!.watched
+ else -> throw IllegalArgumentException("Invalid type: $type")
+ }
+}
diff --git a/app/src/main/java/hu/bbara/purefin/app/home/HomePageViewModel.kt b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/home/HomePageViewModel.kt
similarity index 87%
rename from app/src/main/java/hu/bbara/purefin/app/home/HomePageViewModel.kt
rename to feature/shared/src/main/java/hu/bbara/purefin/feature/shared/home/HomePageViewModel.kt
index 9ec07ac..a221647 100644
--- a/app/src/main/java/hu/bbara/purefin/app/home/HomePageViewModel.kt
+++ b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/home/HomePageViewModel.kt
@@ -1,24 +1,19 @@
-package hu.bbara.purefin.app.home
+package hu.bbara.purefin.feature.shared.home
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
-import hu.bbara.purefin.app.home.ui.ContinueWatchingItem
-import hu.bbara.purefin.app.home.ui.HomeNavItem
-import hu.bbara.purefin.app.home.ui.LibraryItem
-import hu.bbara.purefin.app.home.ui.NextUpItem
-import hu.bbara.purefin.app.home.ui.PosterItem
-import hu.bbara.purefin.data.MediaRepository
-import hu.bbara.purefin.data.model.Media
-import hu.bbara.purefin.domain.usecase.RefreshHomeDataUseCase
-import hu.bbara.purefin.image.JellyfinImageHelper
-import hu.bbara.purefin.navigation.EpisodeDto
-import hu.bbara.purefin.navigation.LibraryDto
-import hu.bbara.purefin.navigation.MovieDto
-import hu.bbara.purefin.navigation.NavigationManager
-import hu.bbara.purefin.navigation.Route
-import hu.bbara.purefin.navigation.SeriesDto
-import hu.bbara.purefin.session.UserSessionRepository
+import hu.bbara.purefin.core.data.MediaRepository
+import hu.bbara.purefin.core.model.Media
+import hu.bbara.purefin.core.data.domain.usecase.RefreshHomeDataUseCase
+import hu.bbara.purefin.core.data.image.JellyfinImageHelper
+import hu.bbara.purefin.core.data.navigation.EpisodeDto
+import hu.bbara.purefin.core.data.navigation.LibraryDto
+import hu.bbara.purefin.core.data.navigation.MovieDto
+import hu.bbara.purefin.core.data.navigation.NavigationManager
+import hu.bbara.purefin.core.data.navigation.Route
+import hu.bbara.purefin.core.data.navigation.SeriesDto
+import hu.bbara.purefin.core.data.session.UserSessionRepository
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
@@ -140,9 +135,9 @@ class HomePageViewModel @Inject constructor(
viewModelScope.launch { mediaRepository.ensureReady() }
}
- fun onLibrarySelected(library : HomeNavItem) {
+ fun onLibrarySelected(id: UUID, name: String) {
viewModelScope.launch {
- navigationManager.navigate(Route.LibraryRoute(library = LibraryDto(id = library.id, name = library.label)))
+ navigationManager.navigate(Route.LibraryRoute(library = LibraryDto(id = id, name = name)))
}
}
diff --git a/app/src/main/java/hu/bbara/purefin/app/library/LibraryViewModel.kt b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/library/LibraryViewModel.kt
similarity index 85%
rename from app/src/main/java/hu/bbara/purefin/app/library/LibraryViewModel.kt
rename to feature/shared/src/main/java/hu/bbara/purefin/feature/shared/library/LibraryViewModel.kt
index e6b59dc..aa746a9 100644
--- a/app/src/main/java/hu/bbara/purefin/app/library/LibraryViewModel.kt
+++ b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/library/LibraryViewModel.kt
@@ -1,14 +1,14 @@
-package hu.bbara.purefin.app.library
+package hu.bbara.purefin.feature.shared.library
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
-import hu.bbara.purefin.app.home.ui.PosterItem
-import hu.bbara.purefin.data.MediaRepository
-import hu.bbara.purefin.navigation.MovieDto
-import hu.bbara.purefin.navigation.NavigationManager
-import hu.bbara.purefin.navigation.Route
-import hu.bbara.purefin.navigation.SeriesDto
+import hu.bbara.purefin.feature.shared.home.PosterItem
+import hu.bbara.purefin.core.data.MediaRepository
+import hu.bbara.purefin.core.data.navigation.MovieDto
+import hu.bbara.purefin.core.data.navigation.NavigationManager
+import hu.bbara.purefin.core.data.navigation.Route
+import hu.bbara.purefin.core.data.navigation.SeriesDto
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
diff --git a/app/src/main/java/hu/bbara/purefin/login/viewmodel/LoginViewModel.kt b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/login/LoginViewModel.kt
similarity index 91%
rename from app/src/main/java/hu/bbara/purefin/login/viewmodel/LoginViewModel.kt
rename to feature/shared/src/main/java/hu/bbara/purefin/feature/shared/login/LoginViewModel.kt
index 07c8eb1..316e22d 100644
--- a/app/src/main/java/hu/bbara/purefin/login/viewmodel/LoginViewModel.kt
+++ b/feature/shared/src/main/java/hu/bbara/purefin/feature/shared/login/LoginViewModel.kt
@@ -1,10 +1,10 @@
-package hu.bbara.purefin.login.viewmodel
+package hu.bbara.purefin.feature.shared.login
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
-import hu.bbara.purefin.client.JellyfinApiClient
-import hu.bbara.purefin.session.UserSessionRepository
+import hu.bbara.purefin.core.data.client.JellyfinApiClient
+import hu.bbara.purefin.core.data.session.UserSessionRepository
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index b664bce..13b12b0 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -64,6 +64,7 @@ androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref =
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
+android-library = { id = "com.android.library", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 48e45a3..4658f4b 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -21,4 +21,8 @@ dependencyResolutionManagement {
rootProject.name = "Purefin"
include(":app")
-
\ No newline at end of file
+include(":core:model")
+include(":core:data")
+include(":feature:download")
+include(":core:player")
+include(":feature:shared")