mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-09 04:35:25 +03:00
Remove favorite
This commit is contained in:
parent
ae8932e27e
commit
3ab89d89df
@ -603,7 +603,7 @@ def event_preview(id: str, max_cache_age=2592000):
|
|||||||
)
|
)
|
||||||
|
|
||||||
start_ts = event.start_time
|
start_ts = event.start_time
|
||||||
end_ts = event.start_time + 10
|
end_ts = min(event.end_time - event.start_time, 20) if event.end_time else 20
|
||||||
|
|
||||||
if datetime.fromtimestamp(event.start_time) < datetime.now().replace(
|
if datetime.fromtimestamp(event.start_time) < datetime.now().replace(
|
||||||
minute=0, second=0
|
minute=0, second=0
|
||||||
@ -643,7 +643,7 @@ def event_preview(id: str, max_cache_age=2592000):
|
|||||||
"-ss",
|
"-ss",
|
||||||
f"00:{minutes}:{seconds}",
|
f"00:{minutes}:{seconds}",
|
||||||
"-t",
|
"-t",
|
||||||
"20",
|
f"{end_ts - start_ts}",
|
||||||
"-i",
|
"-i",
|
||||||
preview.path,
|
preview.path,
|
||||||
"-r",
|
"-r",
|
||||||
@ -1031,9 +1031,9 @@ def event_snapshot(id):
|
|||||||
else:
|
else:
|
||||||
response.headers["Cache-Control"] = "no-store"
|
response.headers["Cache-Control"] = "no-store"
|
||||||
if download:
|
if download:
|
||||||
response.headers["Content-Disposition"] = (
|
response.headers[
|
||||||
f"attachment; filename=snapshot-{id}.jpg"
|
"Content-Disposition"
|
||||||
)
|
] = f"attachment; filename=snapshot-{id}.jpg"
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
@ -1220,9 +1220,9 @@ def event_clip(id):
|
|||||||
if download:
|
if download:
|
||||||
response.headers["Content-Disposition"] = "attachment; filename=%s" % file_name
|
response.headers["Content-Disposition"] = "attachment; filename=%s" % file_name
|
||||||
response.headers["Content-Length"] = os.path.getsize(clip_path)
|
response.headers["Content-Length"] = os.path.getsize(clip_path)
|
||||||
response.headers["X-Accel-Redirect"] = (
|
response.headers[
|
||||||
f"/clips/{file_name}" # nginx: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers
|
"X-Accel-Redirect"
|
||||||
)
|
] = f"/clips/{file_name}" # nginx: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@ -1927,9 +1927,9 @@ def get_recordings_storage_usage():
|
|||||||
|
|
||||||
total_mb = recording_stats["total"]
|
total_mb = recording_stats["total"]
|
||||||
|
|
||||||
camera_usages: dict[str, dict] = (
|
camera_usages: dict[
|
||||||
current_app.storage_maintainer.calculate_camera_usages()
|
str, dict
|
||||||
)
|
] = current_app.storage_maintainer.calculate_camera_usages()
|
||||||
|
|
||||||
for camera_name in camera_usages.keys():
|
for camera_name in camera_usages.keys():
|
||||||
if camera_usages.get(camera_name, {}).get("usage"):
|
if camera_usages.get(camera_name, {}).get("usage"):
|
||||||
@ -2117,9 +2117,9 @@ def recording_clip(camera_name, start_ts, end_ts):
|
|||||||
if download:
|
if download:
|
||||||
response.headers["Content-Disposition"] = "attachment; filename=%s" % file_name
|
response.headers["Content-Disposition"] = "attachment; filename=%s" % file_name
|
||||||
response.headers["Content-Length"] = os.path.getsize(path)
|
response.headers["Content-Length"] = os.path.getsize(path)
|
||||||
response.headers["X-Accel-Redirect"] = (
|
response.headers[
|
||||||
f"/cache/{file_name}" # nginx: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers
|
"X-Accel-Redirect"
|
||||||
)
|
] = f"/cache/{file_name}" # nginx: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|||||||
@ -6,12 +6,8 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip";
|
|||||||
|
|
||||||
type AnimatedEventThumbnailProps = {
|
type AnimatedEventThumbnailProps = {
|
||||||
event: FrigateEvent;
|
event: FrigateEvent;
|
||||||
onFavorite?: (e: Event, event: FrigateEvent) => void;
|
|
||||||
};
|
};
|
||||||
export function AnimatedEventThumbnail({
|
export function AnimatedEventThumbnail({ event }: AnimatedEventThumbnailProps) {
|
||||||
event,
|
|
||||||
onFavorite,
|
|
||||||
}: AnimatedEventThumbnailProps) {
|
|
||||||
return (
|
return (
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
@ -21,11 +17,6 @@ export function AnimatedEventThumbnail({
|
|||||||
backgroundImage: `url(${baseUrl}api/events/${event.id}/preview.gif)`,
|
backgroundImage: `url(${baseUrl}api/events/${event.id}/preview.gif)`,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<LuStar
|
|
||||||
className="absolute h-6 w-6 text-yellow-300 top-1 right-1 cursor-pointer"
|
|
||||||
onClick={(e: Event) => (onFavorite ? onFavorite(e, event) : null)}
|
|
||||||
fill={event.retain_indefinitely ? "currentColor" : "none"}
|
|
||||||
/>
|
|
||||||
<div className="absolute bottom-0 w-full h-6 bg-gradient-to-t from-slate-900/50 to-transparent rounded">
|
<div className="absolute bottom-0 w-full h-6 bg-gradient-to-t from-slate-900/50 to-transparent rounded">
|
||||||
<div className="absolute left-1 bottom-0 text-xs text-white w-full">
|
<div className="absolute left-1 bottom-0 text-xs text-white w-full">
|
||||||
<TimeAgo time={event.start_time * 1000} dense />
|
<TimeAgo time={event.start_time * 1000} dense />
|
||||||
|
|||||||
@ -4,8 +4,7 @@ import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area";
|
|||||||
import { TooltipProvider } from "@/components/ui/tooltip";
|
import { TooltipProvider } from "@/components/ui/tooltip";
|
||||||
import { Event as FrigateEvent } from "@/types/event";
|
import { Event as FrigateEvent } from "@/types/event";
|
||||||
import { FrigateConfig } from "@/types/frigateConfig";
|
import { FrigateConfig } from "@/types/frigateConfig";
|
||||||
import axios from "axios";
|
import { useMemo } from "react";
|
||||||
import { useCallback, useMemo } from "react";
|
|
||||||
import useSWR from "swr";
|
import useSWR from "swr";
|
||||||
|
|
||||||
function Live() {
|
function Live() {
|
||||||
@ -13,7 +12,7 @@ function Live() {
|
|||||||
|
|
||||||
// recent events
|
// recent events
|
||||||
|
|
||||||
const { data: allEvents, mutate: updateEvents } = useSWR<FrigateEvent[]>(
|
const { data: allEvents } = useSWR<FrigateEvent[]>(
|
||||||
["events", { limit: 10 }],
|
["events", { limit: 10 }],
|
||||||
{ refreshInterval: 60000 }
|
{ refreshInterval: 60000 }
|
||||||
);
|
);
|
||||||
@ -29,19 +28,6 @@ function Live() {
|
|||||||
return allEvents.filter((event) => event.start_time > cutoff);
|
return allEvents.filter((event) => event.start_time > cutoff);
|
||||||
}, [allEvents]);
|
}, [allEvents]);
|
||||||
|
|
||||||
const onFavorite = useCallback(async (e: Event, event: FrigateEvent) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
let response;
|
|
||||||
if (!event.retain_indefinitely) {
|
|
||||||
response = await axios.post(`events/${event.id}/retain`);
|
|
||||||
} else {
|
|
||||||
response = await axios.delete(`events/${event.id}/retain`);
|
|
||||||
}
|
|
||||||
if (response.status === 200) {
|
|
||||||
updateEvents();
|
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// camera live views
|
// camera live views
|
||||||
|
|
||||||
const cameras = useMemo(() => {
|
const cameras = useMemo(() => {
|
||||||
@ -61,13 +47,7 @@ function Live() {
|
|||||||
<TooltipProvider>
|
<TooltipProvider>
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
{events.map((event) => {
|
{events.map((event) => {
|
||||||
return (
|
return <AnimatedEventThumbnail key={event.id} event={event} />;
|
||||||
<AnimatedEventThumbnail
|
|
||||||
key={event.id}
|
|
||||||
event={event}
|
|
||||||
onFavorite={onFavorite}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
</TooltipProvider>
|
</TooltipProvider>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user