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