diff --git a/src/frigate-hass-card.scss b/src/frigate-hass-card.scss index 572963c2..7c3d41ad 100644 --- a/src/frigate-hass-card.scss +++ b/src/frigate-hass-card.scss @@ -44,6 +44,20 @@ @include image-list.shape-radius(5px); } +ha-card .frigate-card-image-list-folder { + display: flex; + justify-content: center; + align-items: center; + box-sizing: border-box; + text-align: center; + border-style: 2px solid; + color: var(--secondary-text-color, white); + border-color: var(--secondary-text-color, black); + background-color: var(--primary-background-color, black); + --mdc-icon-size: 40px; + padding: 10px; +} + video, img { display: block; } @@ -61,8 +75,8 @@ ha-card { transform-style: preserve-3d; /* Safari brings video elements forward without this */ } -/* Don't drop shadow or have radius for nested cards: webrtc */ -ha-card ha-card { +/* Don't drop shadow or have radius for nested webrtc card */ +webrtc-camera ha-card { box-shadow: none; border-radius: 0px; background-color: var(--secondary-background-color, black); diff --git a/src/frigate-hass-card.ts b/src/frigate-hass-card.ts index 78de4f83..52985185 100644 --- a/src/frigate-hass-card.ts +++ b/src/frigate-hass-card.ts @@ -120,9 +120,13 @@ export class FrigateCardMenu extends LitElement { // Call the callback. protected _callAction(name: string): void { - if (name == 'frigate' && this.menuMode == 'hidden') { - this.expand = !this.expand; - return; + if (this.menuMode == 'hidden') { + if (name == 'frigate') { + this.expand = !this.expand; + return; + } + // Collapse menu after the user clicks on something. + this.expand = false; } if (this.actionCallback) { @@ -133,7 +137,7 @@ export class FrigateCardMenu extends LitElement { // Render a menu button. protected _renderButton(name: string, button: MenuButton): TemplateResult { return html` { + const request = { + type: 'media_source/browse_media', + media_content_id: media_content_id, + }; + return this._makeWSRequest(browseMediaSourceSchema, request); + } + + // Browse Frigate media with query parameters. + protected async _browseMediaQuery( want_clips?: boolean, before?: number, after?: number, ): Promise { - // Defined in: - // https://github.com/blakeblackshear/frigate-hass-integration/blob/master/custom_components/frigate/media_source.py - const request = { - type: 'media_source/browse_media', - media_content_id: [ + return this._browseMedia( + // Defined in: + // https://github.com/blakeblackshear/frigate-hass-integration/blob/master/custom_components/frigate/media_source.py + [ 'media-source://frigate', this.config.frigate_client_id, 'event-search', @@ -410,8 +416,7 @@ export class FrigateCard extends LitElement { this.config.label, this.config.zone, ].join('/'), - }; - return this._makeWSRequest(browseMediaSourceSchema, request); + ); } // Resolve Frigate media identifier to a real URL. @@ -453,7 +458,11 @@ export class FrigateCard extends LitElement { const want_clips = this._viewMode == 'clips'; let media; try { - media = await this._browseMedia(want_clips); + if (this._requestedMediaSource) { + media = await this._browseMedia(this._requestedMediaSource.media_content_id); + } else { + media = await this._browseMediaQuery(want_clips); + } } catch (e: any) { return this._renderError(e.message); } @@ -466,22 +475,33 @@ export class FrigateCard extends LitElement { } return html` `; } @@ -645,7 +665,7 @@ export class FrigateCard extends LitElement { } else { let media; try { - media = await this._browseMedia(true); + media = await this._browseMediaQuery(true); } catch (e: any) { return this._renderError(e.message); } @@ -726,7 +746,11 @@ export class FrigateCard extends LitElement { if (startTime) { try { // Fetch clips within the same second (same camera/zone/label, etc). - const clipsAtSameTime = await this._browseMedia(true, startTime + 1, startTime); + const clipsAtSameTime = await this._browseMediaQuery( + true, + startTime + 1, + startTime, + ); if (clipsAtSameTime) { return this._getFirstTrueMediaItem(clipsAtSameTime); } @@ -745,7 +769,7 @@ export class FrigateCard extends LitElement { } else { let media; try { - media = await this._browseMedia(false); + media = await this._browseMediaQuery(false); } catch (e: any) { return this._renderError(e.message); }