import { h, Fragment } from 'preact'; import { usePersistence } from '../context'; import ActivityIndicator from '../components/ActivityIndicator'; import JSMpegPlayer from '../components/JSMpegPlayer'; import Heading from '../components/Heading'; import WebRtcPlayer from '../components/WebRtcPlayer'; import '../components/MsePlayer'; import useSWR from 'swr'; import { useMemo, useState } from 'preact/hooks'; import CameraControlPanel from '../components/CameraControlPanel'; import { baseUrl } from '../api/baseUrl'; export default function Birdseye() { const { data: config } = useSWR('config'); const [viewSource, setViewSource, sourceIsLoaded] = usePersistence('birdseye-source', getDefaultLiveMode(config)); const sourceValues = ['mse', 'webrtc', 'jsmpeg']; const ptzCameras = useMemo(() => { if (!config) { return []; } return Object.entries(config.cameras) .filter(([_, conf]) => conf.onvif?.host && conf.onvif.host != '') .map(([_, camera]) => camera.name); }, [config]); const [isMaxWidth, setIsMaxWidth] = useState(false); if (!config || !sourceIsLoaded) { return ; } let player; const playerClass = isMaxWidth ? 'max-w-5xl xl:w-1/2' : 'w-full'; if (viewSource == 'mse' && config.birdseye.restream) { if ('MediaSource' in window) { player = (
); } else { player = (
MSE is not supported on iOS devices. You'll need to use jsmpeg or webRTC. See the docs for more info.
); } } else if (viewSource == 'webrtc' ) { player = (
); } else { player = (
); } return (
Birdseye {config.birdseye.restream && ( )}
{/* Use dynamic class */} {player}
{ptzCameras.length ? (
Control Panel {ptzCameras.map((camera) => (
{camera.replaceAll('_', ' ')}
))}
) : null}
); } function getDefaultLiveMode(config) { if (config) { if (config.birdseye.restream) { return config.ui.live_mode; } return 'jsmpeg'; } return undefined; }