Fix clicking genre cards on home page (#953)

## Description
Fixes clicking on a genre card added to the home page

### Related issues
Fixes #952

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
This commit is contained in:
Ray 2026-02-22 20:18:18 -05:00 committed by GitHub
parent e8c9b4e208
commit a51d9e9c65
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 78 additions and 28 deletions

View file

@ -25,6 +25,7 @@ import org.jellyfin.sdk.model.api.BaseItemDto
import org.jellyfin.sdk.model.api.BaseItemKind import org.jellyfin.sdk.model.api.BaseItemKind
import org.jellyfin.sdk.model.extensions.ticks import org.jellyfin.sdk.model.extensions.ticks
import java.util.Locale import java.util.Locale
import java.util.UUID
import kotlin.time.Duration import kotlin.time.Duration
@Serializable @Serializable
@ -33,6 +34,7 @@ data class BaseItem(
val data: BaseItemDto, val data: BaseItemDto,
val useSeriesForPrimary: Boolean, val useSeriesForPrimary: Boolean,
val imageUrlOverride: String? = null, val imageUrlOverride: String? = null,
val destinationOverride: Destination? = null,
) : CardGridItem { ) : CardGridItem {
val id get() = data.id val id get() = data.id
@ -166,6 +168,7 @@ data class BaseItem(
}?.toIntOrNull() }?.toIntOrNull()
fun destination(index: Int? = null): Destination { fun destination(index: Int? = null): Destination {
if (destinationOverride != null) return destinationOverride
val result = val result =
// Redirect episodes & seasons to their series if possible // Redirect episodes & seasons to their series if possible
when (type) { when (type) {
@ -234,3 +237,28 @@ data class BaseItemUi(
val episodeUnplayedCornerText: String?, val episodeUnplayedCornerText: String?,
val quickDetails: AnnotatedString, val quickDetails: AnnotatedString,
) )
fun createGenreDestination(
genreId: UUID,
genreName: String,
parentId: UUID,
parentName: String?,
includeItemTypes: List<BaseItemKind>?,
) = Destination.FilteredCollection(
itemId = parentId,
filter =
CollectionFolderFilter(
nameOverride =
listOfNotNull(
genreName,
parentName,
).joinToString(" "),
filter =
GetItemsFilter(
genres = listOf(genreId),
includeItemTypes = includeItemTypes,
),
useSavedLibraryDisplayInfo = false,
),
recursive = true,
)

View file

@ -7,6 +7,7 @@ import com.github.damontecres.wholphin.data.model.BaseItem
import com.github.damontecres.wholphin.data.model.HomePageSettings import com.github.damontecres.wholphin.data.model.HomePageSettings
import com.github.damontecres.wholphin.data.model.HomeRowConfig import com.github.damontecres.wholphin.data.model.HomeRowConfig
import com.github.damontecres.wholphin.data.model.SUPPORTED_HOME_PAGE_SETTINGS_VERSION 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.preferences.DefaultUserConfiguration import com.github.damontecres.wholphin.preferences.DefaultUserConfiguration
import com.github.damontecres.wholphin.preferences.HomePagePreferences import com.github.damontecres.wholphin.preferences.HomePagePreferences
import com.github.damontecres.wholphin.ui.DefaultItemFields import com.github.damontecres.wholphin.ui.DefaultItemFields
@ -14,6 +15,7 @@ import com.github.damontecres.wholphin.ui.SlimItemFields
import com.github.damontecres.wholphin.ui.components.getGenreImageMap import com.github.damontecres.wholphin.ui.components.getGenreImageMap
import com.github.damontecres.wholphin.ui.main.settings.Library import com.github.damontecres.wholphin.ui.main.settings.Library
import com.github.damontecres.wholphin.ui.main.settings.favoriteOptions import com.github.damontecres.wholphin.ui.main.settings.favoriteOptions
import com.github.damontecres.wholphin.ui.playback.getTypeFor
import com.github.damontecres.wholphin.ui.toBaseItems import com.github.damontecres.wholphin.ui.toBaseItems
import com.github.damontecres.wholphin.ui.toServerString import com.github.damontecres.wholphin.ui.toServerString
import com.github.damontecres.wholphin.util.GetGenresRequestHandler import com.github.damontecres.wholphin.util.GetGenresRequestHandler
@ -654,18 +656,33 @@ class HomeSettingsService
includeItemTypes = null, includeItemTypes = null,
cardWidthPx = null, cardWidthPx = null,
) )
val genres = val library =
items.map {
BaseItem(it, false, genreImages[it.id])
}
val name =
libraries libraries
.firstOrNull { it.itemId == row.parentId } .firstOrNull { it.itemId == row.parentId }
?.name
val title = val title =
name?.let { context.getString(R.string.genres_in, it) } library?.name?.let { context.getString(R.string.genres_in, it) }
?: context.getString(R.string.genres) ?: context.getString(R.string.genres)
val genres =
items.map {
BaseItem(
it,
false,
genreImages[it.id],
createGenreDestination(
genreId = it.id,
genreName = it.name ?: "",
parentId = row.parentId,
parentName = library?.name,
includeItemTypes =
library?.collectionType?.let {
getTypeFor(it)?.let {
listOf(it)
}
},
),
)
}
Success( Success(
title, title,

View file

@ -21,8 +21,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.github.damontecres.wholphin.data.ServerRepository import com.github.damontecres.wholphin.data.ServerRepository
import com.github.damontecres.wholphin.data.model.BaseItem import com.github.damontecres.wholphin.data.model.BaseItem
import com.github.damontecres.wholphin.data.model.CollectionFolderFilter import com.github.damontecres.wholphin.data.model.createGenreDestination
import com.github.damontecres.wholphin.data.model.GetItemsFilter
import com.github.damontecres.wholphin.services.ImageUrlService import com.github.damontecres.wholphin.services.ImageUrlService
import com.github.damontecres.wholphin.services.NavigationManager import com.github.damontecres.wholphin.services.NavigationManager
import com.github.damontecres.wholphin.ui.OneTimeLaunchedEffect import com.github.damontecres.wholphin.ui.OneTimeLaunchedEffect
@ -30,7 +29,6 @@ import com.github.damontecres.wholphin.ui.SlimItemFields
import com.github.damontecres.wholphin.ui.cards.GenreCard import com.github.damontecres.wholphin.ui.cards.GenreCard
import com.github.damontecres.wholphin.ui.detail.CardGrid import com.github.damontecres.wholphin.ui.detail.CardGrid
import com.github.damontecres.wholphin.ui.detail.CardGridItem import com.github.damontecres.wholphin.ui.detail.CardGridItem
import com.github.damontecres.wholphin.ui.nav.Destination
import com.github.damontecres.wholphin.ui.setValueOnMain import com.github.damontecres.wholphin.ui.setValueOnMain
import com.github.damontecres.wholphin.ui.tryRequestFocus import com.github.damontecres.wholphin.ui.tryRequestFocus
import com.github.damontecres.wholphin.util.GetGenresRequestHandler import com.github.damontecres.wholphin.util.GetGenresRequestHandler
@ -256,24 +254,13 @@ fun GenreCardGrid(
pager = genres, pager = genres,
onClickItem = { _, genre -> onClickItem = { _, genre ->
viewModel.navigationManager.navigateTo( viewModel.navigationManager.navigateTo(
Destination.FilteredCollection( createGenreDestination(
itemId = itemId, genreId = genre.id,
filter = genreName = genre.name,
CollectionFolderFilter( parentId = itemId,
nameOverride = parentName = item?.title,
listOfNotNull(
genre.name,
item?.title,
).joinToString(" "),
filter =
GetItemsFilter(
genres = listOf(genre.id),
includeItemTypes = includeItemTypes, includeItemTypes = includeItemTypes,
), ),
useSavedLibraryDisplayInfo = false,
),
recursive = true,
),
) )
}, },
onLongClickItem = { _, _ -> }, onLongClickItem = { _, _ -> },

View file

@ -3,6 +3,7 @@ package com.github.damontecres.wholphin.ui.playback
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import com.github.damontecres.wholphin.preferences.PrefContentScale import com.github.damontecres.wholphin.preferences.PrefContentScale
import org.jellyfin.sdk.model.api.BaseItemKind import org.jellyfin.sdk.model.api.BaseItemKind
import org.jellyfin.sdk.model.api.CollectionType
val playbackSpeedOptions = listOf(".25", ".5", ".75", "1.0", "1.25", "1.5", "1.75", "2.0") val playbackSpeedOptions = listOf(".25", ".5", ".75", "1.0", "1.25", "1.5", "1.75", "2.0")
@ -81,3 +82,20 @@ val BaseItemKind.playable: Boolean
BaseItemKind.YEAR, BaseItemKind.YEAR,
-> false -> false
} }
fun getTypeFor(collectionType: CollectionType): BaseItemKind? =
when (collectionType) {
CollectionType.UNKNOWN -> null
CollectionType.MOVIES -> BaseItemKind.MOVIE
CollectionType.TVSHOWS -> BaseItemKind.SERIES
CollectionType.MUSIC -> BaseItemKind.AUDIO
CollectionType.MUSICVIDEOS -> BaseItemKind.MUSIC_VIDEO
CollectionType.TRAILERS -> BaseItemKind.TRAILER
CollectionType.HOMEVIDEOS -> BaseItemKind.VIDEO
CollectionType.BOXSETS -> BaseItemKind.BOX_SET
CollectionType.BOOKS -> BaseItemKind.BOOK
CollectionType.PHOTOS -> BaseItemKind.PHOTO_ALBUM
CollectionType.LIVETV -> BaseItemKind.LIVE_TV_CHANNEL
CollectionType.PLAYLISTS -> BaseItemKind.PLAYLIST
CollectionType.FOLDERS -> BaseItemKind.FOLDER
}