fix: playback reporting

This commit is contained in:
sarendsen
2025-02-24 09:30:14 +01:00
parent f64c5a02db
commit 89bf51c3cc

View File

@@ -29,7 +29,12 @@ import { useSharedValue } from "react-native-reanimated";
import { useSettings } from "@/utils/atoms/settings"; import { useSettings } from "@/utils/atoms/settings";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useSafeAreaInsets } from "react-native-safe-area-context";
import { BaseItemDto, MediaSourceInfo } from "@jellyfin/sdk/lib/generated-client"; import {
BaseItemDto,
MediaSourceInfo,
PlaybackProgressInfo,
PlaybackStartInfo,
} from "@jellyfin/sdk/lib/generated-client";
export default function page() { export default function page() {
const videoRef = useRef<VlcPlayerViewRef>(null); const videoRef = useRef<VlcPlayerViewRef>(null);
@@ -212,6 +217,19 @@ export default function page() {
}; };
}, [navigation, stop]); }, [navigation, stop]);
const currentPlayStateInfo = () => {
return {
itemId: item?.Id!,
audioStreamIndex: audioIndex ? audioIndex : undefined,
subtitleStreamIndex: subtitleIndex ? subtitleIndex : undefined,
mediaSourceId: mediaSourceId,
positionTicks: msToTicks(progress.get()),
isPaused: !isPlaying,
playMethod: stream?.url.includes("m3u8") ? "Transcode" : "DirectStream",
playSessionId: stream.sessionId,
};
};
const onProgress = useCallback( const onProgress = useCallback(
async (data: ProgressUpdatePayload) => { async (data: ProgressUpdatePayload) => {
if (isSeeking.get() || isPlaybackStopped) return; if (isSeeking.get() || isPlaybackStopped) return;
@@ -225,20 +243,9 @@ export default function page() {
if (offline) return; if (offline) return;
const currentTimeInTicks = msToTicks(currentTime);
if (!item?.Id || !stream) return; if (!item?.Id || !stream) return;
await getPlaystateApi(api!).onPlaybackProgress({ changePlaybackState();
itemId: item.Id,
audioStreamIndex: audioIndex ? audioIndex : undefined,
subtitleStreamIndex: subtitleIndex ? subtitleIndex : undefined,
mediaSourceId: mediaSourceId,
positionTicks: Math.floor(currentTimeInTicks),
isPaused: !isPlaying,
playMethod: stream?.url.includes("m3u8") ? "Transcode" : "DirectStream",
playSessionId: stream.sessionId,
});
}, },
[item?.Id, audioIndex, subtitleIndex, mediaSourceId, isPlaying, stream, isSeeking, isPlaybackStopped, isBuffering] [item?.Id, audioIndex, subtitleIndex, mediaSourceId, isPlaying, stream, isSeeking, isPlaybackStopped, isBuffering]
); );
@@ -248,22 +255,12 @@ export default function page() {
setIsPipStarted(pipStarted); setIsPipStarted(pipStarted);
}, []); }, []);
const changePlaybackState = useCallback( const changePlaybackState = useCallback(async () => {
async (isPlaying: boolean) => { if (!api || offline || !stream) return;
if (!api || offline || !stream) return; await getPlaystateApi(api).reportPlaybackProgress({
await getPlaystateApi(api).onPlaybackProgress({ playbackProgressInfo: currentPlayStateInfo() as PlaybackProgressInfo,
itemId: item?.Id!, });
audioStreamIndex: audioIndex ? audioIndex : undefined, }, [api, offline, stream, item?.Id, audioIndex, subtitleIndex, mediaSourceId, progress]);
subtitleStreamIndex: subtitleIndex ? subtitleIndex : undefined,
mediaSourceId: mediaSourceId,
positionTicks: msToTicks(progress.get()),
isPaused: !isPlaying,
playMethod: stream?.url.includes("m3u8") ? "Transcode" : "DirectStream",
playSessionId: stream.sessionId,
});
},
[api, offline, stream, item?.Id, audioIndex, subtitleIndex, mediaSourceId, progress]
);
const startPosition = useMemo(() => { const startPosition = useMemo(() => {
if (offline) return 0; if (offline) return 0;
@@ -272,14 +269,7 @@ export default function page() {
const reportPlaybackStart = useCallback(async () => { const reportPlaybackStart = useCallback(async () => {
if (offline || !stream) return; if (offline || !stream) return;
await getPlaystateApi(api!).onPlaybackStart({ await getPlaystateApi(api!).reportPlaybackStart({ playbackStartInfo: currentPlayStateInfo() as PlaybackStartInfo });
itemId: item?.Id!,
audioStreamIndex: audioIndex ? audioIndex : undefined,
subtitleStreamIndex: subtitleIndex ? subtitleIndex : undefined,
mediaSourceId: mediaSourceId,
playMethod: stream.url?.includes("m3u8") ? "Transcode" : "DirectStream",
playSessionId: stream?.sessionId ? stream?.sessionId : undefined,
});
hasReportedRef.current = true; hasReportedRef.current = true;
}, [api, item, stream]); }, [api, item, stream]);
@@ -304,14 +294,14 @@ export default function page() {
if (state === "Playing") { if (state === "Playing") {
setIsPlaying(true); setIsPlaying(true);
await changePlaybackState(true); await changePlaybackState();
if (!Platform.isTV) await activateKeepAwakeAsync(); if (!Platform.isTV) await activateKeepAwakeAsync();
return; return;
} }
if (state === "Paused") { if (state === "Paused") {
setIsPlaying(false); setIsPlaying(false);
await changePlaybackState(false); await changePlaybackState();
if (!Platform.isTV) await deactivateKeepAwake(); if (!Platform.isTV) await deactivateKeepAwake();
return; return;
} }