@@ -59,6 +59,8 @@ import androidx.media3.common.Rating
5959import androidx.media3.common.Timeline
6060import androidx.media3.common.TrackSelectionParameters
6161import androidx.media3.common.Tracks
62+ import coil3.size.Precision
63+ import org.akanework.gramophone.BuildConfig
6264import androidx.media3.common.util.BitmapLoader
6365import androidx.media3.common.util.Log
6466import androidx.media3.common.util.Util.isBitmapFactorySupportedMimeType
@@ -160,12 +162,50 @@ class GramophonePlaybackService : MediaLibraryService(), MediaSessionService.Lis
160162 val endedWorkaroundPlayer
161163 get() = internalPlayer
162164
165+ private val pendingArtworkUrls = hashSetOf<String >()
166+
163167 private lateinit var libraryTreeLoader: LibraryTreeLoader
164168
165169 private fun convertMetadata (metadata : MediaMetadata ): MediaMetadata {
166170 val artworkUri = metadata.artworkUri ? : return metadata
167171 val providerUri = ArtResolver .toProviderUri(artworkUri) ? : return metadata
168- return metadata.buildUpon().setArtworkUri(providerUri).build()
172+ val builder = metadata.buildUpon().setArtworkUri(providerUri)
173+ if (metadata.artworkData != null ) {
174+ return builder.build()
175+ }
176+ val cacheKey = artworkUri.toString()
177+ synchronized(pendingArtworkUrls) {
178+ if (pendingArtworkUrls.add(cacheKey)) {
179+ scope.launch {
180+ try {
181+ val bytes = ArtUtils .getResizedArtworkBytes(this @GramophonePlaybackService, artworkUri, 512 )
182+ if (bytes != null ) {
183+ withContext(Dispatchers .Main ) {
184+ val player = endedWorkaroundPlayer
185+ if (player != null ) {
186+ val currentIndex = player.currentMediaItemIndex
187+ val currentItem = player.getCurrentMediaItem()
188+ if (currentItem != null && currentItem.mediaMetadata.artworkUri == artworkUri) {
189+ val newMetadata = currentItem.mediaMetadata.buildUpon()
190+ .setArtworkData(bytes, MediaMetadata .PICTURE_TYPE_FRONT_COVER )
191+ .build()
192+ val newMediaItem = currentItem.buildUpon()
193+ .setMediaMetadata(newMetadata)
194+ .build()
195+ player.replaceMediaItem(currentIndex, newMediaItem)
196+ }
197+ }
198+ }
199+ }
200+ } finally {
201+ synchronized(pendingArtworkUrls) {
202+ pendingArtworkUrls.remove(cacheKey)
203+ }
204+ }
205+ }
206+ }
207+ }
208+ return builder.build()
169209 }
170210
171211 private fun convertItem (item : MediaItem ): MediaItem {
@@ -458,6 +498,7 @@ class GramophonePlaybackService : MediaLibraryService(), MediaSessionService.Lis
458498 .data(data)
459499 .memoryCacheKey(data.hashCode().toString())
460500 .size(limit, limit)
501+ .precision(Precision .INEXACT )
461502 .allowHardware(false )
462503 .target(
463504 onStart = { _ ->
@@ -495,6 +536,7 @@ class GramophonePlaybackService : MediaLibraryService(), MediaSessionService.Lis
495536 ImageRequest .Builder (this @GramophonePlaybackService)
496537 .data(uri)
497538 .size(limit, limit)
539+ .precision(Precision .INEXACT )
498540 .allowHardware(false )
499541 .target(
500542 onStart = { _ ->
0 commit comments