mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-04-26 00:27:40 +03:00
don't refetch timeline
This commit is contained in:
parent
5dc4b779f4
commit
950d8e74f5
@ -18,6 +18,7 @@ type ObjectTrackOverlayProps = {
|
|||||||
videoHeight: number;
|
videoHeight: number;
|
||||||
className?: string;
|
className?: string;
|
||||||
onSeekToTime?: (timestamp: number) => void;
|
onSeekToTime?: (timestamp: number) => void;
|
||||||
|
objectTimeline?: ObjectLifecycleSequence[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function ObjectTrackOverlay({
|
export default function ObjectTrackOverlay({
|
||||||
@ -28,17 +29,10 @@ export default function ObjectTrackOverlay({
|
|||||||
videoHeight,
|
videoHeight,
|
||||||
className,
|
className,
|
||||||
onSeekToTime,
|
onSeekToTime,
|
||||||
|
objectTimeline,
|
||||||
}: ObjectTrackOverlayProps) {
|
}: ObjectTrackOverlayProps) {
|
||||||
const { data: config } = useSWR<FrigateConfig>("config");
|
const { data: config } = useSWR<FrigateConfig>("config");
|
||||||
|
|
||||||
// Fetch timeline data for the selected object
|
|
||||||
const { data: objectTimeline } = useSWR<ObjectLifecycleSequence[]>([
|
|
||||||
"timeline",
|
|
||||||
{
|
|
||||||
source_id: selectedObjectId,
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Fetch the full event data to get saved path points
|
// Fetch the full event data to get saved path points
|
||||||
const { data: eventData } = useSWR(["event_ids", { ids: selectedObjectId }]);
|
const { data: eventData } = useSWR(["event_ids", { ids: selectedObjectId }]);
|
||||||
|
|
||||||
@ -158,9 +152,8 @@ export default function ObjectTrackOverlay({
|
|||||||
return pathPoints.map((point) => {
|
return pathPoints.map((point) => {
|
||||||
// Find the corresponding timeline entry for this point
|
// Find the corresponding timeline entry for this point
|
||||||
const timelineEntry = objectTimeline?.find(
|
const timelineEntry = objectTimeline?.find(
|
||||||
(entry) => Math.abs(entry.timestamp - point.timestamp) < 0.1,
|
(entry) => entry.timestamp == point.timestamp,
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
x: point.x * videoWidth,
|
x: point.x * videoWidth,
|
||||||
y: point.y * videoHeight,
|
y: point.y * videoHeight,
|
||||||
|
|||||||
@ -77,8 +77,13 @@ export default function HlsVideoPlayer({
|
|||||||
}: HlsVideoPlayerProps) {
|
}: HlsVideoPlayerProps) {
|
||||||
const { t } = useTranslation("components/player");
|
const { t } = useTranslation("components/player");
|
||||||
const { data: config } = useSWR<FrigateConfig>("config");
|
const { data: config } = useSWR<FrigateConfig>("config");
|
||||||
const { selectedObjectId, currentTime, camera, isActivityMode } =
|
const {
|
||||||
useActivityStream();
|
selectedObjectId,
|
||||||
|
selectedObjectTimeline,
|
||||||
|
currentTime,
|
||||||
|
camera,
|
||||||
|
isActivityMode,
|
||||||
|
} = useActivityStream();
|
||||||
|
|
||||||
// playback
|
// playback
|
||||||
|
|
||||||
@ -327,6 +332,7 @@ export default function HlsVideoPlayer({
|
|||||||
onSeekToTime(timestamp);
|
onSeekToTime(timestamp);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
objectTimeline={selectedObjectTimeline}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
import React, { createContext, useContext, useState } from "react";
|
import React, { createContext, useContext, useState, useMemo } from "react";
|
||||||
|
import { ObjectLifecycleSequence } from "@/types/timeline";
|
||||||
|
|
||||||
interface ActivityStreamContextType {
|
interface ActivityStreamContextType {
|
||||||
selectedObjectId: string | undefined;
|
selectedObjectId: string | undefined;
|
||||||
|
selectedObjectTimeline: ObjectLifecycleSequence[] | undefined;
|
||||||
currentTime: number;
|
currentTime: number;
|
||||||
camera: string;
|
camera: string;
|
||||||
setSelectedObjectId: (id: string | undefined) => void;
|
setSelectedObjectId: (id: string | undefined) => void;
|
||||||
@ -17,6 +19,7 @@ interface ActivityStreamProviderProps {
|
|||||||
isActivityMode: boolean;
|
isActivityMode: boolean;
|
||||||
currentTime: number;
|
currentTime: number;
|
||||||
camera: string;
|
camera: string;
|
||||||
|
timelineData: ObjectLifecycleSequence[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ActivityStreamProvider({
|
export function ActivityStreamProvider({
|
||||||
@ -24,13 +27,20 @@ export function ActivityStreamProvider({
|
|||||||
isActivityMode,
|
isActivityMode,
|
||||||
currentTime,
|
currentTime,
|
||||||
camera,
|
camera,
|
||||||
|
timelineData,
|
||||||
}: ActivityStreamProviderProps) {
|
}: ActivityStreamProviderProps) {
|
||||||
const [selectedObjectId, setSelectedObjectId] = useState<
|
const [selectedObjectId, setSelectedObjectId] = useState<
|
||||||
string | undefined
|
string | undefined
|
||||||
>();
|
>();
|
||||||
|
|
||||||
|
const selectedObjectTimeline = useMemo(() => {
|
||||||
|
if (!selectedObjectId || !timelineData) return undefined;
|
||||||
|
return timelineData.filter((item) => item.source_id === selectedObjectId);
|
||||||
|
}, [timelineData, selectedObjectId]);
|
||||||
|
|
||||||
const value: ActivityStreamContextType = {
|
const value: ActivityStreamContextType = {
|
||||||
selectedObjectId,
|
selectedObjectId,
|
||||||
|
selectedObjectTimeline,
|
||||||
currentTime,
|
currentTime,
|
||||||
camera,
|
camera,
|
||||||
setSelectedObjectId,
|
setSelectedObjectId,
|
||||||
|
|||||||
@ -571,6 +571,7 @@ export function RecordingView({
|
|||||||
isActivityMode={timelineType === "activity"}
|
isActivityMode={timelineType === "activity"}
|
||||||
currentTime={currentTime}
|
currentTime={currentTime}
|
||||||
camera={mainCamera}
|
camera={mainCamera}
|
||||||
|
timelineData={timelineData}
|
||||||
>
|
>
|
||||||
<div ref={contentRef} className="flex size-full flex-col pt-2">
|
<div ref={contentRef} className="flex size-full flex-col pt-2">
|
||||||
<Toaster closeButton={true} />
|
<Toaster closeButton={true} />
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user