diff --git a/components/PlayButton.tsx b/components/PlayButton.tsx index a162525f..9d296216 100644 --- a/components/PlayButton.tsx +++ b/components/PlayButton.tsx @@ -9,6 +9,7 @@ import { useTranslation } from "react-i18next"; import { Alert, Platform, TouchableOpacity, View } from "react-native"; import CastContext, { CastButton, + MediaStreamType, PlayServicesState, useMediaStatus, useRemoteMediaClient, @@ -185,11 +186,23 @@ export const PlayButton: React.FC = ({ return; } + // Calculate start time in seconds from playback position + const startTimeSeconds = + (item?.UserData?.PlaybackPositionTicks ?? 0) / 10000000; + + // Calculate stream duration in seconds from runtime + const streamDurationSeconds = item.RunTimeTicks + ? item.RunTimeTicks / 10000000 + : undefined; + client .loadMedia({ mediaInfo: { + contentId: item.Id, contentUrl: data?.url, contentType: "video/mp4", + streamType: MediaStreamType.BUFFERED, + streamDuration: streamDurationSeconds, metadata: item.Type === "Episode" ? { @@ -241,7 +254,7 @@ export const PlayButton: React.FC = ({ ], }, }, - startTime: 0, + startTime: startTimeSeconds, }) .then(() => { // state is already set when reopening current media, so skip it here. diff --git a/hooks/useMusicCast.ts b/hooks/useMusicCast.ts index 4e31c19e..2352a610 100644 --- a/hooks/useMusicCast.ts +++ b/hooks/useMusicCast.ts @@ -3,6 +3,7 @@ import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; import { useCallback } from "react"; import CastContext, { CastState, + MediaStreamType, PlayServicesState, useCastState, useRemoteMediaClient, @@ -82,10 +83,18 @@ export const useMusicCast = ({ api, userId }: UseMusicCastOptions) => { streamResult.mediaSource?.Container, ); + // Calculate stream duration in seconds from runtime ticks + const streamDurationSeconds = track.RunTimeTicks + ? track.RunTimeTicks / 10000000 + : undefined; + return { mediaInfo: { + contentId: track.Id, contentUrl: streamResult.url, contentType, + streamType: MediaStreamType.BUFFERED, + streamDuration: streamDurationSeconds, metadata: { type: "musicTrack" as const, title: track.Name || "Unknown Track",