diff --git a/src/camera/frigate/engine-frigate.ts b/src/camera/frigate/engine-frigate.ts index 327f9139..9d9bf05d 100644 --- a/src/camera/frigate/engine-frigate.ts +++ b/src/camera/frigate/engine-frigate.ts @@ -5,7 +5,7 @@ import getUnixTime from 'date-fns/getUnixTime'; import startOfHour from 'date-fns/startOfHour'; import { CAMERA_BIRDSEYE } from '../../const'; import { CameraConfig, RecordingSegment } from '../../types'; -import { MediaQueries, MediaQueriesResults } from '../../view'; +import { MediaQueries, MediaQueriesClassifier, MediaQueriesResults } from '../../view'; import { ViewMedia, ViewMediaClassifier, ViewMediaFactory } from '../../view-media'; import { errorToConsole } from '../../utils/basic'; import { RecordingSegmentsCache } from '../cache'; @@ -362,9 +362,9 @@ export class FrigateCameraManagerEngine implements CameraManagerEngine { results: MediaQueriesResults, ): boolean { let freshThreshold: number | null = null; - if (queries.areEventQueries()) { + if (MediaQueriesClassifier.areEventQueries(queries)) { freshThreshold = EVENT_REQUEST_CACHE_MAX_AGE_SECONDS; - } else if (queries.areRecordingQueries()) { + } else if (MediaQueriesClassifier.areRecordingQueries(queries)) { freshThreshold = RECORDING_SUMMARY_REQUEST_CACHE_MAX_AGE_SECONDS; } const now = new Date(); diff --git a/src/components/timeline-core.ts b/src/components/timeline-core.ts index aa4f1692..edd6f04f 100644 --- a/src/components/timeline-core.ts +++ b/src/components/timeline-core.ts @@ -50,7 +50,7 @@ import { generateMediaViewerContext, } from '../utils/media-to-view'; import { CameraManager } from '../camera/manager'; -import { EventMediaQueries, MediaQueries, View } from '../view'; +import { EventMediaQueries, MediaQueries, MediaQueriesClassifier, View } from '../view'; import { dispatchMessageEvent } from './message.js'; import './thumbnail.js'; import { FrigateCardTimelineItem, TimelineDataSource } from '../utils/timeline-source'; @@ -435,7 +435,9 @@ export class FrigateCardTimelineCore extends LitElement { * Called whenever the timeline is clicked. * @param properties The properties of the timeline click event. */ - protected async _timelineClickHandler(properties: TimelineEventPropertiesResult): Promise { + protected async _timelineClickHandler( + properties: TimelineEventPropertiesResult, + ): Promise { // Calls to stopEventFromActivatingCardWideActions() are included for // completeness. Timeline does not support card-wide events and they are // disabled in card.ts in `_getMergedActions`. @@ -496,7 +498,7 @@ export class FrigateCardTimelineCore extends LitElement { } else if ( properties.item && properties.what === 'item' && - this.view.query?.areRecordingQueries() + MediaQueriesClassifier.areRecordingQueries(this.view.query) ) { const eventView = await this._createViewWithEventMediaQuery( this._createEventMediaQuerys(), @@ -525,16 +527,16 @@ export class FrigateCardTimelineCore extends LitElement { this.view.queryResults?.hasResults() && this.view.query ) { - view = this.view.evolve({ - queryResults: this.view.queryResults - ?.clone() - .resetSelectedResult() - .selectResultIfFound( - (media) => - !!this.cameras && - media.getID(this.cameras.get(media.getCameraID())) === properties.item, - ), - }); + view = this.view.evolve({ + queryResults: this.view.queryResults + ?.clone() + .resetSelectedResult() + .selectResultIfFound( + (media) => + !!this.cameras && + media.getID(this.cameras.get(media.getCameraID())) === properties.item, + ), + }); } if (view) { @@ -592,7 +594,11 @@ export class FrigateCardTimelineCore extends LitElement { // Don't show event thumbnails if the user is looking at recordings, // as the recording "hours" are the media, not the event // clips/snapshots. - if (this._timeline && this.view && !this.view.query?.areRecordingQueries()) { + if ( + this._timeline && + this.view && + !MediaQueriesClassifier.areRecordingQueries(this.view.query) + ) { ( await this._createViewWithEventMediaQuery( this._createEventMediaQuerys({ window: prefetchedWindow }), @@ -954,7 +960,7 @@ export class FrigateCardTimelineCore extends LitElement { if ( !this.mini && - !this.view.query?.areRecordingQueries() && + !MediaQueriesClassifier.areRecordingQueries(this.view.query) && freshMediaQuery && !this._alreadyHasAcceptableMediaQuery(freshMediaQuery) ) { diff --git a/src/components/viewer.ts b/src/components/viewer.ts index 503fcd84..98243ec2 100644 --- a/src/components/viewer.ts +++ b/src/components/viewer.ts @@ -30,7 +30,7 @@ import { stopEventFromActivatingCardWideActions } from '../utils/action.js'; import { contentsChanged } from '../utils/basic.js'; import { getFullDependentBrowseMediaQueryParametersOrDispatchError } from '../utils/ha/browse-media.js'; import { ResolvedMediaCache, resolveMedia } from '../utils/ha/resolved-media.js'; -import { MediaQueriesResults, View } from '../view.js'; +import { MediaQueriesClassifier, MediaQueriesResults, View } from '../view.js'; import { AutoMediaPlugin } from './embla-plugins/automedia.js'; import { Lazyload } from './embla-plugins/lazyload.js'; import { @@ -372,7 +372,7 @@ export class FrigateCardViewerCarousel extends LitElement { // the other media items do). !ViewMediaClassifier.isFrigateEvent(media) || !media.hasClip() || - !this.view.query?.areEventQueries() + !MediaQueriesClassifier.areEventQueries(this.view.query) ) { return null; } diff --git a/src/view.ts b/src/view.ts index e930692d..3cc0c2fe 100644 --- a/src/view.ts +++ b/src/view.ts @@ -4,7 +4,6 @@ // - TODO: Should be able to set live media to 'all' and have it work. // - TODO: Are there elements of ViewMedia (e.g. getEventCount) that should be moved into subclasses (e.g. a recording subclass). // - TODO: In MediaQueriesBase, do we need to generic? Just have T be a MediaQuery? -// - TODO: Are areEventQueries and areRecordingQueries should be in a classifier to keep with the pattern used elsewhere. // - TODO: In the viewer @click handlers should I use this.selected instead of calling carouselScrollPrevious() // Medium: @@ -24,7 +23,6 @@ // - TODO: What should the timeline do when an event is clicked on that is not in the queryResults (or if queryResults is empty)? // - TODO: Should the timeline data source clear events (as it currently does) when the query changes? - import isEqual from 'lodash-es/isEqual'; import clone from 'lodash-es/clone.js'; import cloneDeep from 'lodash-es/cloneDeep.js'; @@ -52,6 +50,20 @@ export interface ViewParameters extends ViewEvolveParameters { camera: string; } +export class MediaQueriesClassifier { + public static areEventQueries( + queries?: MediaQueries | null, + ): queries is EventMediaQueries { + return queries instanceof EventMediaQueries; + } + + public static areRecordingQueries( + queries?: MediaQueries | null, + ): queries is RecordingMediaQueries { + return queries instanceof RecordingMediaQueries; + } +} + export class MediaQueriesBase { protected _queries: T[] | null = null; @@ -69,14 +81,6 @@ export class MediaQueriesBase { return isEqual(this.getQueries(), that.getQueries()); } - public areEventQueries(): this is EventMediaQueries { - return this instanceof EventMediaQueries; - } - - public areRecordingQueries(): this is RecordingMediaQueries { - return this instanceof RecordingMediaQueries; - } - public getQueries(): T[] | null { return this._queries; } @@ -177,7 +181,10 @@ export class MediaQueriesResults { } public selectResult(index: number | null): MediaQueriesResults { - if (index === null || (this._results && index >= 0 && index < this._results.length)) { + if ( + index === null || + (this._results && index >= 0 && index < this._results.length) + ) { this._selectedIndex = index; } return this;