From ec1300c6d6eae8c4710ca3d550e33cadcfa219b8 Mon Sep 17 00:00:00 2001 From: Adrian Castro <22133246+castdrian@users.noreply.github.com> Date: Sun, 18 Feb 2024 12:22:07 +0100 Subject: [PATCH] feat: source selection & ugly source selector --- apps/expo/src/app/videoPlayer/index.tsx | 6 +- apps/expo/src/app/videoPlayer/loading.tsx | 14 ++++- .../src/components/player/BottomControls.tsx | 2 + .../src/components/player/SourceSelector.tsx | 59 +++++++++++++++++++ .../src/stores/player/slices/interface.ts | 17 ++++++ packages/provider-utils/src/index.ts | 2 + packages/provider-utils/src/video.ts | 18 +++++- 7 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 apps/expo/src/components/player/SourceSelector.tsx diff --git a/apps/expo/src/app/videoPlayer/index.tsx b/apps/expo/src/app/videoPlayer/index.tsx index ee41c47..6bda58b 100644 --- a/apps/expo/src/app/videoPlayer/index.tsx +++ b/apps/expo/src/app/videoPlayer/index.tsx @@ -38,6 +38,7 @@ export default function VideoPlayerWrapper() { } export interface VideoPlayerData { + sourceId?: string; item: ItemData; stream: Stream; media: ScrapeMedia; @@ -75,6 +76,8 @@ const VideoPlayer: React.FC = ({ data }) => { const setVideoRef = usePlayerStore((state) => state.setVideoRef); const setStatus = usePlayerStore((state) => state.setStatus); const setIsIdle = usePlayerStore((state) => state.setIsIdle); + const _setSourceId = usePlayerStore((state) => state.setSourceId); + const setData = usePlayerStore((state) => state.setData); const presentFullscreenPlayer = usePlayerStore( (state) => state.presentFullscreenPlayer, ); @@ -157,7 +160,7 @@ const VideoPlayer: React.FC = ({ data }) => { if (Platform.OS === "android") { await NavigationBar.setVisibilityAsync("hidden"); } - + setData(data.item); setIsLoading(true); const { item, stream, media } = data; @@ -215,6 +218,7 @@ const VideoPlayer: React.FC = ({ data }) => { dismissFullscreenPlayer, presentFullscreenPlayer, router, + setData, setStream, ]); diff --git a/apps/expo/src/app/videoPlayer/loading.tsx b/apps/expo/src/app/videoPlayer/loading.tsx index f6f2c13..c05c149 100644 --- a/apps/expo/src/app/videoPlayer/loading.tsx +++ b/apps/expo/src/app/videoPlayer/loading.tsx @@ -21,13 +21,20 @@ interface Event { export default function LoadingScreenWrapper() { const params = useLocalSearchParams(); + const sourceId = params.sourceID?.[0]; const data = params.data ? (JSON.parse(params.data as string) as ItemData) : null; - return ; + return ; } -function LoadingScreen({ data }: { data: ItemData | null }) { +function LoadingScreen({ + sourceId, + data, +}: { + sourceId: string | undefined; + data: ItemData | null; +}) { const router = useRouter(); const [eventLog, setEventLog] = useState([]); @@ -65,6 +72,7 @@ function LoadingScreen({ data }: { data: ItemData | null }) { ); const stream = await getVideoStream({ + sourceId, media: scrapeMedia, onEvent: handleEvent, }).catch(() => null); @@ -92,7 +100,7 @@ function LoadingScreen({ data }: { data: ItemData | null }) { }; void initialize(); - }, [data, router]); + }, [data, router, sourceId]); return ( { @@ -53,6 +54,7 @@ export const BottomControls = () => { + diff --git a/apps/expo/src/components/player/SourceSelector.tsx b/apps/expo/src/components/player/SourceSelector.tsx new file mode 100644 index 0000000..5390b60 --- /dev/null +++ b/apps/expo/src/components/player/SourceSelector.tsx @@ -0,0 +1,59 @@ +import { ScrollView, View } from "react-native"; +import Modal from "react-native-modal"; +import { useRouter } from "expo-router"; +import { MaterialCommunityIcons } from "@expo/vector-icons"; + +import { getBuiltinSources } from "@movie-web/provider-utils"; +import colors from "@movie-web/tailwind-config/colors"; + +import { useBoolean } from "~/hooks/useBoolean"; +import { usePlayerStore } from "~/stores/player/store"; +import { Button } from "../ui/Button"; +import { Text } from "../ui/Text"; + +export const SourceSelector = () => { + const data = usePlayerStore((state) => state.interface.data); + const { isTrue, on, off } = useBoolean(); + const router = useRouter(); + + return ( + +