From 6fbf6209a1bc799f98844852810bf1dd43d2e47e Mon Sep 17 00:00:00 2001 From: Damontecres Date: Tue, 1 Sep 2026 17:52:47 -0400 Subject: [PATCH] Fixes to default home view options for music & videos (#1926) ## Description This PR fixes how cards are displayed initially when creating the default home page or loading it from the web config: - Ensure view options are selected based on the library type (this is how it's done already when manually adding a row) - Support more home row types such as photos and music ### Related issues Fixes https://github.com/damontecres/Wholphin/issues/1838 ### Testing Emulator, resetting to default and loading from web config ## Screenshots N/A, music cards will be square instead of poster sized ## AI or LLM usage None --- .../wholphin/services/HomeSettingsService.kt | 81 +++++++++++++++---- .../ui/main/settings/HomeSettingsViewModel.kt | 21 +---- .../damontecres/wholphin/util/Constants.kt | 9 +-- 3 files changed, 68 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/HomeSettingsService.kt b/app/src/main/java/com/github/damontecres/wholphin/services/HomeSettingsService.kt index ff7d7411..e7b5db00 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/services/HomeSettingsService.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/services/HomeSettingsService.kt @@ -7,11 +7,14 @@ import com.github.damontecres.wholphin.data.ServerRepository import com.github.damontecres.wholphin.data.model.BaseItem import com.github.damontecres.wholphin.data.model.HomePageSettings import com.github.damontecres.wholphin.data.model.HomeRowConfig +import com.github.damontecres.wholphin.data.model.HomeRowViewOptions import com.github.damontecres.wholphin.data.model.SUPPORTED_HOME_PAGE_SETTINGS_VERSION import com.github.damontecres.wholphin.data.model.createGenreDestination import com.github.damontecres.wholphin.data.model.createStudioDestination import com.github.damontecres.wholphin.preferences.DefaultUserConfiguration import com.github.damontecres.wholphin.preferences.HomePagePreferences +import com.github.damontecres.wholphin.ui.AspectRatio +import com.github.damontecres.wholphin.ui.Cards import com.github.damontecres.wholphin.ui.HomeItemFields import com.github.damontecres.wholphin.ui.ProgramItemFields import com.github.damontecres.wholphin.ui.components.getGenreImageMap @@ -36,7 +39,6 @@ import com.github.damontecres.wholphin.util.GetRecordingsRequestHandler import com.github.damontecres.wholphin.util.GetStudiosRequestHandler import com.github.damontecres.wholphin.util.HomeRowLoadingState import com.github.damontecres.wholphin.util.HomeRowLoadingState.Success -import com.github.damontecres.wholphin.util.supportedHomeCollectionTypes import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow @@ -55,7 +57,6 @@ import org.jellyfin.sdk.api.client.ApiClient import org.jellyfin.sdk.api.client.extensions.liveTvApi import org.jellyfin.sdk.api.client.extensions.userApi import org.jellyfin.sdk.api.client.extensions.userLibraryApi -import org.jellyfin.sdk.api.client.extensions.userViewsApi import org.jellyfin.sdk.model.DateTime import org.jellyfin.sdk.model.UUID import org.jellyfin.sdk.model.api.BaseItemKind @@ -280,20 +281,25 @@ class HomeSettingsService val includedIds = libraries - .mapIndexed { index, it -> - val parentId = it.itemId - val title = getRecentlyAddedTitle(it.name) - if (it.collectionType == CollectionType.LIVETV) { + .mapIndexed { index, library -> + val parentId = library.itemId + val title = getRecentlyAddedTitle(library.name) + if (library.collectionType == CollectionType.LIVETV) { HomeRowConfigDisplay( id = index, title = ResStringProvider(R.string.watch_live), config = HomeRowConfig.TvPrograms(), ) } else { + val viewOptions = viewOptionsForCollectionType(library.collectionType) HomeRowConfigDisplay( id = index, title = title, - config = HomeRowConfig.RecentlyAdded(parentId), + config = + HomeRowConfig.RecentlyAdded( + parentId = parentId, + viewOptions = viewOptions, + ), ) } } @@ -323,12 +329,10 @@ class HomeSettingsService val userDto by api.userApi.getUserById(userId) val config = userDto.configuration ?: DefaultUserConfiguration val libraries = - api.userViewsApi - .getUserViews(userId = userId) - .content.items - .filter { - it.collectionType in supportedHomeCollectionTypes && - it.id !in config.latestItemsExcludes + navDrawerService + .getAllUserLibraries(userId, userDto.tvAccess) + .filterNot { + it.itemId in config.latestItemsExcludes } return if (customPrefs.isNotEmpty()) { @@ -401,15 +405,21 @@ class HomeSettingsService } } if (sectionType == HomeSectionType.LATEST_MEDIA) { - libraries.map { + libraries.map { library -> + val viewOptions = + viewOptionsForCollectionType(library.collectionType) HomeRowConfigDisplay( id = id++, title = ResArgStringProvider( R.string.recently_added_in, - it.name ?: "", + library.name ?: "", + ), + config = + HomeRowConfig.RecentlyAdded( + parentId = library.itemId, + viewOptions = viewOptions, ), - config = HomeRowConfig.RecentlyAdded(it.id), ) } } else if (config != null) { @@ -1261,3 +1271,42 @@ private val Library?.itemFields: List } private val HomeItemFieldsBoxSets get() = HomeItemFields + listOf(ItemFields.CHILD_COUNT) + +fun viewOptionsForCollectionType(collectionType: CollectionType?): HomeRowViewOptions = + when (collectionType) { + CollectionType.MUSIC, + -> { + HomeRowViewOptions( + heightDp = Cards.HEIGHT_EPISODE, + aspectRatio = AspectRatio.SQUARE, + ) + } + + CollectionType.PHOTOS, + CollectionType.HOMEVIDEOS, + CollectionType.MUSICVIDEOS, + CollectionType.TRAILERS, + -> { + HomeRowViewOptions( + heightDp = Cards.HEIGHT_EPISODE, + aspectRatio = AspectRatio.WIDE, + ) + } + + CollectionType.LIVETV, + -> { + HomeRowViewOptions.liveTvDefault + } + + CollectionType.MOVIES, + CollectionType.TVSHOWS, + CollectionType.BOXSETS, + CollectionType.BOOKS, + CollectionType.PLAYLISTS, + CollectionType.FOLDERS, + CollectionType.UNKNOWN, + null, + -> { + HomeRowViewOptions() + } + } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsViewModel.kt index 6faf855b..64c0308e 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/main/settings/HomeSettingsViewModel.kt @@ -34,7 +34,7 @@ import com.github.damontecres.wholphin.services.UserPreferencesService import com.github.damontecres.wholphin.services.getRecentlyAddedTitle import com.github.damontecres.wholphin.services.hilt.IoCoroutineScope import com.github.damontecres.wholphin.services.tvAccess -import com.github.damontecres.wholphin.ui.AspectRatio +import com.github.damontecres.wholphin.services.viewOptionsForCollectionType import com.github.damontecres.wholphin.ui.formatTypeName import com.github.damontecres.wholphin.ui.launchDefault import com.github.damontecres.wholphin.ui.launchIO @@ -275,24 +275,7 @@ class HomeSettingsViewModel rowType: LibraryRowType, ): Job = viewModelScope.launchIO { - val viewOptions = - when (library.collectionType) { - CollectionType.MUSIC -> { - HomeRowViewOptions(aspectRatio = AspectRatio.SQUARE) - } - - CollectionType.HOMEVIDEOS, - CollectionType.MUSICVIDEOS, - -> { - HomeRowViewOptions( - aspectRatio = AspectRatio.WIDE, - ) - } - - else -> { - HomeRowViewOptions() - } - } + val viewOptions = viewOptionsForCollectionType(library.collectionType) val id = idCounter++ val newRow = when (rowType) { diff --git a/app/src/main/java/com/github/damontecres/wholphin/util/Constants.kt b/app/src/main/java/com/github/damontecres/wholphin/util/Constants.kt index 531a4f9a..f2078766 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/util/Constants.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/util/Constants.kt @@ -33,14 +33,7 @@ val supportedCollectionTypes = CollectionType.MUSICVIDEOS, CollectionType.FOLDERS, CollectionType.MUSIC, - null, // Mixed - ) - -val supportedHomeCollectionTypes = - setOf( - CollectionType.MOVIES, - CollectionType.TVSHOWS, - CollectionType.HOMEVIDEOS, + CollectionType.PHOTOS, null, // Mixed )