From 53bc6246e4d85a384d78ae669b70000144831be1 Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Sat, 2 May 2026 20:56:05 +0200 Subject: [PATCH] feat(libraries): add size property to Library and related models for better content representation --- .../purefin/ui/screen/home/components/TvHomeContentTest.kt | 1 + .../ui/screen/libraries/TvLibrariesOverviewScreenTest.kt | 2 ++ .../purefin/ui/screen/home/components/TvHomeHeroStateTest.kt | 1 + .../purefin/ui/screen/libraries/components/LibraryListItem.kt | 2 ++ core-model/src/main/java/hu/bbara/purefin/model/Library.kt | 1 + .../java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt | 1 + .../src/main/java/hu/bbara/purefin/ui/model/LibraryUiModel.kt | 1 + .../purefin/data/catalog/InMemoryAppContentRepository.kt | 2 ++ .../hu/bbara/purefin/data/converter/BaseItemDtoConverter.kt | 4 +++- .../java/hu/bbara/purefin/data/offline/cache/HomeCache.kt | 4 ++++ 10 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app-tv/src/androidTest/java/hu/bbara/purefin/ui/screen/home/components/TvHomeContentTest.kt b/app-tv/src/androidTest/java/hu/bbara/purefin/ui/screen/home/components/TvHomeContentTest.kt index 17ffd715..c719ec26 100644 --- a/app-tv/src/androidTest/java/hu/bbara/purefin/ui/screen/home/components/TvHomeContentTest.kt +++ b/app-tv/src/androidTest/java/hu/bbara/purefin/ui/screen/home/components/TvHomeContentTest.kt @@ -392,6 +392,7 @@ class TvHomeContentTest { name = "Movies", type = LibraryKind.MOVIES, posterUrl = "", + size = 1, isEmpty = false ) ) diff --git a/app-tv/src/androidTest/java/hu/bbara/purefin/ui/screen/libraries/TvLibrariesOverviewScreenTest.kt b/app-tv/src/androidTest/java/hu/bbara/purefin/ui/screen/libraries/TvLibrariesOverviewScreenTest.kt index 659a7164..d149fe0e 100644 --- a/app-tv/src/androidTest/java/hu/bbara/purefin/ui/screen/libraries/TvLibrariesOverviewScreenTest.kt +++ b/app-tv/src/androidTest/java/hu/bbara/purefin/ui/screen/libraries/TvLibrariesOverviewScreenTest.kt @@ -25,6 +25,7 @@ class TvLibrariesOverviewScreenTest { name = "Movies", type = LibraryKind.MOVIES, posterUrl = "", + size = 1, isEmpty = false ), LibraryUiModel( @@ -32,6 +33,7 @@ class TvLibrariesOverviewScreenTest { name = "Shows", type = LibraryKind.SERIES, posterUrl = "", + size = 1, isEmpty = false ) ) diff --git a/app-tv/src/test/java/hu/bbara/purefin/ui/screen/home/components/TvHomeHeroStateTest.kt b/app-tv/src/test/java/hu/bbara/purefin/ui/screen/home/components/TvHomeHeroStateTest.kt index d9ea7df2..49dc6979 100644 --- a/app-tv/src/test/java/hu/bbara/purefin/ui/screen/home/components/TvHomeHeroStateTest.kt +++ b/app-tv/src/test/java/hu/bbara/purefin/ui/screen/home/components/TvHomeHeroStateTest.kt @@ -110,6 +110,7 @@ class TvHomeHeroStateTest { name = "Movies", type = LibraryKind.MOVIES, posterUrl = "", + size = 1, isEmpty = isEmpty ) } diff --git a/app/src/main/java/hu/bbara/purefin/ui/screen/libraries/components/LibraryListItem.kt b/app/src/main/java/hu/bbara/purefin/ui/screen/libraries/components/LibraryListItem.kt index 0879d321..bf24f5c9 100644 --- a/app/src/main/java/hu/bbara/purefin/ui/screen/libraries/components/LibraryListItem.kt +++ b/app/src/main/java/hu/bbara/purefin/ui/screen/libraries/components/LibraryListItem.kt @@ -2,6 +2,7 @@ package hu.bbara.purefin.ui.screen.libraries.components import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import hu.bbara.purefin.model.LibraryKind import hu.bbara.purefin.ui.common.card.MediaImageCard import hu.bbara.purefin.ui.model.LibraryUiModel @@ -14,6 +15,7 @@ fun LibraryListItem( MediaImageCard( imageUrl = uiModel.posterUrl, title = uiModel.name, + subtitle = "${uiModel.size} ${if (uiModel.type == LibraryKind.SERIES) "series" else "movies"}", onClick = onClick, modifier = modifier ) diff --git a/core-model/src/main/java/hu/bbara/purefin/model/Library.kt b/core-model/src/main/java/hu/bbara/purefin/model/Library.kt index 804b647a..cb848ca6 100644 --- a/core-model/src/main/java/hu/bbara/purefin/model/Library.kt +++ b/core-model/src/main/java/hu/bbara/purefin/model/Library.kt @@ -7,6 +7,7 @@ data class Library( val name: String, val type: LibraryKind, val posterUrl: String, + val size: Int, val series: List? = null, val movies: List? = null, ) { diff --git a/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt b/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt index 704ab150..b16b2d85 100644 --- a/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt +++ b/core/src/main/java/hu/bbara/purefin/feature/browse/home/AppViewModel.kt @@ -57,6 +57,7 @@ class AppViewModel @Inject constructor( name = it.name, type = it.type, posterUrl = it.posterUrl, + size = it.size, isEmpty = when (it.type) { LibraryKind.MOVIES -> mediaCatalogReader.movies.value.isEmpty() LibraryKind.SERIES -> mediaCatalogReader.series.value.isEmpty() diff --git a/core/src/main/java/hu/bbara/purefin/ui/model/LibraryUiModel.kt b/core/src/main/java/hu/bbara/purefin/ui/model/LibraryUiModel.kt index 18b1ba7e..4205af9e 100644 --- a/core/src/main/java/hu/bbara/purefin/ui/model/LibraryUiModel.kt +++ b/core/src/main/java/hu/bbara/purefin/ui/model/LibraryUiModel.kt @@ -8,5 +8,6 @@ data class LibraryUiModel( val name: String, val type: LibraryKind, val posterUrl: String, + val size: Int, val isEmpty: Boolean ) \ No newline at end of file diff --git a/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryAppContentRepository.kt b/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryAppContentRepository.kt index 4fead48d..fa17b7ca 100644 --- a/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryAppContentRepository.kt +++ b/data/src/main/java/hu/bbara/purefin/data/catalog/InMemoryAppContentRepository.kt @@ -230,9 +230,11 @@ class InMemoryAppContentRepository @Inject constructor( return when (library.type) { LibraryKind.MOVIES -> library.copy( movies = contentItem.map { it.toMovie(serverUrl()) }, + size = contentItem.size, ) LibraryKind.SERIES -> library.copy( series = contentItem.map { it.toSeries(serverUrl()) }, + size = contentItem.size, ) } } diff --git a/data/src/main/java/hu/bbara/purefin/data/converter/BaseItemDtoConverter.kt b/data/src/main/java/hu/bbara/purefin/data/converter/BaseItemDtoConverter.kt index b4cde4d3..146d3098 100644 --- a/data/src/main/java/hu/bbara/purefin/data/converter/BaseItemDtoConverter.kt +++ b/data/src/main/java/hu/bbara/purefin/data/converter/BaseItemDtoConverter.kt @@ -27,6 +27,7 @@ fun BaseItemDto.toLibrary(serverUrl: String): Library { artworkKind = ArtworkKind.PRIMARY ), type = LibraryKind.MOVIES, + size = childCount ?: 0, movies = emptyList(), ) CollectionType.TVSHOWS -> Library( @@ -38,6 +39,7 @@ fun BaseItemDto.toLibrary(serverUrl: String): Library { artworkKind = ArtworkKind.PRIMARY ), type = LibraryKind.SERIES, + size = childCount ?: 0, series = emptyList(), ) else -> throw UnsupportedOperationException("Unsupported library type: $collectionType") @@ -133,4 +135,4 @@ private fun formatRuntime(ticks: Long?): String { val hours = TimeUnit.SECONDS.toHours(totalSeconds) val minutes = TimeUnit.SECONDS.toMinutes(totalSeconds) % 60 return if (hours > 0) "${hours}h ${minutes}m" else "${minutes}m" -} \ No newline at end of file +} diff --git a/data/src/main/java/hu/bbara/purefin/data/offline/cache/HomeCache.kt b/data/src/main/java/hu/bbara/purefin/data/offline/cache/HomeCache.kt index 4ab72a44..e1d3d4cb 100644 --- a/data/src/main/java/hu/bbara/purefin/data/offline/cache/HomeCache.kt +++ b/data/src/main/java/hu/bbara/purefin/data/offline/cache/HomeCache.kt @@ -79,6 +79,7 @@ data class CachedLibrary( val name: String, val type: String, val posterUrl: String, + val size: Int = 0, val series: List? = null, val movies: List? = null, ) @@ -100,6 +101,7 @@ fun Library.toCachedLibrary() = CachedLibrary( name = name, type = type.name, posterUrl = posterUrl, + size = size, series = series?.map { it.toCachedSeries() }, movies = movies?.map { it.toCachedMovie() }, ) @@ -112,6 +114,7 @@ fun CachedLibrary.toLibrary(): Library? { name = name, type = LibraryKind.MOVIES, posterUrl = posterUrl, + size = size, movies = movies?.mapNotNull { it.toMovie() } ?: emptyList(), ) "SERIES" -> Library( @@ -119,6 +122,7 @@ fun CachedLibrary.toLibrary(): Library? { name = name, type = LibraryKind.SERIES, posterUrl = posterUrl, + size = size, series = series?.mapNotNull { it.toSeries() } ?: emptyList(), ) else -> null