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); } };