forked from Github/frigate
Compare commits
7 Commits
trt-10
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51da56be31 | ||
|
|
a1ce9aacf2 | ||
|
|
322b847356 | ||
|
|
98338e4c7f | ||
|
|
171a89f37b | ||
|
|
8114b541a8 | ||
|
|
c48396c5c6 |
@@ -10,7 +10,7 @@ imutils == 0.5.*
|
|||||||
joserfc == 1.0.*
|
joserfc == 1.0.*
|
||||||
pathvalidate == 3.2.*
|
pathvalidate == 3.2.*
|
||||||
markupsafe == 2.1.*
|
markupsafe == 2.1.*
|
||||||
mypy == 1.6.1
|
mypy == 1.14.1
|
||||||
numpy == 1.26.*
|
numpy == 1.26.*
|
||||||
onvif_zeep == 0.2.12
|
onvif_zeep == 0.2.12
|
||||||
opencv-python-headless == 4.9.0.*
|
opencv-python-headless == 4.9.0.*
|
||||||
|
|||||||
@@ -139,6 +139,8 @@ def config(request: Request):
|
|||||||
mode="json", warnings="none", exclude_none=True
|
mode="json", warnings="none", exclude_none=True
|
||||||
)
|
)
|
||||||
for stream_name, stream in go2rtc.get("streams", {}).items():
|
for stream_name, stream in go2rtc.get("streams", {}).items():
|
||||||
|
if stream is None:
|
||||||
|
continue
|
||||||
if isinstance(stream, str):
|
if isinstance(stream, str):
|
||||||
cleaned = clean_camera_user_pass(stream)
|
cleaned = clean_camera_user_pass(stream)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -121,8 +121,8 @@ class EventCleanup(threading.Thread):
|
|||||||
|
|
||||||
events_to_update = []
|
events_to_update = []
|
||||||
|
|
||||||
for batch in query.iterator():
|
for event in query.iterator():
|
||||||
events_to_update.extend([event.id for event in batch])
|
events_to_update.append(event.id)
|
||||||
if len(events_to_update) >= CHUNK_SIZE:
|
if len(events_to_update) >= CHUNK_SIZE:
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"Updating {update_params} for {len(events_to_update)} events"
|
f"Updating {update_params} for {len(events_to_update)} events"
|
||||||
@@ -257,7 +257,7 @@ class EventCleanup(threading.Thread):
|
|||||||
events_to_update = []
|
events_to_update = []
|
||||||
|
|
||||||
for event in query.iterator():
|
for event in query.iterator():
|
||||||
events_to_update.append(event)
|
events_to_update.append(event.id)
|
||||||
|
|
||||||
if len(events_to_update) >= CHUNK_SIZE:
|
if len(events_to_update) >= CHUNK_SIZE:
|
||||||
logger.debug(
|
logger.debug(
|
||||||
|
|||||||
@@ -755,7 +755,11 @@ export function CameraGroupEdit({
|
|||||||
<FormMessage />
|
<FormMessage />
|
||||||
{[
|
{[
|
||||||
...(birdseyeConfig?.enabled ? ["birdseye"] : []),
|
...(birdseyeConfig?.enabled ? ["birdseye"] : []),
|
||||||
...Object.keys(config?.cameras ?? {}),
|
...Object.keys(config?.cameras ?? {}).sort(
|
||||||
|
(a, b) =>
|
||||||
|
(config?.cameras[a]?.ui?.order ?? 0) -
|
||||||
|
(config?.cameras[b]?.ui?.order ?? 0),
|
||||||
|
),
|
||||||
].map((camera) => (
|
].map((camera) => (
|
||||||
<FormControl key={camera}>
|
<FormControl key={camera}>
|
||||||
<FilterSwitch
|
<FilterSwitch
|
||||||
|
|||||||
@@ -477,7 +477,10 @@ export default function ObjectLifecycle({
|
|||||||
</p>
|
</p>
|
||||||
{Array.isArray(item.data.box) &&
|
{Array.isArray(item.data.box) &&
|
||||||
item.data.box.length >= 4
|
item.data.box.length >= 4
|
||||||
? (item.data.box[2] / item.data.box[3]).toFixed(2)
|
? (
|
||||||
|
aspectRatio *
|
||||||
|
(item.data.box[2] / item.data.box[3])
|
||||||
|
).toFixed(2)
|
||||||
: "N/A"}
|
: "N/A"}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -505,45 +505,46 @@ function ObjectDetailsTab({
|
|||||||
|
|
||||||
<div className="flex w-full flex-row justify-end gap-2">
|
<div className="flex w-full flex-row justify-end gap-2">
|
||||||
{config?.cameras[search.camera].genai.enabled && search.end_time && (
|
{config?.cameras[search.camera].genai.enabled && search.end_time && (
|
||||||
<>
|
<div className="flex items-start">
|
||||||
<div className="flex items-start">
|
<Button
|
||||||
<Button
|
className="rounded-r-none border-r-0"
|
||||||
className="rounded-r-none border-r-0"
|
aria-label="Regenerate tracked object description"
|
||||||
aria-label="Regenerate tracked object description"
|
onClick={() => regenerateDescription("thumbnails")}
|
||||||
onClick={() => regenerateDescription("thumbnails")}
|
>
|
||||||
>
|
Regenerate
|
||||||
Regenerate
|
</Button>
|
||||||
</Button>
|
{search.has_snapshot && (
|
||||||
{search.has_snapshot && (
|
<DropdownMenu>
|
||||||
<DropdownMenu>
|
<DropdownMenuTrigger asChild>
|
||||||
<DropdownMenuTrigger asChild>
|
<Button
|
||||||
<Button
|
className="rounded-l-none border-l-0 px-2"
|
||||||
className="rounded-l-none border-l-0 px-2"
|
aria-label="Expand regeneration menu"
|
||||||
aria-label="Expand regeneration menu"
|
>
|
||||||
>
|
<FaChevronDown className="size-3" />
|
||||||
<FaChevronDown className="size-3" />
|
</Button>
|
||||||
</Button>
|
</DropdownMenuTrigger>
|
||||||
</DropdownMenuTrigger>
|
<DropdownMenuContent>
|
||||||
<DropdownMenuContent>
|
<DropdownMenuItem
|
||||||
<DropdownMenuItem
|
className="cursor-pointer"
|
||||||
className="cursor-pointer"
|
aria-label="Regenerate from snapshot"
|
||||||
aria-label="Regenerate from snapshot"
|
onClick={() => regenerateDescription("snapshot")}
|
||||||
onClick={() => regenerateDescription("snapshot")}
|
>
|
||||||
>
|
Regenerate from Snapshot
|
||||||
Regenerate from Snapshot
|
</DropdownMenuItem>
|
||||||
</DropdownMenuItem>
|
<DropdownMenuItem
|
||||||
<DropdownMenuItem
|
className="cursor-pointer"
|
||||||
className="cursor-pointer"
|
aria-label="Regenerate from thumbnails"
|
||||||
aria-label="Regenerate from thumbnails"
|
onClick={() => regenerateDescription("thumbnails")}
|
||||||
onClick={() => regenerateDescription("thumbnails")}
|
>
|
||||||
>
|
Regenerate from Thumbnails
|
||||||
Regenerate from Thumbnails
|
</DropdownMenuItem>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuContent>
|
||||||
</DropdownMenuContent>
|
</DropdownMenu>
|
||||||
</DropdownMenu>
|
)}
|
||||||
)}
|
</div>
|
||||||
</div>
|
)}
|
||||||
|
{(config?.cameras[search.camera].genai.enabled && search.end_time) ||
|
||||||
|
(!config?.cameras[search.camera].genai.enabled && (
|
||||||
<Button
|
<Button
|
||||||
variant="select"
|
variant="select"
|
||||||
aria-label="Save"
|
aria-label="Save"
|
||||||
@@ -551,8 +552,7 @@ function ObjectDetailsTab({
|
|||||||
>
|
>
|
||||||
Save
|
Save
|
||||||
</Button>
|
</Button>
|
||||||
</>
|
))}
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ export default function SearchSettings({
|
|||||||
const trigger = (
|
const trigger = (
|
||||||
<Button
|
<Button
|
||||||
className="flex items-center gap-2"
|
className="flex items-center gap-2"
|
||||||
aria-label="Search Settings"
|
aria-label="Explore Settings"
|
||||||
size="sm"
|
size="sm"
|
||||||
>
|
>
|
||||||
<FaCog className="text-secondary-foreground" />
|
<FaCog className="text-secondary-foreground" />
|
||||||
|
|||||||
@@ -328,12 +328,12 @@ export default function Explore() {
|
|||||||
<div className="flex max-w-96 flex-col items-center justify-center space-y-3 rounded-lg bg-background/50 p-5">
|
<div className="flex max-w-96 flex-col items-center justify-center space-y-3 rounded-lg bg-background/50 p-5">
|
||||||
<div className="my-5 flex flex-col items-center gap-2 text-xl">
|
<div className="my-5 flex flex-col items-center gap-2 text-xl">
|
||||||
<TbExclamationCircle className="mb-3 size-10" />
|
<TbExclamationCircle className="mb-3 size-10" />
|
||||||
<div>Search Unavailable</div>
|
<div>Explore is Unavailable</div>
|
||||||
</div>
|
</div>
|
||||||
{embeddingsReindexing && allModelsLoaded && (
|
{embeddingsReindexing && allModelsLoaded && (
|
||||||
<>
|
<>
|
||||||
<div className="text-center text-primary-variant">
|
<div className="text-center text-primary-variant">
|
||||||
Search can be used after tracked object embeddings have
|
Explore can be used after tracked object embeddings have
|
||||||
finished reindexing.
|
finished reindexing.
|
||||||
</div>
|
</div>
|
||||||
<div className="pt-5 text-center">
|
<div className="pt-5 text-center">
|
||||||
@@ -384,8 +384,8 @@ export default function Explore() {
|
|||||||
<>
|
<>
|
||||||
<div className="text-center text-primary-variant">
|
<div className="text-center text-primary-variant">
|
||||||
Frigate is downloading the necessary embeddings models to
|
Frigate is downloading the necessary embeddings models to
|
||||||
support semantic searching. This may take several minutes
|
support the Semantic Search feature. This may take several
|
||||||
depending on the speed of your network connection.
|
minutes depending on the speed of your network connection.
|
||||||
</div>
|
</div>
|
||||||
<div className="flex w-96 flex-col gap-2 py-5">
|
<div className="flex w-96 flex-col gap-2 py-5">
|
||||||
<div className="flex flex-row items-center justify-center gap-2">
|
<div className="flex flex-row items-center justify-center gap-2">
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ import UiSettingsView from "@/views/settings/UiSettingsView";
|
|||||||
|
|
||||||
const allSettingsViews = [
|
const allSettingsViews = [
|
||||||
"UI settings",
|
"UI settings",
|
||||||
"search settings",
|
"explore settings",
|
||||||
"camera settings",
|
"camera settings",
|
||||||
"masks / zones",
|
"masks / zones",
|
||||||
"motion tuner",
|
"motion tuner",
|
||||||
@@ -175,7 +175,7 @@ export default function Settings() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="mt-2 flex h-full w-full flex-col items-start md:h-dvh md:pb-24">
|
<div className="mt-2 flex h-full w-full flex-col items-start md:h-dvh md:pb-24">
|
||||||
{page == "UI settings" && <UiSettingsView />}
|
{page == "UI settings" && <UiSettingsView />}
|
||||||
{page == "search settings" && (
|
{page == "explore settings" && (
|
||||||
<SearchSettingsView setUnsavedChanges={setUnsavedChanges} />
|
<SearchSettingsView setUnsavedChanges={setUnsavedChanges} />
|
||||||
)}
|
)}
|
||||||
{page == "debug" && (
|
{page == "debug" && (
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ export default function SearchSettingsView({
|
|||||||
)
|
)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
toast.success("Search settings have been saved.", {
|
toast.success("Explore settings have been saved.", {
|
||||||
position: "top-center",
|
position: "top-center",
|
||||||
});
|
});
|
||||||
setChangedValue(false);
|
setChangedValue(false);
|
||||||
@@ -128,7 +128,7 @@ export default function SearchSettingsView({
|
|||||||
if (changedValue) {
|
if (changedValue) {
|
||||||
addMessage(
|
addMessage(
|
||||||
"search_settings",
|
"search_settings",
|
||||||
`Unsaved search settings changes`,
|
`Unsaved Explore settings changes`,
|
||||||
undefined,
|
undefined,
|
||||||
"search_settings",
|
"search_settings",
|
||||||
);
|
);
|
||||||
@@ -140,7 +140,7 @@ export default function SearchSettingsView({
|
|||||||
}, [changedValue]);
|
}, [changedValue]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
document.title = "Search Settings - Frigate";
|
document.title = "Explore Settings - Frigate";
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (!config) {
|
if (!config) {
|
||||||
@@ -152,7 +152,7 @@ export default function SearchSettingsView({
|
|||||||
<Toaster position="top-center" closeButton={true} />
|
<Toaster position="top-center" closeButton={true} />
|
||||||
<div className="scrollbar-container order-last mb-10 mt-2 flex h-full w-full flex-col overflow-y-auto rounded-lg border-[1px] border-secondary-foreground bg-background_alt p-2 md:order-none md:mb-0 md:mr-2 md:mt-0">
|
<div className="scrollbar-container order-last mb-10 mt-2 flex h-full w-full flex-col overflow-y-auto rounded-lg border-[1px] border-secondary-foreground bg-background_alt p-2 md:order-none md:mb-0 md:mr-2 md:mt-0">
|
||||||
<Heading as="h3" className="my-2">
|
<Heading as="h3" className="my-2">
|
||||||
Search Settings
|
Explore Settings
|
||||||
</Heading>
|
</Heading>
|
||||||
<Separator className="my-2 flex bg-secondary" />
|
<Separator className="my-2 flex bg-secondary" />
|
||||||
<Heading as="h4" className="my-2">
|
<Heading as="h4" className="my-2">
|
||||||
@@ -221,7 +221,7 @@ export default function SearchSettingsView({
|
|||||||
<div className="text-md">Model Size</div>
|
<div className="text-md">Model Size</div>
|
||||||
<div className="space-y-1 text-sm text-muted-foreground">
|
<div className="space-y-1 text-sm text-muted-foreground">
|
||||||
<p>
|
<p>
|
||||||
The size of the model used for semantic search embeddings.
|
The size of the model used for Semantic Search embeddings.
|
||||||
</p>
|
</p>
|
||||||
<ul className="list-disc pl-5 text-sm">
|
<ul className="list-disc pl-5 text-sm">
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
Reference in New Issue
Block a user