From acb148547a3145834930ee6204a8b2aee032716c Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Tue, 6 Feb 2024 14:30:41 -0700 Subject: [PATCH] Break out live page --- web/src/components/player/LivePlayer.tsx | 48 ++++- web/src/components/player/WebRTCPlayer.tsx | 3 + web/src/pages/Live.tsx | 193 ++++++--------------- web/vite.config.ts | 12 +- 4 files changed, 108 insertions(+), 148 deletions(-) diff --git a/web/src/components/player/LivePlayer.tsx b/web/src/components/player/LivePlayer.tsx index d8835f47b..44f3cf975 100644 --- a/web/src/components/player/LivePlayer.tsx +++ b/web/src/components/player/LivePlayer.tsx @@ -1,5 +1,5 @@ import WebRtcPlayer from "./WebRTCPlayer"; -import { CameraConfig } from "@/types/frigateConfig"; +import { CameraConfig, FrigateConfig } from "@/types/frigateConfig"; import AutoUpdatingCameraImage from "../camera/AutoUpdatingCameraImage"; import ActivityIndicator from "../ui/activity-indicator"; import { Button } from "../ui/button"; @@ -11,27 +11,58 @@ import { Label } from "../ui/label"; import { usePersistence } from "@/hooks/use-persistence"; import MSEPlayer from "./MsePlayer"; import JSMpegPlayer from "./JSMpegPlayer"; +import useSWR from "swr"; const emptyObject = Object.freeze({}); type LivePlayerProps = { + className?: string; cameraConfig: CameraConfig; - liveMode: string; }; type Options = { [key: string]: boolean }; export default function LivePlayer({ + className, cameraConfig, - liveMode, }: LivePlayerProps) { + const { data: config } = useSWR("config"); const [showSettings, setShowSettings] = useState(false); const [options, setOptions] = usePersistence( - `${cameraConfig.name}-feed`, + `${cameraConfig?.name}-feed`, emptyObject ); + const restreamEnabled = useMemo(() => { + if (!config) { + return false; + } + + return ( + cameraConfig && + Object.keys(config.go2rtc.streams || {}).includes( + cameraConfig.live.stream_name + ) + ); + }, [config, cameraConfig]); + + const defaultLiveMode = useMemo(() => { + if (cameraConfig) { + if (restreamEnabled) { + return cameraConfig.ui.live_mode || config?.ui.live_mode; + } + + return "jsmpeg"; + } + + return undefined; + }, [cameraConfig, restreamEnabled]); + const [liveMode, setLiveMode, sourceIsLoaded] = usePersistence( + `${cameraConfig.name}-source`, + defaultLiveMode + ); + const handleSetOption = useCallback( (id: string, value: boolean) => { const newOptions = { ...options, [id]: value }; @@ -56,10 +87,17 @@ export default function LivePlayer({ setShowSettings(!showSettings); }, [showSettings, setShowSettings]); + if (!cameraConfig) { + return ; + } + if (liveMode == "webrtc") { return (
- +
); } else if (liveMode == "mse") { diff --git a/web/src/components/player/WebRTCPlayer.tsx b/web/src/components/player/WebRTCPlayer.tsx index f679b73a1..daf7aa75e 100644 --- a/web/src/components/player/WebRTCPlayer.tsx +++ b/web/src/components/player/WebRTCPlayer.tsx @@ -2,12 +2,14 @@ import { baseUrl } from "@/api/baseUrl"; import { useCallback, useEffect, useRef } from "react"; type WebRtcPlayerProps = { + className?: string; camera: string; width?: number; height?: number; }; export default function WebRtcPlayer({ + className, camera, width, height, @@ -149,6 +151,7 @@ export default function WebRtcPlayer({