feat: /api/* library reads, search, and media endpoints #15
@@ -87,7 +87,7 @@ fun AlbumDetailScreen(
|
|||||||
albumLiked = albumLiked,
|
albumLiked = albumLiked,
|
||||||
likedTrackIds = likedTrackIds,
|
likedTrackIds = likedTrackIds,
|
||||||
onPlayAll = { viewModel.play(startTrackId = null) },
|
onPlayAll = { viewModel.play(startTrackId = null) },
|
||||||
onShuffleAll = { viewModel.play(startTrackId = null) },
|
onShuffleAll = viewModel::shuffle,
|
||||||
onTrackClick = { id -> viewModel.play(startTrackId = id) },
|
onTrackClick = { id -> viewModel.play(startTrackId = id) },
|
||||||
onToggleAlbumLike = viewModel::toggleLikeAlbum,
|
onToggleAlbumLike = viewModel::toggleLikeAlbum,
|
||||||
onToggleTrackLike = viewModel::toggleLikeTrack,
|
onToggleTrackLike = viewModel::toggleLikeTrack,
|
||||||
|
|||||||
@@ -90,6 +90,23 @@ class AlbumDetailViewModel @Inject constructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Play the album in shuffled order. Pre-shuffles the list and hands
|
||||||
|
* the result to the player — matches the PlaylistDetail shuffle
|
||||||
|
* pattern. A future refinement could use Media3's
|
||||||
|
* `setShuffleModeEnabled` for play-then-shuffle without disturbing
|
||||||
|
* the original queue ordering.
|
||||||
|
*/
|
||||||
|
fun shuffle() {
|
||||||
|
val detail = (internal.value as? AlbumDetailUiState.Success)?.detail ?: return
|
||||||
|
if (detail.tracks.isEmpty()) return
|
||||||
|
player.setQueue(
|
||||||
|
tracks = detail.tracks.shuffled(),
|
||||||
|
initialIndex = 0,
|
||||||
|
source = "album:${detail.album.id}",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun toggleLikeAlbum() {
|
fun toggleLikeAlbum() {
|
||||||
val desired = !albumLiked.value
|
val desired = !albumLiked.value
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
|
|||||||
Reference in New Issue
Block a user