diff --git a/apps/expo/src/components/player/ScraperProcess.tsx b/apps/expo/src/components/player/ScraperProcess.tsx index fe0d720..350edc4 100644 --- a/apps/expo/src/components/player/ScraperProcess.tsx +++ b/apps/expo/src/components/player/ScraperProcess.tsx @@ -11,6 +11,7 @@ import { import { fetchMediaDetails, fetchSeasonDetails } from "@movie-web/tmdb"; import type { ItemData } from "../item/item"; +import type { AudioTrack } from "~/stores/player/slices/interface"; import { PlayerStatus } from "~/stores/player/slices/interface"; import { usePlayerStore } from "~/stores/player/store"; import { Text } from "../ui/Text"; @@ -26,6 +27,7 @@ export const ScraperProcess = ({ data }: ScraperProcessProps) => { const setStream = usePlayerStore((state) => state.setCurrentStream); const setSeasonData = usePlayerStore((state) => state.setSeasonData); const setHlsTracks = usePlayerStore((state) => state.setHlsTracks); + const setAudioTracks = usePlayerStore((state) => state.setAudioTracks); const setPlayerStatus = usePlayerStore((state) => state.setPlayerStatus); const setSourceId = usePlayerStore((state) => state.setSourceId); const setMeta = usePlayerStore((state) => state.setMeta); @@ -99,6 +101,16 @@ export const ScraperProcess = ({ data }: ScraperProcessProps) => { }, ); if (tracks) setHlsTracks(tracks); + + if (tracks?.audio.length) { + const audioTracks: AudioTrack[] = tracks.audio.map((track) => ({ + uri: track.uri, + name: (track.properties[0]?.attributes.name as string) ?? "Unknown", + language: + (track.properties[0]?.attributes.language as string) ?? "Unknown", + })); + setAudioTracks(audioTracks); + } } setPlayerStatus(PlayerStatus.READY); setSourceId(streamResult.sourceId); @@ -115,6 +127,7 @@ export const ScraperProcess = ({ data }: ScraperProcessProps) => { setMeta, meta?.season?.number, meta?.episode?.number, + setAudioTracks, ]); return ( diff --git a/apps/expo/src/stores/player/slices/interface.ts b/apps/expo/src/stores/player/slices/interface.ts index ba3f4c7..e78db2f 100644 --- a/apps/expo/src/stores/player/slices/interface.ts +++ b/apps/expo/src/stores/player/slices/interface.ts @@ -9,6 +9,12 @@ export enum PlayerStatus { READY, } +export interface AudioTrack { + uri: string; + name: string; + language: string; +} + export interface InterfaceSlice { interface: { isIdle: boolean; @@ -20,6 +26,7 @@ export interface InterfaceSlice { seasonData: SeasonDetails | null; selectedCaption: Stream["captions"][0] | null; hlsTracks: HLSTracks | null; + audioTracks: AudioTrack[] | null; playerStatus: PlayerStatus; }; setIsIdle(state: boolean): void; @@ -29,6 +36,7 @@ export interface InterfaceSlice { setData(data: ItemData): void; setSeasonData(data: SeasonDetails): void; setHlsTracks(tracks: HLSTracks): void; + setAudioTracks(tracks: AudioTrack[]): void; setPlayerStatus(status: PlayerStatus): void; reset: () => void; } @@ -44,6 +52,7 @@ export const createInterfaceSlice: MakeSlice = (set, get) => ({ seasonData: null, selectedCaption: null, hlsTracks: null, + audioTracks: null, playerStatus: PlayerStatus.SCRAPING, }, setIsIdle: (state) => { @@ -91,6 +100,11 @@ export const createInterfaceSlice: MakeSlice = (set, get) => ({ s.interface.hlsTracks = tracks; }); }, + setAudioTracks: (tracks) => { + set((s) => { + s.interface.audioTracks = tracks; + }); + }, setPlayerStatus: (status) => { set((s) => { s.interface.playerStatus = status; @@ -108,6 +122,7 @@ export const createInterfaceSlice: MakeSlice = (set, get) => ({ seasonData: null, selectedCaption: null, hlsTracks: null, + audioTracks: null, playerStatus: PlayerStatus.SCRAPING, }, }));