refactor: modularize app into multi-module architecture

This commit is contained in:
2026-02-21 00:15:51 +01:00
parent 8601ef0236
commit 7333781f83
123 changed files with 668 additions and 404 deletions

View File

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

View File

@@ -0,0 +1,7 @@
package hu.bbara.purefin.core.model
data class CastMember(
val name: String,
val role: String,
val imageUrl: String?
)

View File

@@ -0,0 +1,20 @@
package hu.bbara.purefin.core.model
import java.util.UUID
data class Episode(
val id: UUID,
val seriesId: UUID,
val seasonId: UUID,
val index: Int,
val title: String,
val synopsis: String,
val releaseDate: String,
val rating: String,
val runtime: String,
val progress: Double?,
val watched: Boolean,
val format: String,
val heroImageUrl: String,
val cast: List<CastMember>
)

View File

@@ -0,0 +1,18 @@
package hu.bbara.purefin.core.model
import org.jellyfin.sdk.model.api.CollectionType
import java.util.UUID
data class Library(
val id: UUID,
val name: String,
val type: CollectionType,
val series: List<Series>? = null,
val movies: List<Movie>? = null,
) {
init {
require(series != null || movies != null) { "Either series or movie must be provided" }
require(series == null || movies == null) { "Only one of series or movie can be provided" }
require(type == CollectionType.TVSHOWS || type == CollectionType.MOVIES) { "Invalid type: $type" }
}
}

View File

@@ -0,0 +1,14 @@
package hu.bbara.purefin.core.model
import org.jellyfin.sdk.model.api.BaseItemKind
import java.util.UUID
sealed class Media(
val id: UUID,
val type: BaseItemKind
) {
class MovieMedia(val movieId: UUID) : Media(movieId, BaseItemKind.MOVIE)
class SeriesMedia(val seriesId: UUID) : Media(seriesId, BaseItemKind.SERIES)
class SeasonMedia(val seasonId: UUID, val seriesId: UUID) : Media(seasonId, BaseItemKind.SEASON)
class EpisodeMedia(val episodeId: UUID, val seriesId: UUID) : Media(episodeId, BaseItemKind.EPISODE)
}

View File

@@ -0,0 +1,7 @@
package hu.bbara.purefin.core.model
sealed interface MediaRepositoryState {
data object Loading : MediaRepositoryState
data object Ready : MediaRepositoryState
data class Error(val throwable: Throwable) : MediaRepositoryState
}

View File

@@ -0,0 +1,20 @@
package hu.bbara.purefin.core.model
import java.util.UUID
data class Movie(
val id: UUID,
val libraryId: UUID,
val title: String,
val progress: Double?,
val watched: Boolean,
val year: String,
val rating: String,
val runtime: String,
val format: String,
val synopsis: String,
val heroImageUrl: String,
val audioTrack: String,
val subtitles: String,
val cast: List<CastMember>
)

View File

@@ -0,0 +1,13 @@
package hu.bbara.purefin.core.model
import java.util.UUID
data class Season(
val id: UUID,
val seriesId: UUID,
val name: String,
val index: Int,
val unwatchedEpisodeCount: Int,
val episodeCount: Int,
val episodes: List<Episode>
)

View File

@@ -0,0 +1,16 @@
package hu.bbara.purefin.core.model
import java.util.UUID
data class Series(
val id: UUID,
val libraryId: UUID,
val name: String,
val synopsis: String,
val year: String,
val heroImageUrl: String,
val unwatchedEpisodeCount: Int,
val seasonCount: Int,
val seasons: List<Season>,
val cast: List<CastMember>
)