fix: casting full album/playlist working as intended, passing metadata for album artwork in small square #16

This commit is contained in:
eddyizm 2025-08-31 20:24:48 -07:00
parent 4740028a44
commit cf7feacdc0
No known key found for this signature in database
GPG key ID: CF5F671829E8158A
2 changed files with 140 additions and 72 deletions

View file

@ -199,8 +199,19 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
.build()
}
private fun getQueueFromPlayer(player: Player): List<MediaItem> {
// Helper function to get all media items from a player's queue.
val queue = mutableListOf<MediaItem>()
for (i in 0 until player.mediaItemCount) {
queue.add(player.getMediaItemAt(i))
}
return queue
}
private fun setPlayer(oldPlayer: Player?, newPlayer: Player) {
// Safely switches the player instance and handles state transfer.
if (oldPlayer === newPlayer) return
oldPlayer?.stop()
mediaLibrarySession.player = newPlayer
}
@ -211,7 +222,6 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
player.release()
mediaLibrarySession.release()
automotiveRepository.deleteMetadata()
clearListener()
}
private fun getRenderersFactory() = DownloadUtil.buildRenderersFactory(this, false)
@ -220,10 +230,34 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
DefaultMediaSourceFactory(this).setDataSourceFactory(DownloadUtil.getDataSourceFactory(this))
override fun onCastSessionAvailable() {
// Get the current queue, item index, and position from the local player.
val currentQueue = getQueueFromPlayer(player)
val currentIndex = player.currentMediaItemIndex
val currentPosition = player.currentPosition
val isPlaying = player.playWhenReady
// Switch the player to the CastPlayer.
setPlayer(player, castPlayer)
// Transfer the entire queue to the CastPlayer and start playback.
castPlayer.setMediaItems(currentQueue, currentIndex, currentPosition)
castPlayer.playWhenReady = isPlaying
castPlayer.prepare()
}
override fun onCastSessionUnavailable() {
// Get the current queue, item index, and position from the CastPlayer.
val currentQueue = getQueueFromPlayer(castPlayer)
val currentIndex = castPlayer.currentMediaItemIndex
val currentPosition = castPlayer.currentPosition
val isPlaying = castPlayer.playWhenReady
// Switch the player back to the local ExoPlayer.
setPlayer(castPlayer, player)
// Transfer the entire queue to the local ExoPlayer and start playback.
player.setMediaItems(currentQueue, currentIndex, currentPosition)
player.playWhenReady = isPlaying
player.prepare()
}
}

View file

@ -199,8 +199,19 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
.build()
}
private fun getQueueFromPlayer(player: Player): List<MediaItem> {
// Helper function to get all media items from a player's queue.
val queue = mutableListOf<MediaItem>()
for (i in 0 until player.mediaItemCount) {
queue.add(player.getMediaItemAt(i))
}
return queue
}
private fun setPlayer(oldPlayer: Player?, newPlayer: Player) {
// Safely switches the player instance and handles state transfer.
if (oldPlayer === newPlayer) return
oldPlayer?.stop()
mediaLibrarySession.player = newPlayer
}
@ -211,7 +222,6 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
player.release()
mediaLibrarySession.release()
automotiveRepository.deleteMetadata()
clearListener()
}
private fun getRenderersFactory() = DownloadUtil.buildRenderersFactory(this, false)
@ -220,10 +230,34 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
DefaultMediaSourceFactory(this).setDataSourceFactory(DownloadUtil.getDataSourceFactory(this))
override fun onCastSessionAvailable() {
// Get the current queue, item index, and position from the local player.
val currentQueue = getQueueFromPlayer(player)
val currentIndex = player.currentMediaItemIndex
val currentPosition = player.currentPosition
val isPlaying = player.playWhenReady
// Switch the player to the CastPlayer.
setPlayer(player, castPlayer)
// Transfer the entire queue to the CastPlayer and start playback.
castPlayer.setMediaItems(currentQueue, currentIndex, currentPosition)
castPlayer.playWhenReady = isPlaying
castPlayer.prepare()
}
override fun onCastSessionUnavailable() {
// Get the current queue, item index, and position from the CastPlayer.
val currentQueue = getQueueFromPlayer(castPlayer)
val currentIndex = castPlayer.currentMediaItemIndex
val currentPosition = castPlayer.currentPosition
val isPlaying = castPlayer.playWhenReady
// Switch the player back to the local ExoPlayer.
setPlayer(castPlayer, player)
// Transfer the entire queue to the local ExoPlayer and start playback.
player.setMediaItems(currentQueue, currentIndex, currentPosition)
player.playWhenReady = isPlaying
player.prepare()
}
}