import { FrigateConfig } from "@/types/frigateConfig"; import VideoPlayer from "./VideoPlayer"; import useSWR from "swr"; import { useCallback, useMemo, useRef } from "react"; import { useApiHost } from "@/api"; import Player from "video.js/dist/types/player"; type PreviewPlayerProps = { camera: string, allPreviews: Preview[], startTs: number, } type Preview = { camera: string, src: string, type: string, start: number, end: number, } export default function PreviewThumbnailPlayer({ camera, allPreviews, startTs }: PreviewPlayerProps) { const { data: config } = useSWR('config'); const playerRef = useRef(null); const apiHost = useApiHost(); const relevantPreview = useMemo(() => { return Object.values(allPreviews || []).find( (preview) => preview.camera == camera && preview.start < startTs && preview.end > startTs ); }, [allPreviews, camera, startTs]); const onHover = useCallback((isHovered: Boolean) => { if (!relevantPreview || !playerRef.current) { return; } if (isHovered) { playerRef.current.play(); } else { playerRef.current.pause(); playerRef.current.currentTime(startTs - relevantPreview.start); } }, [relevantPreview, startTs] ); if (!relevantPreview) { return ( ); } return (
onHover(true)} onMouseLeave={() => onHover(false)} > { playerRef.current = player; player.playbackRate(8); player.currentTime(startTs - relevantPreview.start); }} onDispose={() => { playerRef.current = null; }} />
); } function getThumbWidth(camera: string, config: FrigateConfig) { const detect = config.cameras[camera].detect; if (detect.width / detect.height > 2) { return 'w-[320px]'; } if (detect.width / detect.height < 1.4) { return 'w-[200px]'; } return 'w-[240px]'; }