diff --git a/components/PlayButton.tsx b/components/PlayButton.tsx index 48ec30af..b48f6fc6 100644 --- a/components/PlayButton.tsx +++ b/components/PlayButton.tsx @@ -34,6 +34,7 @@ import { SelectedOptions } from "./ItemContent"; import { chromecastProfile } from "@/utils/profiles/chromecast"; import { useTranslation } from "react-i18next"; import { useHaptic } from "@/hooks/useHaptic"; +import { chromecastLoadMedia } from "@/utils/chromecastLoadMedia"; interface Props extends React.ComponentProps { item: BaseItemDto; @@ -140,73 +141,27 @@ export const PlayButton: React.FC = ({ return; } - client - .loadMedia({ - mediaInfo: { - contentId: item.Id, - contentUrl: data?.url, - contentType: "video/mp4", - customData: item, - metadata: - item.Type === "Episode" - ? { - type: "tvShow", - title: item.Name || "", - episodeNumber: item.IndexNumber || 0, - seasonNumber: item.ParentIndexNumber || 0, - seriesTitle: item.SeriesName || "", - images: [ - { - url: getParentBackdropImageUrl({ - api, - item, - quality: 90, - width: 2000, - })!, - }, - ], - } - : item.Type === "Movie" - ? { - type: "movie", - title: item.Name || "", - subtitle: item.Overview || "", - images: [ - { - url: getPrimaryImageUrl({ - api, - item, - quality: 90, - width: 2000, - })!, - }, - ], - } - : { - type: "generic", - title: item.Name || "", - subtitle: item.Overview || "", - images: [ - { - url: getPrimaryImageUrl({ - api, - item, - quality: 90, - width: 2000, - })!, - }, - ], - }, + chromecastLoadMedia({ + client, + item, + contentUrl: data.url, + images: [ + { + url: getParentBackdropImageUrl({ + api, + item, + quality: 90, + width: 2000, + })!, }, - startTime: 0, - }) - .then(() => { - // state is already set when reopening current media, so skip it here. - if (isOpeningCurrentlyPlayingMedia) { - return; - } - router.push("/player/google-cast-player"); - }); + ], + }).then(() => { + // state is already set when reopening current media, so skip it here. + if (isOpeningCurrentlyPlayingMedia) { + return; + } + router.push("/player/google-cast-player"); + }); } }); break; diff --git a/utils/chromecastLoadMedia.ts b/utils/chromecastLoadMedia.ts new file mode 100644 index 00000000..32c60f08 --- /dev/null +++ b/utils/chromecastLoadMedia.ts @@ -0,0 +1,47 @@ +import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client"; +import { RemoteMediaClient, WebImage } from "react-native-google-cast"; + +export function chromecastLoadMedia({ + client, + item, + contentUrl, + images, +}: { + client: RemoteMediaClient; + item: BaseItemDto; + contentUrl: string; + images: WebImage[]; +}) { + return client.loadMedia({ + mediaInfo: { + contentId: item.Id, + contentUrl, + contentType: "video/mp4", + customData: item, + metadata: + item.Type === "Episode" + ? { + type: "tvShow", + title: item.Name || "", + episodeNumber: item.IndexNumber || 0, + seasonNumber: item.ParentIndexNumber || 0, + seriesTitle: item.SeriesName || "", + images, + } + : item.Type === "Movie" + ? { + type: "movie", + title: item.Name || "", + subtitle: item.Overview || "", + images, + } + : { + type: "generic", + title: item.Name || "", + subtitle: item.Overview || "", + images, + }, + }, + startTime: 0, + }); +}