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({