2024-02-10 15:30:53 +03:00
|
|
|
import { CameraConfig, FrigateConfig } from "@/types/frigateConfig";
|
2024-08-17 21:16:48 +03:00
|
|
|
import { useCallback, useEffect, useState } from "react";
|
2024-02-10 15:30:53 +03:00
|
|
|
import useSWR from "swr";
|
|
|
|
|
import { LivePlayerMode } from "@/types/live";
|
|
|
|
|
|
|
|
|
|
export default function useCameraLiveMode(
|
2024-08-17 21:16:48 +03:00
|
|
|
cameras: CameraConfig[],
|
|
|
|
|
windowVisible: boolean,
|
|
|
|
|
) {
|
2024-02-10 15:30:53 +03:00
|
|
|
const { data: config } = useSWR<FrigateConfig>("config");
|
2024-08-17 21:16:48 +03:00
|
|
|
const [preferredLiveModes, setPreferredLiveModes] = useState<{
|
|
|
|
|
[key: string]: LivePlayerMode;
|
|
|
|
|
}>({});
|
2024-02-10 15:30:53 +03:00
|
|
|
|
2024-08-17 21:16:48 +03:00
|
|
|
useEffect(() => {
|
|
|
|
|
if (!cameras) return;
|
2024-02-10 15:30:53 +03:00
|
|
|
|
2024-08-17 21:16:48 +03:00
|
|
|
const mseSupported =
|
|
|
|
|
"MediaSource" in window || "ManagedMediaSource" in window;
|
|
|
|
|
|
|
|
|
|
const newPreferredLiveModes = cameras.reduce(
|
|
|
|
|
(acc, camera) => {
|
|
|
|
|
const isRestreamed =
|
|
|
|
|
config &&
|
|
|
|
|
Object.keys(config.go2rtc.streams || {}).includes(
|
|
|
|
|
camera.live.stream_name,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (!mseSupported) {
|
|
|
|
|
acc[camera.name] = isRestreamed ? "webrtc" : "jsmpeg";
|
|
|
|
|
} else {
|
|
|
|
|
acc[camera.name] = isRestreamed ? "mse" : "jsmpeg";
|
|
|
|
|
}
|
|
|
|
|
return acc;
|
|
|
|
|
},
|
|
|
|
|
{} as { [key: string]: LivePlayerMode },
|
2024-02-10 15:30:53 +03:00
|
|
|
);
|
2024-08-17 21:16:48 +03:00
|
|
|
|
|
|
|
|
setPreferredLiveModes(newPreferredLiveModes);
|
|
|
|
|
}, [cameras, config, windowVisible]);
|
|
|
|
|
|
|
|
|
|
const resetPreferredLiveMode = useCallback(
|
|
|
|
|
(cameraName: string) => {
|
|
|
|
|
const mseSupported =
|
|
|
|
|
"MediaSource" in window || "ManagedMediaSource" in window;
|
|
|
|
|
const isRestreamed =
|
|
|
|
|
config && Object.keys(config.go2rtc.streams || {}).includes(cameraName);
|
|
|
|
|
|
|
|
|
|
setPreferredLiveModes((prevModes) => {
|
|
|
|
|
const newModes = { ...prevModes };
|
|
|
|
|
|
|
|
|
|
if (!mseSupported) {
|
|
|
|
|
newModes[cameraName] = isRestreamed ? "webrtc" : "jsmpeg";
|
|
|
|
|
} else {
|
|
|
|
|
newModes[cameraName] = isRestreamed ? "mse" : "jsmpeg";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return newModes;
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
[config],
|
2024-02-10 15:30:53 +03:00
|
|
|
);
|
|
|
|
|
|
2024-08-17 21:16:48 +03:00
|
|
|
return { preferredLiveModes, setPreferredLiveModes, resetPreferredLiveMode };
|
2024-02-10 15:30:53 +03:00
|
|
|
}
|