Make media player seekable
This commit is contained in:
parent
0ecfe402ea
commit
18eec919a0
@ -624,6 +624,9 @@ const MediaPlayerMixin = (SuperClass) => {
|
|||||||
for (const ev of ["play", "pause", "ended", "volumechange"]) {
|
for (const ev of ["play", "pause", "ended", "volumechange"]) {
|
||||||
this.player.addEventListener(ev, () => this._player_update());
|
this.player.addEventListener(ev, () => this._player_update());
|
||||||
}
|
}
|
||||||
|
for (const ev of ["timeupdate"]) {
|
||||||
|
this.player.addEventListener(ev, () => this._player_update_choked());
|
||||||
|
}
|
||||||
this.firstInteraction.then(() => {
|
this.firstInteraction.then(() => {
|
||||||
this._player_enabled = true;
|
this._player_enabled = true;
|
||||||
if (!this.player.ended)
|
if (!this.player.ended)
|
||||||
@ -653,8 +656,18 @@ const MediaPlayerMixin = (SuperClass) => {
|
|||||||
else
|
else
|
||||||
this.player.muted = !this.player.muted;
|
this.player.muted = !this.player.muted;
|
||||||
});
|
});
|
||||||
|
this.addEventListener("command-player-seek", (ev) => {
|
||||||
|
this.player.currentTime = ev.detail.position;
|
||||||
|
setTimeout(() => this._player_update(), 10);
|
||||||
|
});
|
||||||
this.connectionPromise.then(() => this._player_update());
|
this.connectionPromise.then(() => this._player_update());
|
||||||
}
|
}
|
||||||
|
_player_update_choked() {
|
||||||
|
if (this._player_update_cooldown)
|
||||||
|
return;
|
||||||
|
this._player_update_cooldown = window.setTimeout(() => (this._player_update_cooldown = undefined), 3000);
|
||||||
|
this._player_update();
|
||||||
|
}
|
||||||
_player_update() {
|
_player_update() {
|
||||||
const state = this._player_enabled
|
const state = this._player_enabled
|
||||||
? this.player.src
|
? this.player.src
|
||||||
@ -671,6 +684,8 @@ const MediaPlayerMixin = (SuperClass) => {
|
|||||||
muted: this.player.muted,
|
muted: this.player.muted,
|
||||||
src: this.player.src,
|
src: this.player.src,
|
||||||
state,
|
state,
|
||||||
|
media_duration: this.player.duration,
|
||||||
|
media_position: this.player.currentTime,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -2166,7 +2181,7 @@ const BrowserIDMixin = (SuperClass) => {
|
|||||||
- Quickbar tweaks (ctrl+enter)?
|
- Quickbar tweaks (ctrl+enter)?
|
||||||
x Card-mod preload
|
x Card-mod preload
|
||||||
- Video player?
|
- Video player?
|
||||||
- Media_seek
|
x Media_seek
|
||||||
- Screensavers
|
- Screensavers
|
||||||
x IMPORTANT: FIX DEFAULT HIDING OF ENTITIES
|
x IMPORTANT: FIX DEFAULT HIDING OF ENTITIES
|
||||||
- NOFIX. Home Assistant bug
|
- NOFIX. Home Assistant bug
|
||||||
|
@ -15,6 +15,7 @@ from homeassistant.components.media_player.const import (
|
|||||||
MEDIA_TYPE_MUSIC,
|
MEDIA_TYPE_MUSIC,
|
||||||
MEDIA_TYPE_URL,
|
MEDIA_TYPE_URL,
|
||||||
SUPPORT_BROWSE_MEDIA,
|
SUPPORT_BROWSE_MEDIA,
|
||||||
|
SUPPORT_SEEK,
|
||||||
)
|
)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
STATE_UNAVAILABLE,
|
STATE_UNAVAILABLE,
|
||||||
@ -24,6 +25,8 @@ from homeassistant.const import (
|
|||||||
STATE_UNKNOWN,
|
STATE_UNKNOWN,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from homeassistant.util import dt
|
||||||
|
|
||||||
from .entities import BrowserModEntity
|
from .entities import BrowserModEntity
|
||||||
from .const import DOMAIN, DATA_ADDERS
|
from .const import DOMAIN, DATA_ADDERS
|
||||||
|
|
||||||
@ -72,6 +75,7 @@ class BrowserModPlayer(BrowserModEntity, MediaPlayerEntity):
|
|||||||
| SUPPORT_VOLUME_SET
|
| SUPPORT_VOLUME_SET
|
||||||
| SUPPORT_VOLUME_MUTE
|
| SUPPORT_VOLUME_MUTE
|
||||||
| SUPPORT_BROWSE_MEDIA
|
| SUPPORT_BROWSE_MEDIA
|
||||||
|
| SUPPORT_SEEK
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -82,6 +86,20 @@ class BrowserModPlayer(BrowserModEntity, MediaPlayerEntity):
|
|||||||
def is_volume_muted(self):
|
def is_volume_muted(self):
|
||||||
return self._data.get("player", {}).get("muted", False)
|
return self._data.get("player", {}).get("muted", False)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def media_duration(self):
|
||||||
|
duration = self._data.get("player", {}).get("media_duration", None)
|
||||||
|
return float(duration) if duration is not None else None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def media_position(self):
|
||||||
|
position = self._data.get("player", {}).get("media_position", None)
|
||||||
|
return float(position) if position is not None else None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def media_position_updated_at(self):
|
||||||
|
return dt.utcnow()
|
||||||
|
|
||||||
def set_volume_level(self, volume):
|
def set_volume_level(self, volume):
|
||||||
self.browser.send("player-set-volume", volume_level=volume)
|
self.browser.send("player-set-volume", volume_level=volume)
|
||||||
|
|
||||||
@ -115,3 +133,6 @@ class BrowserModPlayer(BrowserModEntity, MediaPlayerEntity):
|
|||||||
|
|
||||||
def media_stop(self):
|
def media_stop(self):
|
||||||
self.browser.send("player-stop")
|
self.browser.send("player-stop")
|
||||||
|
|
||||||
|
def media_seek(self, position):
|
||||||
|
self.browser.send("player-seek", position=position)
|
||||||
|
@ -68,7 +68,7 @@ import { BrowserIDMixin } from "./browserID";
|
|||||||
- Quickbar tweaks (ctrl+enter)?
|
- Quickbar tweaks (ctrl+enter)?
|
||||||
x Card-mod preload
|
x Card-mod preload
|
||||||
- Video player?
|
- Video player?
|
||||||
- Media_seek
|
x Media_seek
|
||||||
- Screensavers
|
- Screensavers
|
||||||
x IMPORTANT: FIX DEFAULT HIDING OF ENTITIES
|
x IMPORTANT: FIX DEFAULT HIDING OF ENTITIES
|
||||||
- NOFIX. Home Assistant bug
|
- NOFIX. Home Assistant bug
|
||||||
|
@ -2,6 +2,7 @@ export const MediaPlayerMixin = (SuperClass) => {
|
|||||||
return class MediaPlayerMixinClass extends SuperClass {
|
return class MediaPlayerMixinClass extends SuperClass {
|
||||||
public player;
|
public player;
|
||||||
private _player_enabled;
|
private _player_enabled;
|
||||||
|
private _player_update_cooldown;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
@ -12,6 +13,9 @@ export const MediaPlayerMixin = (SuperClass) => {
|
|||||||
for (const ev of ["play", "pause", "ended", "volumechange"]) {
|
for (const ev of ["play", "pause", "ended", "volumechange"]) {
|
||||||
this.player.addEventListener(ev, () => this._player_update());
|
this.player.addEventListener(ev, () => this._player_update());
|
||||||
}
|
}
|
||||||
|
for (const ev of ["timeupdate"]) {
|
||||||
|
this.player.addEventListener(ev, () => this._player_update_choked());
|
||||||
|
}
|
||||||
|
|
||||||
this.firstInteraction.then(() => {
|
this.firstInteraction.then(() => {
|
||||||
this._player_enabled = true;
|
this._player_enabled = true;
|
||||||
@ -39,10 +43,23 @@ export const MediaPlayerMixin = (SuperClass) => {
|
|||||||
this.player.muted = Boolean(ev.detail.mute);
|
this.player.muted = Boolean(ev.detail.mute);
|
||||||
else this.player.muted = !this.player.muted;
|
else this.player.muted = !this.player.muted;
|
||||||
});
|
});
|
||||||
|
this.addEventListener("command-player-seek", (ev) => {
|
||||||
|
this.player.currentTime = ev.detail.position;
|
||||||
|
setTimeout(() => this._player_update(), 10);
|
||||||
|
});
|
||||||
|
|
||||||
this.connectionPromise.then(() => this._player_update());
|
this.connectionPromise.then(() => this._player_update());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private _player_update_choked() {
|
||||||
|
if (this._player_update_cooldown) return;
|
||||||
|
this._player_update_cooldown = window.setTimeout(
|
||||||
|
() => (this._player_update_cooldown = undefined),
|
||||||
|
3000
|
||||||
|
);
|
||||||
|
this._player_update();
|
||||||
|
}
|
||||||
|
|
||||||
private _player_update() {
|
private _player_update() {
|
||||||
const state = this._player_enabled
|
const state = this._player_enabled
|
||||||
? this.player.src
|
? this.player.src
|
||||||
@ -59,6 +76,8 @@ export const MediaPlayerMixin = (SuperClass) => {
|
|||||||
muted: this.player.muted,
|
muted: this.player.muted,
|
||||||
src: this.player.src,
|
src: this.player.src,
|
||||||
state,
|
state,
|
||||||
|
media_duration: this.player.duration,
|
||||||
|
media_position: this.player.currentTime,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user