diff --git a/composeApp/src/androidMain/kotlin/dev/krtirtho/spotube/media/MediaBrowseHelper.kt b/composeApp/src/androidMain/kotlin/dev/krtirtho/spotube/media/MediaBrowseHelper.kt index 249f1808..43036c8c 100644 --- a/composeApp/src/androidMain/kotlin/dev/krtirtho/spotube/media/MediaBrowseHelper.kt +++ b/composeApp/src/androidMain/kotlin/dev/krtirtho/spotube/media/MediaBrowseHelper.kt @@ -57,6 +57,8 @@ class MediaBrowseHelper( companion object { const val MEDIA_ID_ROOT = "root" const val MEDIA_ID_BROWSE = "browse" + const val MEDIA_ID_BROWSE_GENRE = "browse:genre" + const val MEDIA_ID_BROWSE_FEATURED = "browse:featured" const val MEDIA_ID_LIBRARY = "library" const val MEDIA_ID_SAVED_PLAYLISTS = "library:playlists" const val MEDIA_ID_SAVED_ALBUMS = "library:albums" @@ -93,6 +95,11 @@ class MediaBrowseHelper( return when { parentId == MEDIA_ID_ROOT -> buildRootChildren() parentId == MEDIA_ID_BROWSE -> buildBrowseItems() + parentId == MEDIA_ID_BROWSE_FEATURED -> buildFeaturedItems() + parentId.startsWith("$MEDIA_ID_BROWSE_GENRE:") -> { + val genreId = parentId.removePrefix("$MEDIA_ID_BROWSE_GENRE:") + buildBrowseGenreItems(genreId) + } parentId == MEDIA_ID_LIBRARY -> buildLibraryRootChildren() parentId == MEDIA_ID_SAVED_PLAYLISTS -> buildSavedPlaylistsItems() parentId == MEDIA_ID_SAVED_ALBUMS -> buildSavedAlbumsItems() @@ -214,7 +221,6 @@ class MediaBrowseHelper( } private fun buildRootChildren(): List { - val gridExtras = Bundle().apply { putInt(CONTENT_STYLE_BROWSABLE, CONTENT_STYLE_GRID) } return listOf( MediaItem.Builder() .setMediaId(MEDIA_ID_BROWSE) @@ -223,7 +229,6 @@ class MediaBrowseHelper( .setTitle("Browse") .setIsBrowsable(true) .setIsPlayable(false) - .setExtras(gridExtras) .build() ) .build(), @@ -251,27 +256,67 @@ class MediaBrowseHelper( } private suspend fun buildBrowseItems(): List { + val gridExtras = Bundle().apply { putInt(CONTENT_STYLE_BROWSABLE, CONTENT_STYLE_GRID) } + val items = mutableListOf() + + items.add( + MediaItem.Builder() + .setMediaId(MEDIA_ID_BROWSE_FEATURED) + .setMediaMetadata( + MediaMetadata.Builder() + .setTitle("Featured") + .setIsBrowsable(true) + .setIsPlayable(false) + .setExtras(gridExtras) + .build() + ) + .build() + ) + + val genres = try { + homeScreenRepository.genres() ?: emptyList() + } catch (_: Exception) { + emptyList() + } + + for (genre in genres) { + items.add( + MediaItem.Builder() + .setMediaId("$MEDIA_ID_BROWSE_GENRE:${genre.id}") + .setMediaMetadata( + MediaMetadata.Builder() + .setTitle(genre.name) + .setIsBrowsable(true) + .setIsPlayable(false) + .setExtras(gridExtras) + .build() + ) + .build() + ) + } + + return items + } + + private suspend fun buildFeaturedItems(): List { val featured = try { homeScreenRepository.featuredItems() ?: emptyList() } catch (_: Exception) { emptyList() } + return featured.mapNotNull { item -> browseItemToMediaItem(item) } + } + + private suspend fun buildBrowseGenreItems(genreId: String): List { val sections = try { - homeScreenRepository.list()?.items ?: emptyList() + homeScreenRepository.list(genreId)?.items ?: emptyList() } catch (_: Exception) { emptyList() } val items = mutableListOf() - if (featured.isNotEmpty()) { - for (item in featured) { - val mediaItem = browseItemToMediaItem(item) ?: continue - items.add(mediaItem.withGroupTitle("Featured")) - } - } - for (section in sections) { for (item in section.items) { val mediaItem = browseItemToMediaItem(