Backdrop changes

This commit is contained in:
Damontecres 2026-03-21 15:03:02 -04:00
parent 2b6c4eafb3
commit 99bddea295
No known key found for this signature in database
2 changed files with 44 additions and 28 deletions

View file

@ -33,7 +33,7 @@ import kotlin.time.Duration
@Stable @Stable
data class BaseItem( data class BaseItem(
val data: BaseItemDto, val data: BaseItemDto,
val useSeriesForPrimary: Boolean, val useSeriesForPrimary: Boolean = false,
val imageUrlOverride: String? = null, val imageUrlOverride: String? = null,
val destinationOverride: Destination? = null, val destinationOverride: Destination? = null,
) : CardGridItem { ) : CardGridItem {

View file

@ -32,7 +32,6 @@ 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.Job
@ -45,14 +44,16 @@ import kotlinx.coroutines.isActive
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import org.jellyfin.sdk.api.client.ApiClient import org.jellyfin.sdk.api.client.ApiClient
import org.jellyfin.sdk.api.client.extensions.itemsApi
import org.jellyfin.sdk.api.client.extensions.lyricsApi import org.jellyfin.sdk.api.client.extensions.lyricsApi
import org.jellyfin.sdk.api.client.extensions.userLibraryApi import org.jellyfin.sdk.api.client.extensions.userLibraryApi
import org.jellyfin.sdk.model.api.BaseItemKind
import org.jellyfin.sdk.model.api.ImageType import org.jellyfin.sdk.model.api.ImageType
import org.jellyfin.sdk.model.api.ItemSortBy
import org.jellyfin.sdk.model.api.LyricDto 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 import kotlin.time.Duration.Companion.seconds
@ -99,7 +100,6 @@ class NowPlayingViewModel
init { init {
player.addListener(this) player.addListener(this)
addCloseable { addCloseable {
player.removeListener(this) player.removeListener(this)
visualizer?.release() visualizer?.release()
@ -229,36 +229,52 @@ class NowPlayingViewModel
.getCurrent() .getCurrent()
.appPreferences.musicPreferences.showBackdrop .appPreferences.musicPreferences.showBackdrop
if (showBackdrop) { if (showBackdrop) {
if (audio?.albumId != null) { var backdropItem: BaseItem? = null
try { try {
if (audio?.artistId != null) {
api.userLibraryApi.getItem(audio.artistId).content.let {
if (it.backdropImageTags?.isNotEmpty() == true) {
backdropItem = BaseItem(it, false)
}
}
}
if (backdropItem == null && audio?.albumId != null) {
api.userLibraryApi.getItem(audio.albumId).content.let { api.userLibraryApi.getItem(audio.albumId).content.let {
val backdropItem = backdropItem =
getBackdropItemForAlbum(api, BaseItem(it, false)) getBackdropItemForAlbum(api, BaseItem(it, false))
}
}
if (backdropItem != null) { if (backdropItem != null) {
doUpdateBackdrop(backdropItem) doUpdateBackdrop(backdropItem)
} else { } else {
clearBackdrop() doUpdateBackdropRandom()
}
} }
} catch (ex: Exception) { } catch (ex: Exception) {
Timber.e(ex, "Error fetching backdrop") Timber.e(ex, "Error fetching backdrop")
clearBackdrop() doUpdateBackdropRandom()
}
} else {
clearBackdrop()
} }
delay(60.seconds) delay(60.seconds)
try { doUpdateBackdropRandom()
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")
} }
} }
} }
private suspend fun doUpdateBackdropRandom() {
val randomArtist =
api.itemsApi
.getItems(
recursive = true,
imageTypes = listOf(ImageType.BACKDROP),
includeItemTypes = listOf(BaseItemKind.MUSIC_ARTIST),
sortBy = listOf(ItemSortBy.RANDOM),
limit = 1,
).content.items
.firstOrNull()
if (randomArtist != null) {
doUpdateBackdrop(BaseItem(randomArtist))
} else {
clearBackdrop()
}
} }
private suspend fun doUpdateBackdrop(item: BaseItem) { private suspend fun doUpdateBackdrop(item: BaseItem) {
@ -337,7 +353,7 @@ class NowPlayingViewModel
if (prefs.musicPreferences.showBackdrop) { if (prefs.musicPreferences.showBackdrop) {
updateBackdrop(getCurrent()) updateBackdrop(getCurrent())
} else { } else {
backdropService.clearBackdrop() clearBackdrop()
} }
} }
} }