mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-02 01:05:20 +03:00
Merge branch 'release-0.10.0' of github.com:blakeblackshear/frigate into retain-select-events
This commit is contained in:
commit
a2a2e625e0
@ -283,7 +283,10 @@ def event_clip(id):
|
|||||||
clip_path = os.path.join(CLIPS_DIR, file_name)
|
clip_path = os.path.join(CLIPS_DIR, file_name)
|
||||||
|
|
||||||
if not os.path.isfile(clip_path):
|
if not os.path.isfile(clip_path):
|
||||||
return recording_clip(event.camera, event.start_time, event.end_time)
|
end_ts = (
|
||||||
|
datetime.now().timestamp() if event.end_time is None else event.end_time
|
||||||
|
)
|
||||||
|
return recording_clip(event.camera, event.start_time, end_ts)
|
||||||
|
|
||||||
response = make_response()
|
response = make_response()
|
||||||
response.headers["Content-Description"] = "File Transfer"
|
response.headers["Content-Description"] = "File Transfer"
|
||||||
|
|||||||
@ -158,10 +158,10 @@ class TrackedObject:
|
|||||||
if self.obj_data["position_changes"] != obj_data["position_changes"]:
|
if self.obj_data["position_changes"] != obj_data["position_changes"]:
|
||||||
significant_change = True
|
significant_change = True
|
||||||
|
|
||||||
# if the motionless_count crosses the stationary threshold
|
# if the motionless_count reaches the stationary threshold
|
||||||
if (
|
if (
|
||||||
self.obj_data["motionless_count"]
|
self.obj_data["motionless_count"]
|
||||||
> self.camera_config.detect.stationary_threshold
|
== self.camera_config.detect.stationary_threshold
|
||||||
):
|
):
|
||||||
significant_change = True
|
significant_change = True
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,14 @@
|
|||||||
import { h } from 'preact';
|
import { h } from 'preact';
|
||||||
import { useState } from 'preact/hooks';
|
import { useState } from 'preact/hooks';
|
||||||
import { addSeconds, differenceInSeconds, fromUnixTime, format, parseISO, startOfHour } from 'date-fns';
|
import {
|
||||||
|
differenceInSeconds,
|
||||||
|
fromUnixTime,
|
||||||
|
format,
|
||||||
|
parseISO,
|
||||||
|
startOfHour,
|
||||||
|
differenceInMinutes,
|
||||||
|
differenceInHours,
|
||||||
|
} from 'date-fns';
|
||||||
import ArrowDropdown from '../icons/ArrowDropdown';
|
import ArrowDropdown from '../icons/ArrowDropdown';
|
||||||
import ArrowDropup from '../icons/ArrowDropup';
|
import ArrowDropup from '../icons/ArrowDropup';
|
||||||
import Link from '../components/Link';
|
import Link from '../components/Link';
|
||||||
@ -89,9 +97,16 @@ export function ExpandableList({ title, events = 0, children, selected = false }
|
|||||||
export function EventCard({ camera, event, delay }) {
|
export function EventCard({ camera, event, delay }) {
|
||||||
const apiHost = useApiHost();
|
const apiHost = useApiHost();
|
||||||
const start = fromUnixTime(event.start_time);
|
const start = fromUnixTime(event.start_time);
|
||||||
let duration = 0;
|
let duration = 'In Progress';
|
||||||
if (event.end_time) {
|
if (event.end_time) {
|
||||||
duration = addSeconds(new Date(0), differenceInSeconds(fromUnixTime(event.end_time), start));
|
const end = fromUnixTime(event.end_time);
|
||||||
|
const hours = differenceInHours(end, start);
|
||||||
|
const minutes = differenceInMinutes(end, start) - hours * 60;
|
||||||
|
const seconds = differenceInSeconds(end, start) - hours * 60 - minutes * 60;
|
||||||
|
duration = '';
|
||||||
|
if (hours) duration += `${hours}h `;
|
||||||
|
if (minutes) duration += `${minutes}m `;
|
||||||
|
duration += `${seconds}s`;
|
||||||
}
|
}
|
||||||
const position = differenceInSeconds(start, startOfHour(start));
|
const position = differenceInSeconds(start, startOfHour(start));
|
||||||
const offset = Object.entries(delay)
|
const offset = Object.entries(delay)
|
||||||
@ -110,9 +125,7 @@ export function EventCard({ camera, event, delay }) {
|
|||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<div className="text-2xl text-white leading-tight capitalize">{event.label}</div>
|
<div className="text-2xl text-white leading-tight capitalize">{event.label}</div>
|
||||||
<div className="text-xs md:text-normal text-gray-300">Start: {format(start, 'HH:mm:ss')}</div>
|
<div className="text-xs md:text-normal text-gray-300">Start: {format(start, 'HH:mm:ss')}</div>
|
||||||
<div className="text-xs md:text-normal text-gray-300">
|
<div className="text-xs md:text-normal text-gray-300">Duration: {duration}</div>
|
||||||
Duration: {duration ? format(duration, 'mm:ss') : 'In Progress'}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="text-lg text-white text-right leading-tight">{(event.top_score * 100).toFixed(1)}%</div>
|
<div className="text-lg text-white text-right leading-tight">{(event.top_score * 100).toFixed(1)}%</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -64,11 +64,11 @@ export default function Recording({ camera, date, hour, seconds }) {
|
|||||||
this.player.playlist.currentItem(selectedHour);
|
this.player.playlist.currentItem(selectedHour);
|
||||||
if (seconds !== undefined) {
|
if (seconds !== undefined) {
|
||||||
this.player.currentTime(seconds);
|
this.player.currentTime(seconds);
|
||||||
// Force playback rate to be correct
|
|
||||||
const playbackRate = this.player.playbackRate();
|
|
||||||
this.player.defaultPlaybackRate(playbackRate);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Force playback rate to be correct
|
||||||
|
const playbackRate = this.player.playbackRate();
|
||||||
|
this.player.defaultPlaybackRate(playbackRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user