From cd7bc201c0c79923383efcec7f098ebf1cbb180f Mon Sep 17 00:00:00 2001 From: Lance Chant <13349722+lancechant@users.noreply.github.com> Date: Wed, 3 Jun 2026 09:51:22 +0200 Subject: [PATCH] fix player reporting when exiting and app splash load MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed an issue where the playback would continue when the player was exited Fixed an issue where the splash screen would take forever to load when server is not reachable tested with 192.0.2.1 documentation IP (RFC 5737) — packets to it are silently dropped by routers Signed-off-by: Lance Chant <13349722+lancechant@users.noreply.github.com> --- app/(auth)/player/direct-player.tsx | 25 ++++------ providers/JellyfinProvider.tsx | 72 ++++++++++++++++------------- 2 files changed, 51 insertions(+), 46 deletions(-) diff --git a/app/(auth)/player/direct-player.tsx b/app/(auth)/player/direct-player.tsx index 594e2fae9..2b269991b 100644 --- a/app/(auth)/player/direct-player.tsx +++ b/app/(auth)/player/direct-player.tsx @@ -439,21 +439,15 @@ export default function DirectPlayerPage() { if (!item?.Id || !stream?.sessionId || offline || !api) return; const currentTimeInTicks = msToTicks(progress.get()); - await getPlaystateApi(api).onPlaybackStopped({ - itemId: item.Id, - mediaSourceId: mediaSourceId, - positionTicks: currentTimeInTicks, - playSessionId: stream.sessionId, + await getPlaystateApi(api).reportPlaybackStopped({ + playbackStopInfo: { + ItemId: item.Id, + MediaSourceId: mediaSourceId, + PositionTicks: currentTimeInTicks, + PlaySessionId: stream.sessionId, + }, }); - }, [ - api, - item, - mediaSourceId, - stream, - progress, - offline, - revalidateProgressCache, - ]); + }, [api, item, mediaSourceId, stream, progress, offline]); const stop = useCallback(() => { // Update URL with final playback position before stopping @@ -471,9 +465,10 @@ export default function DirectPlayerPage() { useEffect(() => { const beforeRemoveListener = navigation.addListener("beforeRemove", stop); return () => { + reportPlaybackStopped(); beforeRemoveListener(); }; - }, [navigation, stop]); + }, [navigation, stop, reportPlaybackStopped]); const currentPlayStateInfo = useCallback((): | PlaybackProgressInfo diff --git a/providers/JellyfinProvider.tsx b/providers/JellyfinProvider.tsx index 8608222b8..185c306c7 100644 --- a/providers/JellyfinProvider.tsx +++ b/providers/JellyfinProvider.tsx @@ -619,44 +619,54 @@ export const JellyfinProvider: React.FC<{ children: ReactNode }> = ({ setUser(storedUser); } - const response = await getUserApi(apiInstance).getCurrentUser(); - setUser(response.data); + // Dismiss splash screen with cached data immediately, + // fetch fresh user data in the background + setInitialLoaded(true); - // Migrate current session to secure storage if not already saved - if (storedUser?.Id && storedUser?.Name) { - const existingCredential = await getAccountCredential( - serverUrl, - storedUser.Id, - ); - if (!existingCredential) { - await saveAccountCredential({ + try { + const response = await getUserApi(apiInstance).getCurrentUser(); + setUser(response.data); + + // Migrate current session to secure storage if not already saved + if (storedUser?.Id && storedUser?.Name) { + const existingCredential = await getAccountCredential( serverUrl, - serverName: "", - token, - userId: storedUser.Id, - username: storedUser.Name, - savedAt: Date.now(), - securityType: "none", - primaryImageTag: response.data.PrimaryImageTag ?? undefined, - }); - } else if ( - response.data.PrimaryImageTag !== - existingCredential.primaryImageTag - ) { - // Update image tag if it has changed - addAccountToServer(serverUrl, existingCredential.serverName, { - userId: existingCredential.userId, - username: existingCredential.username, - securityType: existingCredential.securityType, - savedAt: existingCredential.savedAt, - primaryImageTag: response.data.PrimaryImageTag ?? undefined, - }); + storedUser.Id, + ); + if (!existingCredential) { + await saveAccountCredential({ + serverUrl, + serverName: "", + token, + userId: storedUser.Id, + username: storedUser.Name, + savedAt: Date.now(), + securityType: "none", + primaryImageTag: response.data.PrimaryImageTag ?? undefined, + }); + } else if ( + response.data.PrimaryImageTag !== + existingCredential.primaryImageTag + ) { + // Update image tag if it has changed + addAccountToServer(serverUrl, existingCredential.serverName, { + userId: existingCredential.userId, + username: existingCredential.username, + securityType: existingCredential.securityType, + savedAt: existingCredential.savedAt, + primaryImageTag: response.data.PrimaryImageTag ?? undefined, + }); + } } + } catch (e) { + // Background fetch failed — app already rendered with cached data + console.warn("Background user fetch failed, using cached data:", e); } + } else { + setInitialLoaded(true); } } catch (e) { console.error(e); - } finally { setInitialLoaded(true); } };