Canonicalize media URLs (for the benefit of Chromecast).

This commit is contained in:
Dermot Duffy
2022-05-10 20:36:59 -07:00
parent daf4b611b7
commit d83a5c7d1a
+25 -8
View File
@@ -8,7 +8,6 @@ import {
} from 'lit'; } from 'lit';
import { BrowseMediaUtil } from '../browse-media-util.js'; import { BrowseMediaUtil } from '../browse-media-util.js';
import { EmblaOptionsType, EmblaPluginType } from 'embla-carousel'; import { EmblaOptionsType, EmblaPluginType } from 'embla-carousel';
import { HomeAssistant } from 'custom-card-helpers';
import { Task } from '@lit-labs/task'; import { Task } from '@lit-labs/task';
import { customElement, property } from 'lit/decorators.js'; import { customElement, property } from 'lit/decorators.js';
import { ifDefined } from 'lit/directives/if-defined.js'; import { ifDefined } from 'lit/directives/if-defined.js';
@@ -18,8 +17,9 @@ import { AutoMediaPlugin } from './embla-plugins/automedia.js';
import type { import type {
BrowseMediaNeighbors, BrowseMediaNeighbors,
BrowseMediaQueryParameters, BrowseMediaQueryParameters,
FrigateBrowseMediaSource,
CameraConfig, CameraConfig,
ExtendedHomeAssistant,
FrigateBrowseMediaSource,
MediaShowInfo, MediaShowInfo,
TransitionEffect, TransitionEffect,
ViewerConfig, ViewerConfig,
@@ -45,7 +45,7 @@ import viewerStyle from '../scss/viewer.scss';
@customElement('frigate-card-viewer') @customElement('frigate-card-viewer')
export class FrigateCardViewer extends LitElement { export class FrigateCardViewer extends LitElement {
@property({ attribute: false }) @property({ attribute: false })
protected hass?: HomeAssistant; protected hass?: ExtendedHomeAssistant;
@property({ attribute: false }) @property({ attribute: false })
protected view?: Readonly<View>; protected view?: Readonly<View>;
@@ -125,7 +125,7 @@ export class FrigateCardViewer extends LitElement {
@customElement('frigate-card-viewer-carousel') @customElement('frigate-card-viewer-carousel')
export class FrigateCardViewerCarousel extends FrigateCardMediaCarousel { export class FrigateCardViewerCarousel extends FrigateCardMediaCarousel {
@property({ attribute: false }) @property({ attribute: false })
protected hass?: HomeAssistant; protected hass?: ExtendedHomeAssistant;
@property({ attribute: false }) @property({ attribute: false })
protected view?: Readonly<View>; protected view?: Readonly<View>;
@@ -463,6 +463,18 @@ export class FrigateCardViewerCarousel extends FrigateCardMediaCarousel {
} }
} }
/**
* Ensure media URLs use the correct HA URL (relevant for Chromecast where the
* default location will be the Chromecast receiver, not HA).
* @param url The media URL
*/
protected _canonicalizeHAURL(url?: string): string | undefined {
if (this.hass && url && url.startsWith('/')) {
return this.hass.hassUrl(url);
}
return url;
}
/** /**
* Lazy load a slide. * Lazy load a slide.
* @param index The index of the slide to lazy load. * @param index The index of the slide to lazy load.
@@ -501,9 +513,9 @@ export class FrigateCardViewerCarousel extends FrigateCardMediaCarousel {
) as HTMLElement & { url: string }; ) as HTMLElement & { url: string };
if (img) { if (img) {
img.src = resolvedMedia.url; img.src = this._canonicalizeHAURL(resolvedMedia.url) || '';
} else if (hls_player) { } else if (hls_player) {
hls_player.url = resolvedMedia.url; hls_player.url = this._canonicalizeHAURL(resolvedMedia.url) || '';
} }
}); });
} }
@@ -652,6 +664,7 @@ export class FrigateCardViewerCarousel extends FrigateCardMediaCarousel {
): TemplateResult | void { ): TemplateResult | void {
// Skip folders as they cannot be rendered by this viewer. // Skip folders as they cannot be rendered by this viewer.
if ( if (
!this.hass ||
!this.view || !this.view ||
!this.viewerConfig || !this.viewerConfig ||
!BrowseMediaUtil.isTrueMedia(mediaToRender) || !BrowseMediaUtil.isTrueMedia(mediaToRender) ||
@@ -677,7 +690,9 @@ export class FrigateCardViewerCarousel extends FrigateCardMediaCarousel {
muted muted
playsinline playsinline
title="${mediaToRender.title}" title="${mediaToRender.title}"
url=${ifDefined(lazyLoad ? undefined : resolvedMedia?.url)} url=${ifDefined(
lazyLoad ? undefined : this._canonicalizeHAURL(resolvedMedia?.url),
)}
.hass=${this.hass} .hass=${this.hass}
@frigate-card:media-show=${(e: CustomEvent<MediaShowInfo>) => @frigate-card:media-show=${(e: CustomEvent<MediaShowInfo>) =>
this._mediaShowEventHandler(slideIndex, e)} this._mediaShowEventHandler(slideIndex, e)}
@@ -685,7 +700,9 @@ export class FrigateCardViewerCarousel extends FrigateCardMediaCarousel {
</frigate-card-ha-hls-player>` </frigate-card-ha-hls-player>`
: html`<img : html`<img
aria-label="${mediaToRender.title}" aria-label="${mediaToRender.title}"
src=${ifDefined(lazyLoad ? IMG_EMPTY : resolvedMedia?.url)} src=${ifDefined(
lazyLoad ? IMG_EMPTY : this._canonicalizeHAURL(resolvedMedia?.url),
)}
title="${mediaToRender.title}" title="${mediaToRender.title}"
@click=${() => { @click=${() => {
if (this._carousel?.clickAllowed()) { if (this._carousel?.clickAllowed()) {