Rip out unnecessary view media templating.

This commit is contained in:
Dermot Duffy
2023-01-24 19:36:54 -08:00
parent 09c38d96f6
commit 7896dfeb3c
4 changed files with 52 additions and 46 deletions
+43 -30
View File
@@ -1,7 +1,12 @@
import fromUnixTime from 'date-fns/fromUnixTime';
import isEqual from 'lodash-es/isEqual';
import { CameraConfig } from '../../types';
import { ViewMediaBase, EventViewMedia, RecordingViewMedia } from '../../view/media';
import {
ViewMedia,
EventViewMedia,
RecordingViewMedia,
ViewMediaType,
} from '../../view/media';
import { FrigateEvent, FrigateRecording } from './types';
import {
getEventMediaContentID,
@@ -11,22 +16,26 @@ import {
getRecordingTitle,
} from './util';
export class FrigateEventViewMedia
extends ViewMediaBase<FrigateEvent>
implements EventViewMedia<FrigateEvent>
{
export class FrigateEventViewMedia extends ViewMedia implements EventViewMedia {
protected _event: FrigateEvent;
constructor(mediaType: ViewMediaType, cameraID: string, event: FrigateEvent) {
super(mediaType, cameraID);
this._event = event;
}
public hasClip(): boolean {
return !!this._source.has_clip;
return !!this._event.has_clip;
}
public getStartTime(): Date {
return fromUnixTime(this._source.start_time);
return fromUnixTime(this._event.start_time);
}
public getEndTime(): Date | null {
return this._source.end_time ? fromUnixTime(this._source.end_time) : null;
return this._event.end_time ? fromUnixTime(this._event.end_time) : null;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
public getID(_cameraConfig?: CameraConfig): string {
return this._source.id;
return this._event.id;
}
public getContentID(cameraConfig?: CameraConfig): string | null {
if (
@@ -39,41 +48,41 @@ export class FrigateEventViewMedia
return getEventMediaContentID(
cameraConfig.frigate.client_id,
cameraConfig.frigate.camera_name,
this._source,
this._event,
this._mediaType === 'clip' ? 'clips' : 'snapshots',
);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
public getTitle(_cameraConfig?: CameraConfig): string | null {
return getEventTitle(this._source);
return getEventTitle(this._event);
}
public getThumbnail(cameraConfig?: CameraConfig): string | null {
if (cameraConfig?.frigate.client_id) {
return getEventThumbnailURL(cameraConfig.frigate.client_id, this._source);
return getEventThumbnailURL(cameraConfig.frigate.client_id, this._event);
}
return null;
}
public isFavorite(): boolean | null {
return this._source.retain_indefinitely ?? null;
return this._event.retain_indefinitely ?? null;
}
public setFavorite(favorite: boolean): void {
this._source.retain_indefinitely = favorite;
this._event.retain_indefinitely = favorite;
}
public getWhat(): string[] | null {
return [this._source.label];
return [this._event.label];
}
public getWhere(): string[] | null {
const zones = this._source.zones;
const zones = this._event.zones;
return zones.length ? zones : null;
}
public getScore(): number | null {
return this._source.top_score;
return this._event.top_score;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
public isGroupableWith(that: EventViewMedia<unknown>): boolean {
public isGroupableWith(that: EventViewMedia): boolean {
return (
this.getMediaType() === that.getMediaType() &&
isEqual(this.getWhere(), that.getWhere()) &&
@@ -81,22 +90,26 @@ export class FrigateEventViewMedia
);
}
public getClipEquivalent(): EventViewMedia<FrigateEvent> | null {
public getClipEquivalent(): EventViewMedia | null {
if (!this.hasClip()) {
return null;
}
return FrigateViewMediaFactory.createEventViewMedia(
'clip',
this._cameraID,
this._source,
this._event,
);
}
}
export class FrigateRecordingViewMedia
extends ViewMediaBase<FrigateRecording>
implements RecordingViewMedia<FrigateRecording>
{
export class FrigateRecordingViewMedia extends ViewMedia implements RecordingViewMedia {
protected _recording: FrigateRecording;
constructor(mediaType: ViewMediaType, cameraID: string, recording: FrigateRecording) {
super(mediaType, cameraID);
this._recording = recording;
}
public getID(cameraConfig?: CameraConfig): string | null {
// ID name is derived from the real camera name (not CameraID) since the
// recordings for the same camera across multiple zones will be the same and
@@ -104,15 +117,15 @@ export class FrigateRecordingViewMedia
if (cameraConfig) {
return `${cameraConfig.frigate?.client_id ?? ''}/${
cameraConfig.frigate.camera_name ?? ''
}/${this._source.startTime.getTime()}/${this._source.endTime.getTime()}}`;
}/${this._recording.startTime.getTime()}/${this._recording.endTime.getTime()}}`;
}
return null;
}
public getStartTime(): Date {
return this._source.startTime;
return this._recording.startTime;
}
public getEndTime(): Date {
return this._source.endTime;
return this._recording.endTime;
}
public getContentID(cameraConfig?: CameraConfig): string | null {
if (
@@ -125,7 +138,7 @@ export class FrigateRecordingViewMedia
return getRecordingMediaContentID(
cameraConfig.frigate.client_id,
cameraConfig.frigate.camera_name,
this._source,
this._recording,
);
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -133,10 +146,10 @@ export class FrigateRecordingViewMedia
if (!cameraConfig) {
return null;
}
return getRecordingTitle(cameraConfig, this._source);
return getRecordingTitle(cameraConfig, this._recording);
}
public getEventCount(): number {
return this._source.events;
return this._recording.events;
}
}
+2 -2
View File
@@ -128,7 +128,7 @@ export class FrigateCardThumbnailFeatureRecording extends LitElement {
@customElement('frigate-card-thumbnail-details-event')
export class FrigateCardThumbnailDetailsEvent extends LitElement {
@property({ attribute: false })
public media?: EventViewMedia<unknown>;
public media?: EventViewMedia;
@property({ attribute: false })
public mediaSeek?: MediaSeek;
@@ -180,7 +180,7 @@ export class FrigateCardThumbnailDetailsEvent extends LitElement {
@customElement('frigate-card-thumbnail-details-recording')
export class FrigateCardThumbnailDetailsRecording extends LitElement {
@property({ attribute: false })
public media?: RecordingViewMedia<unknown>;
public media?: RecordingViewMedia;
@property({ attribute: false })
public mediaSeek?: MediaSeek;
+2 -2
View File
@@ -1,10 +1,10 @@
import { ViewMedia, RecordingViewMedia, EventViewMedia } from './media';
export class ViewMediaClassifier {
public static isEvent(media: ViewMedia): media is EventViewMedia<unknown> {
public static isEvent(media: ViewMedia): media is EventViewMedia {
return this.isClip(media) || this.isSnapshot(media);
}
public static isRecording(media: ViewMedia): media is RecordingViewMedia<unknown> {
public static isRecording(media: ViewMedia): media is RecordingViewMedia {
return media.getMediaType() === 'recording';
}
public static isClip(media: ViewMedia): boolean {
+5 -12
View File
@@ -1,15 +1,13 @@
import { CameraConfig } from '../types.js';
export type ViewMediaType = 'clip' | 'snapshot' | 'recording';
export class ViewMediaBase<T> {
export class ViewMedia {
protected _mediaType: ViewMediaType;
protected _cameraID: string;
protected _source: T;
constructor(mediaType: ViewMediaType, cameraID: string, source: T) {
constructor(mediaType: ViewMediaType, cameraID: string) {
this._mediaType = mediaType;
this._cameraID = cameraID;
this._source = source;
}
public getContentType(): 'image' | 'video' {
return this._mediaType === 'snapshot' ? 'image' : 'video';
@@ -20,9 +18,6 @@ export class ViewMediaBase<T> {
public getMediaType(): ViewMediaType {
return this._mediaType;
}
public getSource(): T {
return this._source;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
public getID(_cameraConfig?: CameraConfig): string | null {
return null;
@@ -60,15 +55,13 @@ export class ViewMediaBase<T> {
}
}
export interface EventViewMedia<T> extends ViewMediaBase<T> {
export interface EventViewMedia extends ViewMedia {
getScore(): number | null;
getWhat(): string[] | null;
isGroupableWith(that: EventViewMedia<T>): boolean;
isGroupableWith(that: EventViewMedia): boolean;
hasClip(): boolean | null;
}
export interface RecordingViewMedia<T> extends ViewMediaBase<T> {
export interface RecordingViewMedia extends ViewMedia {
getEventCount(): number | null;
}
export type ViewMedia = ViewMediaBase<unknown>;