mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-07 11:45:24 +03:00
Save timeline entries for api events
This commit is contained in:
parent
734a488db3
commit
f226fcb04c
@ -52,7 +52,7 @@ class ExternalEventProcessor:
|
|||||||
(
|
(
|
||||||
EventTypeEnum.api,
|
EventTypeEnum.api,
|
||||||
"new",
|
"new",
|
||||||
camera_config,
|
camera,
|
||||||
{
|
{
|
||||||
"id": event_id,
|
"id": event_id,
|
||||||
"label": label,
|
"label": label,
|
||||||
|
|||||||
@ -109,6 +109,16 @@ class EventProcessor(threading.Thread):
|
|||||||
|
|
||||||
self.handle_object_detection(event_type, camera, event_data)
|
self.handle_object_detection(event_type, camera, event_data)
|
||||||
elif source_type == EventTypeEnum.api:
|
elif source_type == EventTypeEnum.api:
|
||||||
|
self.timeline_queue.put(
|
||||||
|
(
|
||||||
|
camera,
|
||||||
|
source_type,
|
||||||
|
event_type,
|
||||||
|
{},
|
||||||
|
event_data,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
self.handle_external_detection(event_type, event_data)
|
self.handle_external_detection(event_type, event_data)
|
||||||
|
|
||||||
# set an end_time on events without an end_time before exiting
|
# set an end_time on events without an end_time before exiting
|
||||||
|
|||||||
@ -48,6 +48,8 @@ class TimelineProcessor(threading.Thread):
|
|||||||
self.handle_object_detection(
|
self.handle_object_detection(
|
||||||
camera, event_type, prev_event_data, event_data
|
camera, event_type, prev_event_data, event_data
|
||||||
)
|
)
|
||||||
|
elif input_type == EventTypeEnum.api:
|
||||||
|
self.handle_api_entry(camera, event_type, event_data)
|
||||||
|
|
||||||
def insert_or_save(
|
def insert_or_save(
|
||||||
self,
|
self,
|
||||||
@ -140,3 +142,40 @@ class TimelineProcessor(threading.Thread):
|
|||||||
|
|
||||||
if save:
|
if save:
|
||||||
self.insert_or_save(timeline_entry, prev_event_data, event_data)
|
self.insert_or_save(timeline_entry, prev_event_data, event_data)
|
||||||
|
|
||||||
|
def handle_api_entry(
|
||||||
|
self,
|
||||||
|
camera: str,
|
||||||
|
event_type: str,
|
||||||
|
event_data: dict[any, any],
|
||||||
|
) -> bool:
|
||||||
|
if event_type != "new":
|
||||||
|
return False
|
||||||
|
|
||||||
|
if event_data.get("type", "api") == "audio":
|
||||||
|
timeline_entry = {
|
||||||
|
Timeline.class_type: "heard",
|
||||||
|
Timeline.timestamp: event_data["start_time"],
|
||||||
|
Timeline.camera: camera,
|
||||||
|
Timeline.source: "audio",
|
||||||
|
Timeline.source_id: event_data["id"],
|
||||||
|
Timeline.data: {
|
||||||
|
"label": event_data["label"],
|
||||||
|
"sub_label": event_data.get("sub_label"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
timeline_entry = {
|
||||||
|
Timeline.class_type: "external",
|
||||||
|
Timeline.timestamp: event_data["start_time"],
|
||||||
|
Timeline.camera: camera,
|
||||||
|
Timeline.source: "api",
|
||||||
|
Timeline.source_id: event_data["id"],
|
||||||
|
Timeline.data: {
|
||||||
|
"label": event_data["label"],
|
||||||
|
"sub_label": event_data.get("sub_label"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
Timeline.insert(timeline_entry).execute()
|
||||||
|
return True
|
||||||
|
|||||||
@ -271,7 +271,7 @@ function History() {
|
|||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
{lastRow && <ActivityIndicator />}
|
{lastRow && !isDone && <ActivityIndicator />}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,7 +27,16 @@ type Timeline = {
|
|||||||
data: {
|
data: {
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
};
|
};
|
||||||
class_type: string;
|
class_type:
|
||||||
|
| "visible"
|
||||||
|
| "gone"
|
||||||
|
| "sub_label"
|
||||||
|
| "entered_zone"
|
||||||
|
| "attribute"
|
||||||
|
| "active"
|
||||||
|
| "stationary"
|
||||||
|
| "heard"
|
||||||
|
| "external";
|
||||||
source_id: string;
|
source_id: string;
|
||||||
source: string;
|
source: string;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,4 +1,11 @@
|
|||||||
import { LuCircle, LuPlay, LuPlayCircle, LuTruck } from "react-icons/lu";
|
import {
|
||||||
|
LuCircle,
|
||||||
|
LuCircleDot,
|
||||||
|
LuEar,
|
||||||
|
LuPlay,
|
||||||
|
LuPlayCircle,
|
||||||
|
LuTruck,
|
||||||
|
} from "react-icons/lu";
|
||||||
import { IoMdExit } from "react-icons/io";
|
import { IoMdExit } from "react-icons/io";
|
||||||
import {
|
import {
|
||||||
MdFaceUnlock,
|
MdFaceUnlock,
|
||||||
@ -33,7 +40,13 @@ export function getTimelineIcon(timelineItem: Timeline) {
|
|||||||
return <MdFaceUnlock className="w-4 mr-1" />;
|
return <MdFaceUnlock className="w-4 mr-1" />;
|
||||||
case "car":
|
case "car":
|
||||||
return <MdOutlinePictureInPictureAlt className="w-4 mr-1" />;
|
return <MdOutlinePictureInPictureAlt className="w-4 mr-1" />;
|
||||||
|
default:
|
||||||
|
return <LuCircleDot className="w-4 mr-1" />;
|
||||||
}
|
}
|
||||||
|
case "heard":
|
||||||
|
return <LuEar className="w-4 mr-1" />;
|
||||||
|
case "external":
|
||||||
|
return <LuCircleDot className="w-4 mr-1" />;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,5 +89,9 @@ export function getTimelineItemDescription(timelineItem: Timeline) {
|
|||||||
return `${timelineItem.data.label} recognized as ${timelineItem.data.sub_label}`;
|
return `${timelineItem.data.label} recognized as ${timelineItem.data.sub_label}`;
|
||||||
case "gone":
|
case "gone":
|
||||||
return `${label} left`;
|
return `${label} left`;
|
||||||
|
case "heard":
|
||||||
|
return `${label} heard`;
|
||||||
|
case "external":
|
||||||
|
return `${label} detected`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user