Remove favorite

This commit is contained in:
Nicolas Mowen 2024-02-11 05:49:15 -07:00
parent ae8932e27e
commit 3ab89d89df
3 changed files with 18 additions and 47 deletions

View File

@ -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

View File

@ -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 />

View File

@ -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>