From 91c4df1585d68be24c1f0c57a5e2f8f47a6a07b5 Mon Sep 17 00:00:00 2001 From: Simon Eklundh Date: Mon, 22 Sep 2025 11:11:14 +0100 Subject: [PATCH] feat: fix playback reporting (#1077) --- app/(auth)/player/direct-player.tsx | 29 +++++------------------------ hooks/usePlaybackManager.ts | 23 ++++++++--------------- 2 files changed, 13 insertions(+), 39 deletions(-) diff --git a/app/(auth)/player/direct-player.tsx b/app/(auth)/player/direct-player.tsx index ca906a78..b7681174 100644 --- a/app/(auth)/player/direct-player.tsx +++ b/app/(auth)/player/direct-player.tsx @@ -2,6 +2,7 @@ import { type BaseItemDto, type MediaSourceInfo, PlaybackOrder, + PlaybackProgressInfo, PlaybackStartInfo, RepeatMode, } from "@jellyfin/sdk/lib/generated-client"; @@ -264,12 +265,7 @@ export default function page() { if (isPlaying) { await videoRef.current?.pause(); playbackManager.reportPlaybackProgress( - item?.Id!, - msToTicks(progress.get()), - { - AudioStreamIndex: audioIndex ?? -1, - SubtitleStreamIndex: subtitleIndex ?? -1, - }, + currentPlayStateInfo() as PlaybackProgressInfo, ); } else { videoRef.current?.play(); @@ -387,12 +383,7 @@ export default function page() { if (!item?.Id) return; playbackManager.reportPlaybackProgress( - item.Id, - msToTicks(progress.get()), - { - AudioStreamIndex: audioIndex ?? -1, - SubtitleStreamIndex: subtitleIndex ?? -1, - }, + currentPlayStateInfo() as PlaybackProgressInfo, ); }, [ @@ -499,12 +490,7 @@ export default function page() { setIsPlaying(true); if (item?.Id) { playbackManager.reportPlaybackProgress( - item.Id, - msToTicks(progress.get()), - { - AudioStreamIndex: audioIndex ?? -1, - SubtitleStreamIndex: subtitleIndex ?? -1, - }, + currentPlayStateInfo() as PlaybackProgressInfo, ); } if (!Platform.isTV) await activateKeepAwakeAsync(); @@ -515,12 +501,7 @@ export default function page() { setIsPlaying(false); if (item?.Id) { playbackManager.reportPlaybackProgress( - item.Id, - msToTicks(progress.get()), - { - AudioStreamIndex: audioIndex ?? -1, - SubtitleStreamIndex: subtitleIndex ?? -1, - }, + currentPlayStateInfo() as PlaybackProgressInfo, ); } if (!Platform.isTV) await deactivateKeepAwake(); diff --git a/hooks/usePlaybackManager.ts b/hooks/usePlaybackManager.ts index 0b70752b..5ea237cf 100644 --- a/hooks/usePlaybackManager.ts +++ b/hooks/usePlaybackManager.ts @@ -1,4 +1,7 @@ -import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client"; +import type { + BaseItemDto, + PlaybackProgressInfo, +} from "@jellyfin/sdk/lib/generated-client"; import { getPlaystateApi, getTvShowsApi } from "@jellyfin/sdk/lib/utils/api"; import { useQuery } from "@tanstack/react-query"; import { useAtomValue } from "jotai"; @@ -141,13 +144,10 @@ export const usePlaybackManager = ({ * @param positionTicks The current playback position in ticks. */ const reportPlaybackProgress = async ( - itemId: string, - positionTicks: number, - metadata?: { - AudioStreamIndex: number; - SubtitleStreamIndex: number; - }, + playbackProgressInfo: PlaybackProgressInfo, ) => { + const positionTicks = playbackProgressInfo.PositionTicks || 0; + const itemId = playbackProgressInfo.ItemId!; const localItem = getDownloadedItemById(itemId); // Handle local state update for downloaded items @@ -192,14 +192,7 @@ export const usePlaybackManager = ({ if (isOnline && api) { try { await getPlaystateApi(api).reportPlaybackProgress({ - playbackProgressInfo: { - ItemId: itemId, - PositionTicks: Math.floor(positionTicks), - ...(metadata && { AudioStreamIndex: metadata.AudioStreamIndex }), - ...(metadata && { - SubtitleStreamIndex: metadata.SubtitleStreamIndex, - }), - }, + playbackProgressInfo, }); } catch (error) { console.error("Failed to report playback progress", error);