- Add support for Frigate reviews / detections. - Add support for GenAI metadata. - Significant internal refactor to more flexible "UnifiedQuery" to allow mixing cameras with simple metadata and review metadata (e.g. a timeline view of a Frigate camera with reviews, and a Reolink camera with simple metadata). - Add support for folder media as camera media. There are a few more PRs to commit prior to this going live, but commiting this for now due to the scale of the change. BREAKING CHANGE: `media_type` and `events_type` are retired under `live`, `viewer` and `timeline` configuration sections, instead media type is associated (once) with the camera under `media`.
97 lines
2.6 KiB
TypeScript
97 lines
2.6 KiB
TypeScript
import { ConditionState } from '../../conditions/types';
|
|
import { FolderConfig, FolderType, folderTypeSchema } from '../../config/schema/folders';
|
|
import { HomeAssistant } from '../../ha/types';
|
|
import { Endpoint } from '../../types';
|
|
import { ViewFolder, ViewItem } from '../../view/item';
|
|
import { ViewItemCapabilities } from '../../view/types';
|
|
import { sortItems } from '../view/sort';
|
|
import { HAFoldersEngine } from './ha/engine';
|
|
import { DownloadHelpers, EngineOptions, FolderQuery, FoldersEngine } from './types';
|
|
|
|
export class FoldersExecutor {
|
|
private _ha: FoldersEngine;
|
|
|
|
constructor(engines?: { ha?: HAFoldersEngine }) {
|
|
this._ha = engines?.ha ?? new HAFoldersEngine();
|
|
}
|
|
|
|
public getDefaultQueryParameters(folder: FolderConfig): FolderQuery | null {
|
|
return this._getFolderEngine(folder.type)?.getDefaultQueryParameters(folder) ?? null;
|
|
}
|
|
|
|
public generateChildFolderQuery(
|
|
query: FolderQuery,
|
|
folder: ViewFolder,
|
|
): FolderQuery | null {
|
|
return (
|
|
this._getFolderEngine(query.folder.type)?.generateChildFolderQuery(
|
|
query,
|
|
folder,
|
|
) ?? null
|
|
);
|
|
}
|
|
|
|
public async expandFolder(
|
|
hass: HomeAssistant,
|
|
query: FolderQuery,
|
|
conditionState?: ConditionState,
|
|
engineOptions?: EngineOptions,
|
|
): Promise<ViewItem[] | null> {
|
|
const results =
|
|
(await this._getFolderEngine(query.folder.type)?.expandFolder(
|
|
hass,
|
|
query,
|
|
conditionState,
|
|
engineOptions,
|
|
)) ?? null;
|
|
return results ? sortItems(results) : null;
|
|
}
|
|
|
|
public getItemCapabilities(item: ViewItem): ViewItemCapabilities | null {
|
|
return (
|
|
this._getFolderEngine(item.getFolder()?.type)?.getItemCapabilities(item) ?? null
|
|
);
|
|
}
|
|
|
|
public async getDownloadPath(
|
|
hass: HomeAssistant | null,
|
|
item: ViewItem,
|
|
helpers?: DownloadHelpers,
|
|
): Promise<Endpoint | null> {
|
|
return await (this._getFolderEngine(item.getFolder()?.type)?.getDownloadPath(
|
|
hass,
|
|
item,
|
|
helpers,
|
|
) ?? null);
|
|
}
|
|
|
|
public async favorite(
|
|
hass: HomeAssistant | null,
|
|
item: ViewItem,
|
|
favorite: boolean,
|
|
): Promise<void> {
|
|
return await this._getFolderEngine(item.getFolder()?.type)?.favorite(
|
|
hass,
|
|
item,
|
|
favorite,
|
|
);
|
|
}
|
|
|
|
public areResultsFresh(resultsTimestamp: Date, query: FolderQuery): boolean {
|
|
return (
|
|
this._getFolderEngine(query.folder.type)?.areResultsFresh(
|
|
resultsTimestamp,
|
|
query,
|
|
) ?? true
|
|
);
|
|
}
|
|
|
|
private _getFolderEngine(type?: FolderType): FoldersEngine | null {
|
|
switch (type) {
|
|
case folderTypeSchema.enum.ha:
|
|
return this._ha;
|
|
}
|
|
return null;
|
|
}
|
|
}
|