Change backdrop periodically

This commit is contained in:
Damontecres 2026-03-15 08:43:05 -04:00
parent 48a933136f
commit 3e043d5118
No known key found for this signature in database

View file

@ -30,8 +30,10 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
@ -47,8 +49,10 @@ import org.jellyfin.sdk.model.api.LyricDto
import org.jellyfin.sdk.model.extensions.ticks import org.jellyfin.sdk.model.extensions.ticks
import timber.log.Timber import timber.log.Timber
import java.util.UUID import java.util.UUID
import kotlin.random.Random
import kotlin.time.Duration import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.seconds
@UnstableApi @UnstableApi
@HiltViewModel(assistedFactory = NowPlayingViewModel.Factory::class) @HiltViewModel(assistedFactory = NowPlayingViewModel.Factory::class)
@ -209,16 +213,22 @@ class NowPlayingViewModel
} }
} }
private var backDropJob: Job? = null
private fun updateBackdrop(audio: AudioItem?) { private fun updateBackdrop(audio: AudioItem?) {
backDropJob?.cancel()
backDropJob =
viewModelScope.launchDefault { viewModelScope.launchDefault {
val showBackdrop = val showBackdrop =
userPreferencesService userPreferencesService
.getCurrent() .getCurrent()
.appPreferences.musicPreferences.showBackdrop .appPreferences.musicPreferences.showBackdrop
if (audio?.albumId != null && showBackdrop) { if (showBackdrop) {
if (audio?.albumId != null) {
try { try {
api.userLibraryApi.getItem(audio.albumId).content.let { api.userLibraryApi.getItem(audio.albumId).content.let {
val backdropItem = getBackdropItemForAlbum(api, BaseItem(it, false)) val backdropItem =
getBackdropItemForAlbum(api, BaseItem(it, false))
if (backdropItem != null) { if (backdropItem != null) {
backdropService.submit(backdropItem) backdropService.submit(backdropItem)
} else { } else {
@ -232,6 +242,18 @@ class NowPlayingViewModel
} else { } else {
backdropService.clearBackdrop() backdropService.clearBackdrop()
} }
// TODO needs smoother transition
delay(60.seconds)
try {
val index = Random.nextInt(state.value.musicServiceState.queueSize)
val newAudio =
onMain { player.getMediaItemAt(index) }.localConfiguration?.tag as? AudioItem
updateBackdrop(newAudio)
} catch (_: CancellationException) {
} catch (ex: Exception) {
Timber.w(ex, "Error getting random audio")
}
}
} }
} }