From e637337effeb08fa781fbfaaad4b0cafaf1d4e16 Mon Sep 17 00:00:00 2001 From: Niels van Velzen Date: Sat, 20 Jun 2026 09:56:23 +0200 Subject: [PATCH] Store user playback position in MediaItem extras to avoid extra API call --- .../sessionbrowser/SessionBrowserCallback.kt | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/jellyfin/mobile/sessionbrowser/SessionBrowserCallback.kt b/app/src/main/java/org/jellyfin/mobile/sessionbrowser/SessionBrowserCallback.kt index b7f46fa8..59398aaa 100644 --- a/app/src/main/java/org/jellyfin/mobile/sessionbrowser/SessionBrowserCallback.kt +++ b/app/src/main/java/org/jellyfin/mobile/sessionbrowser/SessionBrowserCallback.kt @@ -54,6 +54,7 @@ class SessionBrowserCallback( ) : MediaLibrarySession.Callback { companion object { const val MAX_PAGE_SIZE = 250 + const val MEDIA_ITEM_EXTRA_START_POSITION = "start_position" } val pages = listOf( @@ -100,6 +101,9 @@ class SessionBrowserCallback( setMediaId(Json.encodeToString(LibraryMediaId.Route(action.route))) } else if (action is LibraryItemAction.Play) { setMediaId(Json.encodeToString(LibraryMediaId.Item(action.item.id, route))) + action.item.userData?.playbackPositionTicks?.ticks?.inWholeMilliseconds?.let { + extras.putLong(MEDIA_ITEM_EXTRA_START_POSITION, it) + } } setMediaMetadata( @@ -375,17 +379,17 @@ class SessionBrowserCallback( } } - var resumePositionMs = startPositionMs - val currentLibraryMediaId = expandedItems.getOrNull(newStartIndex)?.mediaId?.let { - runCatching { Json.decodeFromString(it) }.getOrNull() - } - if (currentLibraryMediaId is LibraryMediaId.Item && (startPositionMs == 0L || startPositionMs == C.TIME_UNSET)) { - val item by api.userLibraryApi.getItem(itemId = currentLibraryMediaId.itemId) - val positionMs = item.userData?.playbackPositionTicks?.ticks?.inWholeMilliseconds ?: 0L - if (positionMs > 0L) resumePositionMs = positionMs + // Use the server-side stored position if there is no requested start position + val newStartPositionMs = when (startPositionMs) { + 0L, C.TIME_UNSET -> expandedItems.firstOrNull()?.mediaMetadata?.extras?.getLong( + MEDIA_ITEM_EXTRA_START_POSITION, + startPositionMs + ) ?: startPositionMs + + else -> startPositionMs } expandedItems = onAddMediaItems(mediaSession, controller, expandedItems).await() - MediaSession.MediaItemsWithStartPosition(expandedItems, newStartIndex, resumePositionMs) + MediaSession.MediaItemsWithStartPosition(expandedItems, newStartIndex, newStartPositionMs) } }