Add limit support for recordings.

This commit is contained in:
Dermot Duffy
2023-01-24 19:36:54 -08:00
parent 980ba1fc6f
commit 401e7c5255
2 changed files with 25 additions and 9 deletions
+25 -7
View File
@@ -5,10 +5,10 @@ import getUnixTime from 'date-fns/getUnixTime';
import startOfHour from 'date-fns/startOfHour';
import { CAMERA_BIRDSEYE } from '../../const';
import { CameraConfig, RecordingSegment } from '../../types';
import { MediaQueriesResults } from "../../view/media-queries-results";
import { MediaQueriesClassifier } from "../../view/media-queries-classifier";
import { MediaQueriesResults } from '../../view/media-queries-results';
import { MediaQueriesClassifier } from '../../view/media-queries-classifier';
import { ViewMedia, ViewMediaFactory } from '../../view/media';
import { ViewMediaClassifier } from "../../view/media-classifier";
import { ViewMediaClassifier } from '../../view/media-classifier';
import { errorToConsole } from '../../utils/basic';
import { RecordingSegmentsCache } from '../cache';
import {
@@ -34,8 +34,16 @@ import {
RecordingSegmentsQuery,
} from '../types';
import { FrigateRecording, RecordingSummary } from './types';
import { getEvents, getRecordingSegments, getRecordingsSummary, NativeFrigateEventQuery, NativeFrigateRecordingSegmentsQuery, retainEvent } from './requests';
import {
getEvents,
getRecordingSegments,
getRecordingsSummary,
NativeFrigateEventQuery,
NativeFrigateRecordingSegmentsQuery,
retainEvent,
} from './requests';
import { MediaQueries } from '../../view/media-queries';
import orderBy from 'lodash-es/orderBy';
const EVENT_REQUEST_CACHE_MAX_AGE_SECONDS = 60;
const RECORDING_SUMMARY_REQUEST_CACHE_MAX_AGE_SECONDS = 60;
@@ -182,13 +190,12 @@ export class FrigateCameraManagerEngine implements CameraManagerEngine {
};
try {
const result: FrigateEventQueryResults = {
return <FrigateEventQueryResults>{
type: QueryResultsType.Event,
engine: Engine.Frigate,
events: await getEvents(hass, nativeQuery),
expiry: add(new Date(), { seconds: EVENT_REQUEST_CACHE_MAX_AGE_SECONDS }),
};
return result;
} catch (e) {
errorToConsole(e as Error);
throw new CameraManagerError((e as Error).message, query);
@@ -220,7 +227,8 @@ export class FrigateCameraManagerEngine implements CameraManagerEngine {
throw new CameraManagerError((e as Error).message, query);
}
const recordings: FrigateRecording[] = [];
let recordings: FrigateRecording[] = [];
for (const dayData of recordingSummary ?? []) {
for (const hourData of dayData.hours) {
const hour = add(dayData.day, { hours: hourData.hour });
@@ -240,6 +248,16 @@ export class FrigateCameraManagerEngine implements CameraManagerEngine {
}
}
if (query.limit !== undefined) {
// Frigate does not natively support a way to limit recording searches so
// this simulates it.
recordings = orderBy(
recordings,
(recording: FrigateRecording) => recording.start_time,
'desc',
).slice(0, query.limit);
}
return <FrigateRecordingQueryResults>{
type: QueryResultsType.Recording,
engine: Engine.Frigate,