Hide hidden media player entities in media panel (#12766)

This commit is contained in:
Paulus Schoutsen 2022-05-24 14:07:22 -07:00 committed by GitHub
parent e7517a8b61
commit 3f1a2526b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -11,6 +11,7 @@ import {
mdiStop, mdiStop,
mdiVolumeHigh, mdiVolumeHigh,
} from "@mdi/js"; } from "@mdi/js";
import { UnsubscribeFunc } from "home-assistant-js-websocket";
import { import {
css, css,
CSSResultGroup, CSSResultGroup,
@ -32,6 +33,7 @@ import "../../components/ha-button-menu";
import "../../components/ha-circular-progress"; import "../../components/ha-circular-progress";
import "../../components/ha-icon-button"; import "../../components/ha-icon-button";
import { UNAVAILABLE_STATES } from "../../data/entity"; import { UNAVAILABLE_STATES } from "../../data/entity";
import { subscribeEntityRegistry } from "../../data/entity_registry";
import { import {
BROWSER_PLAYER, BROWSER_PLAYER,
cleanupMediaTitle, cleanupMediaTitle,
@ -51,6 +53,7 @@ import {
} from "../../data/media-player"; } from "../../data/media-player";
import { ResolvedMediaSource } from "../../data/media_source"; import { ResolvedMediaSource } from "../../data/media_source";
import { showAlertDialog } from "../../dialogs/generic/show-dialog-box"; import { showAlertDialog } from "../../dialogs/generic/show-dialog-box";
import { SubscribeMixin } from "../../mixins/subscribe-mixin";
import type { HomeAssistant } from "../../types"; import type { HomeAssistant } from "../../types";
import "../lovelace/components/hui-marquee"; import "../lovelace/components/hui-marquee";
import { import {
@ -65,7 +68,7 @@ declare global {
} }
@customElement("ha-bar-media-player") @customElement("ha-bar-media-player")
export class BarMediaPlayer extends LitElement { export class BarMediaPlayer extends SubscribeMixin(LitElement) {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: false }) public entityId!: string; @property({ attribute: false }) public entityId!: string;
@ -83,6 +86,9 @@ export class BarMediaPlayer extends LitElement {
@state() private _browserPlayer?: BrowserMediaPlayer; @state() private _browserPlayer?: BrowserMediaPlayer;
@state()
private _hiddenEntities = new Set<string>();
private _progressInterval?: number; private _progressInterval?: number;
private _browserPlayerVolume = 0.8; private _browserPlayerVolume = 0.8;
@ -461,7 +467,8 @@ export class BarMediaPlayer extends LitElement {
return Object.values(this.hass!.states).filter( return Object.values(this.hass!.states).filter(
(entity) => (entity) =>
computeStateDomain(entity) === "media_player" && computeStateDomain(entity) === "media_player" &&
supportsFeature(entity, SUPPORT_BROWSE_MEDIA) supportsFeature(entity, SUPPORT_BROWSE_MEDIA) &&
!this._hiddenEntities.has(entity.entity_id)
); );
} }
@ -487,6 +494,28 @@ export class BarMediaPlayer extends LitElement {
} }
} }
protected override hassSubscribe(): (
| UnsubscribeFunc
| Promise<UnsubscribeFunc>
)[] {
return [
subscribeEntityRegistry(this.hass.connection, (entries) => {
const hiddenEntities = new Set<string>();
for (const entry of entries) {
if (
entry.hidden_by &&
computeDomain(entry.entity_id) === "media_player"
) {
hiddenEntities.add(entry.entity_id);
}
}
this._hiddenEntities = hiddenEntities;
}),
];
}
private _handleControlClick(e: MouseEvent): void { private _handleControlClick(e: MouseEvent): void {
const action = (e.currentTarget! as HTMLElement).getAttribute("action")!; const action = (e.currentTarget! as HTMLElement).getAttribute("action")!;