From d9aa18c37a2ae525c247bfd42a10805ae4e276ab Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Sat, 3 Oct 2026 03:49:10 +0000 Subject: [PATCH] home: play the whole genre list from a genre song row --- .../com/subtracks/data/db/LibraryDao.kt | 15 +++++++++++++ .../subtracks/data/repo/LibraryRepository.kt | 5 +++++ .../subtracks/ui/home/HomeListViewModel.kt | 21 +++++++++++++++---- .../com/subtracks/ui/home/HomeViewModel.kt | 12 +++++++++++ .../subtracks/data/db/LibraryHomeDaoTest.kt | 1 + 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt b/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt index 54b48899..c40f066b 100644 --- a/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt +++ b/app/src/main/kotlin/com/subtracks/data/db/LibraryDao.kt @@ -726,6 +726,21 @@ interface LibraryDao { genre: String, ): PagingSource + @Query( + "SELECT songs.id FROM songs " + + "WHERE songs.sourceId = :sourceId AND (" + + "EXISTS (SELECT 1 FROM song_genres " + + "WHERE song_genres.sourceId = songs.sourceId AND song_genres.songId = songs.id " + + "AND song_genres.genre = :genre) " + + "OR (songs.genre = :genre AND NOT EXISTS (SELECT 1 FROM song_genres " + + "WHERE song_genres.sourceId = songs.sourceId AND song_genres.songId = songs.id))) " + + "ORDER BY songs.title COLLATE NOCASE, songs.id", + ) + suspend fun songsByGenreIds( + sourceId: Long, + genre: String, + ): List + @Query( "SELECT * FROM albums WHERE sourceId = :sourceId AND year >= :start AND year < :end " + "ORDER BY year DESC, name COLLATE NOCASE, id", diff --git a/app/src/main/kotlin/com/subtracks/data/repo/LibraryRepository.kt b/app/src/main/kotlin/com/subtracks/data/repo/LibraryRepository.kt index ffb83998..550bd9d4 100644 --- a/app/src/main/kotlin/com/subtracks/data/repo/LibraryRepository.kt +++ b/app/src/main/kotlin/com/subtracks/data/repo/LibraryRepository.kt @@ -95,6 +95,11 @@ class LibraryRepository( genre: String, ): Flow> = pager(60) { db.libraryDao().songsByGenre(sourceId, genre) } + suspend fun genreSongIds( + sourceId: Long, + genre: String, + ): List = db.libraryDao().songsByGenreIds(sourceId, genre) + fun albumsByDecade( sourceId: Long, decade: Long, diff --git a/app/src/main/kotlin/com/subtracks/ui/home/HomeListViewModel.kt b/app/src/main/kotlin/com/subtracks/ui/home/HomeListViewModel.kt index 83f902c1..7863aee7 100644 --- a/app/src/main/kotlin/com/subtracks/ui/home/HomeListViewModel.kt +++ b/app/src/main/kotlin/com/subtracks/ui/home/HomeListViewModel.kt @@ -111,10 +111,23 @@ class HomeListViewModel( ): CoverArtRef? = sourceRepository.coverArt(coverArt, thumbnail) fun play(song: Song) { - if (request.section == HomeSection.RecentlyStarredSongs) { - viewModelScope.playStarredList(libraryRepository, playbackController, song) - } else { - viewModelScope.playSongInContext(libraryRepository, playbackController, song) + val genre = request.genre + when { + genre != null -> { + viewModelScope.playGenreList(libraryRepository, playbackController, genre, song) + } + + request.section == HomeSection.RecentlyStarredSongs -> { + viewModelScope.playStarredList( + libraryRepository, + playbackController, + song, + ) + } + + else -> { + viewModelScope.playSongInContext(libraryRepository, playbackController, song) + } } } } diff --git a/app/src/main/kotlin/com/subtracks/ui/home/HomeViewModel.kt b/app/src/main/kotlin/com/subtracks/ui/home/HomeViewModel.kt index 3989d8fa..75e7ada3 100644 --- a/app/src/main/kotlin/com/subtracks/ui/home/HomeViewModel.kt +++ b/app/src/main/kotlin/com/subtracks/ui/home/HomeViewModel.kt @@ -173,3 +173,15 @@ internal fun CoroutineScope.playStarredList( playbackController.playSongs(song.sourceId, ids, ids.indexOf(song.id).coerceAtLeast(0)) } } + +internal fun CoroutineScope.playGenreList( + libraryRepository: LibraryRepository, + playbackController: PlaybackController, + genre: String, + song: Song, +) { + launch { + val ids = libraryRepository.genreSongIds(song.sourceId, genre) + playbackController.playSongs(song.sourceId, ids, ids.indexOf(song.id).coerceAtLeast(0)) + } +} diff --git a/app/src/test/kotlin/com/subtracks/data/db/LibraryHomeDaoTest.kt b/app/src/test/kotlin/com/subtracks/data/db/LibraryHomeDaoTest.kt index 6681fca6..cd48131a 100644 --- a/app/src/test/kotlin/com/subtracks/data/db/LibraryHomeDaoTest.kt +++ b/app/src/test/kotlin/com/subtracks/data/db/LibraryHomeDaoTest.kt @@ -182,6 +182,7 @@ class LibraryHomeDaoTest { val page = dao.songsByGenre(sourceId, "Rock").page() assertEquals(listOf("s1", "s2"), page.map { it.song.id }) assertEquals("cover-1", page.first().coverArt) + assertEquals(page.map { it.song.id }, dao.songsByGenreIds(sourceId, "Rock")) } private suspend fun insertGenre(