From 7896dfeb3cef27a28334e76859ffd417329b77c1 Mon Sep 17 00:00:00 2001 From: Dermot Duffy Date: Sun, 8 Jan 2023 20:31:38 -0800 Subject: [PATCH] Rip out unnecessary view media templating. --- src/camera/frigate/media.ts | 73 +++++++++++++++++++++--------------- src/components/thumbnail.ts | 4 +- src/view/media-classifier.ts | 4 +- src/view/media.ts | 17 +++------ 4 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/camera/frigate/media.ts b/src/camera/frigate/media.ts index b58b8c07..89965b8e 100644 --- a/src/camera/frigate/media.ts +++ b/src/camera/frigate/media.ts @@ -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 - implements EventViewMedia -{ +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): 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 | 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 - implements RecordingViewMedia -{ +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; } } diff --git a/src/components/thumbnail.ts b/src/components/thumbnail.ts index 531b6c82..f7b3aeee 100644 --- a/src/components/thumbnail.ts +++ b/src/components/thumbnail.ts @@ -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; + 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; + public media?: RecordingViewMedia; @property({ attribute: false }) public mediaSeek?: MediaSeek; diff --git a/src/view/media-classifier.ts b/src/view/media-classifier.ts index ab71290d..be9668c1 100644 --- a/src/view/media-classifier.ts +++ b/src/view/media-classifier.ts @@ -1,10 +1,10 @@ import { ViewMedia, RecordingViewMedia, EventViewMedia } from './media'; export class ViewMediaClassifier { - public static isEvent(media: ViewMedia): media is EventViewMedia { + public static isEvent(media: ViewMedia): media is EventViewMedia { return this.isClip(media) || this.isSnapshot(media); } - public static isRecording(media: ViewMedia): media is RecordingViewMedia { + public static isRecording(media: ViewMedia): media is RecordingViewMedia { return media.getMediaType() === 'recording'; } public static isClip(media: ViewMedia): boolean { diff --git a/src/view/media.ts b/src/view/media.ts index 6b87f65d..0d051e3f 100644 --- a/src/view/media.ts +++ b/src/view/media.ts @@ -1,15 +1,13 @@ import { CameraConfig } from '../types.js'; export type ViewMediaType = 'clip' | 'snapshot' | 'recording'; -export class ViewMediaBase { +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 { 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 { } } -export interface EventViewMedia extends ViewMediaBase { +export interface EventViewMedia extends ViewMedia { getScore(): number | null; getWhat(): string[] | null; - isGroupableWith(that: EventViewMedia): boolean; + isGroupableWith(that: EventViewMedia): boolean; hasClip(): boolean | null; } -export interface RecordingViewMedia extends ViewMediaBase { +export interface RecordingViewMedia extends ViewMedia { getEventCount(): number | null; } - -export type ViewMedia = ViewMediaBase;