import WebRtcPlayer from "./WebRTCPlayer"; import { CameraConfig } from "@/types/frigateConfig"; import AutoUpdatingCameraImage from "../camera/AutoUpdatingCameraImage"; import ActivityIndicator from "../ui/activity-indicator"; import { Button } from "../ui/button"; import { LuSettings } from "react-icons/lu"; import { useCallback, useMemo, useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "../ui/card"; import { Switch } from "../ui/switch"; import { Label } from "../ui/label"; import { usePersistence } from "@/hooks/use-persistence"; import MSEPlayer from "./MsePlayer"; import JSMpegPlayer from "./JSMpegPlayer"; import { MdCircle } from "react-icons/md"; import Chip from "../Chip"; const emptyObject = Object.freeze({}); type LivePlayerProps = { className?: string; cameraConfig: CameraConfig; liveMode?: "webrtc" | "mse" | "jsmpeg" | "debug"; }; type Options = { [key: string]: boolean }; export default function LivePlayer({ className, cameraConfig, liveMode = "mse", }: LivePlayerProps) { const [showSettings, setShowSettings] = useState(false); const [options, setOptions] = usePersistence( `${cameraConfig?.name}-feed`, emptyObject ); const handleSetOption = useCallback( (id: string, value: boolean) => { const newOptions = { ...options, [id]: value }; setOptions(newOptions); }, [options, setOptions] ); const searchParams = useMemo( () => new URLSearchParams( Object.keys(options).reduce((memo, key) => { //@ts-ignore we know this is correct memo.push([key, options[key] === true ? "1" : "0"]); return memo; }, []) ), [options] ); const handleToggleSettings = useCallback(() => { setShowSettings(!showSettings); }, [showSettings, setShowSettings]); if (!cameraConfig) { return ; } let player; if (liveMode == "webrtc") { player = ( ); } else if (liveMode == "mse") { if ("MediaSource" in window || "ManagedMediaSource" in window) { const camera = cameraConfig.name == "front_doorbell_cam" ? "portrait_cam" : cameraConfig.name player = ( ); } else { player = (
MSE is only supported on iOS 17.1+. You'll need to update if available or use jsmpeg / webRTC streams. See the docs for more info.
); } } else if (liveMode == "jsmpeg") { player = ( ); } else if (liveMode == "debug") { player = ( <> {showSettings ? ( Options ) : null} ); } else { player = ; } return (
{player}
{cameraConfig.name.replaceAll("_", " ")}
); } type DebugSettingsProps = { handleSetOption: (id: string, value: boolean) => void; options: Options; }; function DebugSettings({ handleSetOption, options }: DebugSettingsProps) { return (
{ handleSetOption("bbox", isChecked); }} />
{ handleSetOption("timestamp", isChecked); }} />
{ handleSetOption("zones", isChecked); }} />
{ handleSetOption("mask", isChecked); }} />
{ handleSetOption("motion", isChecked); }} />
{ handleSetOption("regions", isChecked); }} />
); }