Cache media-metadata requests.

This commit is contained in:
Dermot Duffy
2023-02-18 19:20:10 -08:00
parent 90b4d249d4
commit 425782f347
6 changed files with 122 additions and 53 deletions
+34 -19
View File
@@ -31,6 +31,8 @@ import {
ResultsMap,
CameraEndpoints,
Engine,
MediaMetadataQuery,
MediaMetadataQueryResults,
} from './types.js';
import orderBy from 'lodash-es/orderBy';
import { CameraManagerEngineFactory } from './engine-factory.js';
@@ -62,6 +64,11 @@ class QueryClassifier {
): query is RecordingSegmentsQuery {
return query.type === QueryType.RecordingSegments;
}
public static isMediaMetadataQuery(
query: DataQuery | PartialDataQuery,
): query is MediaMetadataQuery {
return query.type === QueryType.MediaMetadata;
}
}
class QueryResultClassifier {
@@ -80,6 +87,11 @@ class QueryResultClassifier {
): queryResults is RecordingSegmentsQueryResults {
return queryResults.type === QueryResultsType.RecordingSegments;
}
public static isMediaMetadataQuery(
queryResults: QueryResults,
): queryResults is MediaMetadataQueryResults {
return queryResults.type === QueryResultsType.MediaMetadata;
}
}
export interface ExtendedMediaQueryResult<T extends MediaQuery> {
@@ -268,27 +280,24 @@ export class CameraManager {
const where: Set<string> = new Set();
const days: Set<string> = new Set();
const engines = this._store.getAllEngines();
const processMetadata = async (engine: CameraManagerEngine): Promise<void> => {
const engineMetadata = await engine.getMediaMetadata(
hass,
this._store.getCameras(),
);
if (engineMetadata) {
if (engineMetadata.what) {
engineMetadata.what.forEach(what.add, what);
}
if (engineMetadata.where) {
engineMetadata.where.forEach(where.add, where);
}
if (engineMetadata.days) {
engineMetadata.days.forEach(days.add, days);
}
}
const query: MediaMetadataQuery = {
type: QueryType.MediaMetadata,
cameraIDs: this._store.getCameraIDs(),
};
await allPromises(engines, processMetadata);
const results = await this._handleQuery(hass, query);
for (const [query, result] of results?.entries() ?? []) {
if (result.metadata.what) {
result.metadata.what.forEach(what.add, what);
}
if (result.metadata.where) {
result.metadata.where.forEach(where.add, where);
}
if (result.metadata.days) {
result.metadata.days.forEach(days.add, days);
}
}
if (!what.size && !where.size && !days.size) {
return null;
@@ -569,6 +578,12 @@ export class CameraManager {
this._store.getCameras(),
query,
)) as Map<QT, QueryReturnType<QT>> | null;
} else if (QueryClassifier.isMediaMetadataQuery(query)) {
engineResult = (await engine.getMediaMetadata(
hass,
this._store.getCameras(),
query,
)) as Map<QT, QueryReturnType<QT>> | null;
}
engineResult?.forEach((value, key) => results.set(key, value));