Use a MediaQueriesClassifier for consistency.

This commit is contained in:
Dermot Duffy
2023-01-24 19:36:54 -08:00
parent 962311f241
commit 9cdf4e8e4d
4 changed files with 44 additions and 31 deletions
+3 -3
View File
@@ -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();
+11 -5
View File
@@ -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<void> {
protected async _timelineClickHandler(
properties: TimelineEventPropertiesResult,
): Promise<void> {
// 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(),
@@ -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)
) {
+2 -2
View File
@@ -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;
}
+18 -11
View File
@@ -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<T extends MediaQuery> {
protected _queries: T[] | null = null;
@@ -69,14 +81,6 @@ export class MediaQueriesBase<T extends MediaQuery> {
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;