diff --git a/frigate/http.py b/frigate/http.py index fe5ae5ec8..8aeb58741 100644 --- a/frigate/http.py +++ b/frigate/http.py @@ -534,6 +534,7 @@ def recordings(camera_name): [ { "date": date, + "events": sum([len(value["events"]) for value in hours.values()]), "recordings": [ {"hour": hour, "delay": value["delay"], "events": value["events"]} for hour, value in hours.items() diff --git a/web/src/components/Accordion.jsx b/web/src/components/Accordion.jsx deleted file mode 100644 index ed63de59e..000000000 --- a/web/src/components/Accordion.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import { h } from 'preact'; -import { useState } from 'preact/hooks'; -import ArrowDropdown from '../icons/ArrowDropdown'; -import ArrowDropup from '../icons/ArrowDropup'; - -export default function Accordion({ title, children, selected = false }) { - const [active, setActive] = useState(selected); - const toggle = () => setActive(!active); - return ( -
-
-
{title}
-
- {active ? : } -
-
-
{children}
-
- ); -} diff --git a/web/src/components/EventCard.jsx b/web/src/components/EventCard.jsx deleted file mode 100644 index 8a3a3f0a2..000000000 --- a/web/src/components/EventCard.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import { h } from 'preact'; -import { addSeconds, differenceInSeconds, fromUnixTime, format, startOfHour } from 'date-fns'; -import Link from '../components/Link'; -import { useApiHost } from '../api'; - -export default function EventCard({ camera, event, delay }) { - const apiHost = useApiHost(); - const start = fromUnixTime(event.start_time); - const end = fromUnixTime(event.end_time); - const duration = addSeconds(new Date(0), differenceInSeconds(end, start)); - const seconds = Math.max(differenceInSeconds(start, startOfHour(start)) - delay - 10, 0); - return ( - -
-
- -
-
-
-
{event.label}
-
{(event.top_score * 100).toFixed(1)}%
-
- - {format(start, 'HH:mm:ss')} ({format(duration, 'mm:ss')}) - -
-
-
-
- - ); -} diff --git a/web/src/components/RecordingPlaylist.jsx b/web/src/components/RecordingPlaylist.jsx index 491bdbe31..567c9f224 100644 --- a/web/src/components/RecordingPlaylist.jsx +++ b/web/src/components/RecordingPlaylist.jsx @@ -1,11 +1,12 @@ -import { h } from 'preact'; +import { h, Fragment } from 'preact'; import { useState } from 'preact/hooks'; -import { format, parseISO } from 'date-fns'; -import Accordion from '../components/Accordion'; -import EventCard from '../components/EventCard'; +import { addSeconds, differenceInSeconds, fromUnixTime, format, parseISO, startOfHour } from 'date-fns'; +import ArrowDropdown from '../icons/ArrowDropdown'; +import ArrowDropup from '../icons/ArrowDropup'; import Link from '../components/Link'; import Menu from '../icons/Menu'; import MenuOpen from '../icons/MenuOpen'; +import { useApiHost } from '../api'; export default function RecordingPlaylist({ camera, recordings, selectedDate, selectedHour }) { const [active, setActive] = useState(true); @@ -15,32 +16,45 @@ export default function RecordingPlaylist({ camera, recordings, selectedDate, se for (const recording of recordings.slice().reverse()) { const date = parseISO(recording.date); result.push( - - {recording.recordings.map((item) => ( -
-
- {recording.date === selectedDate && item.hour === selectedHour ? ( - {item.hour}:00 + + {recording.recordings.map((item, i) => ( +
+
+ {selectedDate == recording.date && selectedHour === item.hour ? ( + +
{item.hour}:00
+
Now Playing
+
) : ( - - {item.hour}:00 - +
+ + {item.hour}:00 + +
)} - {item.events.length} Events +
{item.events.length} Events
{item.events.map((event) => ( ))}
))} - +
); } const openClass = active ? '-left-6' : 'right-0'; return ( -
+
: }
@@ -58,6 +72,49 @@ export default function RecordingPlaylist({ camera, recordings, selectedDate, se ); } -export function Heading({ title }) { - return
{title}
; +export function ExpandableList({ title, events = 0, children, selected = false }) { + const [active, setActive] = useState(selected); + const toggle = () => setActive(!active); + return ( +
+
+
{title}
+
{events} Events
+
{active ? : }
+
+
{children}
+
+ ); +} + +export function EventCard({ camera, event, delay }) { + const apiHost = useApiHost(); + const start = fromUnixTime(event.start_time); + const end = fromUnixTime(event.end_time); + const duration = addSeconds(new Date(0), differenceInSeconds(end, start)); + const seconds = Math.max(differenceInSeconds(start, startOfHour(start)) - delay - 10, 0); + return ( + +
+
+ +
+
+
+
+
+
{event.label}
+
+ {format(start, 'HH:mm:ss')} - {format(end, 'HH:mm:ss')} +
+
Duration: {format(duration, 'mm:ss')}
+
+
{(event.top_score * 100).toFixed(1)}%
+
+
+
+
+
+ + ); }