2024-02-10 15:30:53 +03:00
|
|
|
import { CameraConfig, FrigateConfig } from "@/types/frigateConfig";
|
|
|
|
|
import { useMemo } from "react";
|
|
|
|
|
import useSWR from "swr";
|
|
|
|
|
import { usePersistence } from "./use-persistence";
|
|
|
|
|
import { LivePlayerMode } from "@/types/live";
|
|
|
|
|
|
|
|
|
|
export default function useCameraLiveMode(
|
|
|
|
|
cameraConfig: CameraConfig,
|
2024-02-29 01:23:56 +03:00
|
|
|
preferredMode?: string,
|
2024-02-28 17:16:16 +03:00
|
|
|
): LivePlayerMode | undefined {
|
2024-02-10 15:30:53 +03:00
|
|
|
const { data: config } = useSWR<FrigateConfig>("config");
|
|
|
|
|
|
|
|
|
|
const restreamEnabled = useMemo(() => {
|
|
|
|
|
if (!config) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
cameraConfig &&
|
|
|
|
|
Object.keys(config.go2rtc.streams || {}).includes(
|
2024-02-29 01:23:56 +03:00
|
|
|
cameraConfig.live.stream_name,
|
2024-02-10 15:30:53 +03:00
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
}, [config, cameraConfig]);
|
2024-02-28 17:16:16 +03:00
|
|
|
const defaultLiveMode = useMemo<LivePlayerMode | undefined>(() => {
|
2024-02-10 15:30:53 +03:00
|
|
|
if (config && cameraConfig) {
|
|
|
|
|
if (restreamEnabled) {
|
2024-02-28 17:16:16 +03:00
|
|
|
return cameraConfig.ui.live_mode || config.ui.live_mode;
|
2024-02-10 15:30:53 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return "jsmpeg";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return undefined;
|
2024-02-29 01:23:56 +03:00
|
|
|
// config will be updated if camera config is updated
|
|
|
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
2024-02-10 15:30:53 +03:00
|
|
|
}, [cameraConfig, restreamEnabled]);
|
2024-02-28 17:16:16 +03:00
|
|
|
const [viewSource] = usePersistence<LivePlayerMode>(
|
2024-02-10 15:30:53 +03:00
|
|
|
`${cameraConfig.name}-source`,
|
2024-02-29 01:23:56 +03:00
|
|
|
defaultLiveMode,
|
2024-02-10 15:30:53 +03:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
restreamEnabled &&
|
|
|
|
|
(preferredMode == "mse" || preferredMode == "webrtc")
|
|
|
|
|
) {
|
|
|
|
|
return preferredMode;
|
|
|
|
|
} else {
|
|
|
|
|
return viewSource;
|
|
|
|
|
}
|
|
|
|
|
}
|