diff --git a/src/camera-manager/frigate/engine-frigate.ts b/src/camera-manager/frigate/engine-frigate.ts index 1e1788d4..e4e0d6bd 100644 --- a/src/camera-manager/frigate/engine-frigate.ts +++ b/src/camera-manager/frigate/engine-frigate.ts @@ -1076,6 +1076,7 @@ export class FrigateCameraManagerEngine return { canFavoriteEvents: !isBirdseye, canFavoriteRecordings: !isBirdseye, + canSeek: true, supportsClips: !isBirdseye, supportsSnapshots: !isBirdseye, supportsRecordings: !isBirdseye, diff --git a/src/camera-manager/generic/engine-generic.ts b/src/camera-manager/generic/engine-generic.ts index f2d50209..9e9207ba 100644 --- a/src/camera-manager/generic/engine-generic.ts +++ b/src/camera-manager/generic/engine-generic.ts @@ -177,6 +177,7 @@ export class GenericCameraManagerEngine implements CameraManagerEngine { return { canFavoriteEvents: false, canFavoriteRecordings: false, + canSeek: false, supportsClips: false, supportsRecordings: false, supportsSnapshots: false, diff --git a/src/camera-manager/manager.ts b/src/camera-manager/manager.ts index e5f26294..b686082f 100644 --- a/src/camera-manager/manager.ts +++ b/src/camera-manager/manager.ts @@ -747,6 +747,9 @@ export class CameraManager { canFavoriteRecordings: perCameraCapabilities.some( (cap) => cap?.canFavoriteRecordings, ), + canSeek: perCameraCapabilities.some( + (cap) => cap?.canSeek, + ), supportsClips: perCameraCapabilities.some((cap) => cap?.supportsClips), supportsRecordings: perCameraCapabilities.some((cap) => cap?.supportsRecordings), diff --git a/src/camera-manager/types.ts b/src/camera-manager/types.ts index 2cb60907..19b508cc 100644 --- a/src/camera-manager/types.ts +++ b/src/camera-manager/types.ts @@ -94,6 +94,7 @@ export interface MediaMetadata { interface BaseCapabilities { canFavoriteEvents: boolean; canFavoriteRecordings: boolean; + canSeek: boolean; supportsClips: boolean; supportsRecordings: boolean; diff --git a/src/components/timeline-core.ts b/src/components/timeline-core.ts index 4bc8a063..e775c8e5 100644 --- a/src/components/timeline-core.ts +++ b/src/components/timeline-core.ts @@ -280,6 +280,26 @@ export class FrigateCardTimelineCore extends LitElement { ${ref(this._refTimeline)} >
+ ${this._shouldSupportSeeking() + ? html` { + this._locked = !this._locked; + }} + aria-label="${lockTitle}" + title="${lockTitle}" + > + ` + : ''} + { + this._refDatePicker.value?.open(); + }} + > + ) => { @@ -290,24 +310,6 @@ export class FrigateCardTimelineCore extends LitElement { }} > - { - this._refDatePicker.value?.open(); - }} - > - - { - this._locked = !this._locked; - }} - aria-label="${lockTitle}" - title="${lockTitle}" - > -
` : ''}`; @@ -357,6 +359,16 @@ export class FrigateCardTimelineCore extends LitElement { } } + protected _shouldSupportSeeking(): boolean { + const cameraIDs = this._getTimelineCameraIDs(); + if (!this._timeline || !cameraIDs) { + return false; + } + + const capabilities = this.cameraManager?.getAggregateCameraCapabilities(cameraIDs); + return (this.view?.isViewerView() && capabilities?.canSeek) ?? false; + } + /** * Set the target bar at a given time. * @param targetTime @@ -367,18 +379,19 @@ export class FrigateCardTimelineCore extends LitElement { } const targetBarOn = - !this._locked || - (this.mini && - this._timeline.getSelection().some((id) => { - const item = this._timelineSource?.dataset?.get(id); - return ( - item && - item.start && - item.end && - targetTime.getTime() >= item.start && - targetTime.getTime() <= item.end - ); - })); + this._shouldSupportSeeking() && + (!this._locked || + (this.mini && + this._timeline.getSelection().some((id) => { + const item = this._timelineSource?.dataset?.get(id); + return ( + item && + item.start && + item.end && + targetTime.getTime() >= item.start && + targetTime.getTime() <= item.end + ); + }))); if (targetBarOn) { if (!this._targetBarVisible) {