mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 15:17:35 +00:00
Add state buffering to media_player and use it in cast (#70802)
This commit is contained in:
parent
4a46fd9559
commit
66551e6fcb
@ -10,7 +10,12 @@ import logging
|
|||||||
|
|
||||||
import pychromecast
|
import pychromecast
|
||||||
from pychromecast.controllers.homeassistant import HomeAssistantController
|
from pychromecast.controllers.homeassistant import HomeAssistantController
|
||||||
from pychromecast.controllers.media import MEDIA_PLAYER_ERROR_CODES
|
from pychromecast.controllers.media import (
|
||||||
|
MEDIA_PLAYER_ERROR_CODES,
|
||||||
|
MEDIA_PLAYER_STATE_BUFFERING,
|
||||||
|
MEDIA_PLAYER_STATE_PLAYING,
|
||||||
|
MEDIA_PLAYER_STATE_UNKNOWN,
|
||||||
|
)
|
||||||
from pychromecast.controllers.multizone import MultizoneManager
|
from pychromecast.controllers.multizone import MultizoneManager
|
||||||
from pychromecast.controllers.receiver import VOLUME_CONTROL_TYPE_FIXED
|
from pychromecast.controllers.receiver import VOLUME_CONTROL_TYPE_FIXED
|
||||||
from pychromecast.quick_play import quick_play
|
from pychromecast.quick_play import quick_play
|
||||||
@ -40,6 +45,7 @@ from homeassistant.config_entries import ConfigEntry
|
|||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CAST_APP_ID_HOMEASSISTANT_LOVELACE,
|
CAST_APP_ID_HOMEASSISTANT_LOVELACE,
|
||||||
EVENT_HOMEASSISTANT_STOP,
|
EVENT_HOMEASSISTANT_STOP,
|
||||||
|
STATE_BUFFERING,
|
||||||
STATE_IDLE,
|
STATE_IDLE,
|
||||||
STATE_OFF,
|
STATE_OFF,
|
||||||
STATE_PAUSED,
|
STATE_PAUSED,
|
||||||
@ -453,10 +459,13 @@ class CastMediaPlayerEntity(CastDevice, MediaPlayerEntity):
|
|||||||
media_status = self.media_status
|
media_status = self.media_status
|
||||||
media_controller = self._chromecast.media_controller
|
media_controller = self._chromecast.media_controller
|
||||||
|
|
||||||
if media_status is None or media_status.player_state == "UNKNOWN":
|
if (
|
||||||
|
media_status is None
|
||||||
|
or media_status.player_state == MEDIA_PLAYER_STATE_UNKNOWN
|
||||||
|
):
|
||||||
groups = self.mz_media_status
|
groups = self.mz_media_status
|
||||||
for k, val in groups.items():
|
for k, val in groups.items():
|
||||||
if val and val.player_state != "UNKNOWN":
|
if val and val.player_state != MEDIA_PLAYER_STATE_UNKNOWN:
|
||||||
media_controller = self.mz_mgr.get_multizone_mediacontroller(k)
|
media_controller = self.mz_mgr.get_multizone_mediacontroller(k)
|
||||||
break
|
break
|
||||||
|
|
||||||
@ -716,10 +725,13 @@ class CastMediaPlayerEntity(CastDevice, MediaPlayerEntity):
|
|||||||
media_status = self.media_status
|
media_status = self.media_status
|
||||||
media_status_received = self.media_status_received
|
media_status_received = self.media_status_received
|
||||||
|
|
||||||
if media_status is None or media_status.player_state == "UNKNOWN":
|
if (
|
||||||
|
media_status is None
|
||||||
|
or media_status.player_state == MEDIA_PLAYER_STATE_UNKNOWN
|
||||||
|
):
|
||||||
groups = self.mz_media_status
|
groups = self.mz_media_status
|
||||||
for k, val in groups.items():
|
for k, val in groups.items():
|
||||||
if val and val.player_state != "UNKNOWN":
|
if val and val.player_state != MEDIA_PLAYER_STATE_UNKNOWN:
|
||||||
media_status = val
|
media_status = val
|
||||||
media_status_received = self.mz_media_status_received[k]
|
media_status_received = self.mz_media_status_received[k]
|
||||||
break
|
break
|
||||||
@ -733,8 +745,10 @@ class CastMediaPlayerEntity(CastDevice, MediaPlayerEntity):
|
|||||||
if self.app_id == CAST_APP_ID_HOMEASSISTANT_LOVELACE:
|
if self.app_id == CAST_APP_ID_HOMEASSISTANT_LOVELACE:
|
||||||
return STATE_PLAYING
|
return STATE_PLAYING
|
||||||
if (media_status := self._media_status()[0]) is not None:
|
if (media_status := self._media_status()[0]) is not None:
|
||||||
if media_status.player_is_playing:
|
if media_status.player_state == MEDIA_PLAYER_STATE_PLAYING:
|
||||||
return STATE_PLAYING
|
return STATE_PLAYING
|
||||||
|
if media_status.player_state == MEDIA_PLAYER_STATE_BUFFERING:
|
||||||
|
return STATE_BUFFERING
|
||||||
if media_status.player_is_paused:
|
if media_status.player_is_paused:
|
||||||
return STATE_PAUSED
|
return STATE_PAUSED
|
||||||
if media_status.player_is_idle:
|
if media_status.player_is_idle:
|
||||||
|
@ -323,6 +323,7 @@ STATE_OPEN: Final = "open"
|
|||||||
STATE_OPENING: Final = "opening"
|
STATE_OPENING: Final = "opening"
|
||||||
STATE_CLOSED: Final = "closed"
|
STATE_CLOSED: Final = "closed"
|
||||||
STATE_CLOSING: Final = "closing"
|
STATE_CLOSING: Final = "closing"
|
||||||
|
STATE_BUFFERING: Final = "buffering"
|
||||||
STATE_PLAYING: Final = "playing"
|
STATE_PLAYING: Final = "playing"
|
||||||
STATE_PAUSED: Final = "paused"
|
STATE_PAUSED: Final = "paused"
|
||||||
STATE_IDLE: Final = "idle"
|
STATE_IDLE: Final = "idle"
|
||||||
|
@ -1257,6 +1257,7 @@ async def test_entity_control(hass: HomeAssistant, quick_play_mock):
|
|||||||
|
|
||||||
# Fake media status
|
# Fake media status
|
||||||
media_status = MagicMock(images=None)
|
media_status = MagicMock(images=None)
|
||||||
|
media_status.player_state = "PLAYING"
|
||||||
media_status.supports_queue_next = False
|
media_status.supports_queue_next = False
|
||||||
media_status.supports_seek = False
|
media_status.supports_seek = False
|
||||||
media_status_cb(media_status)
|
media_status_cb(media_status)
|
||||||
@ -1397,13 +1398,19 @@ async def test_entity_media_states(hass: HomeAssistant, app_id, state_no_media):
|
|||||||
|
|
||||||
# Got media status
|
# Got media status
|
||||||
media_status = MagicMock(images=None)
|
media_status = MagicMock(images=None)
|
||||||
media_status.player_is_playing = True
|
media_status.player_state = "BUFFERING"
|
||||||
|
media_status_cb(media_status)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state.state == "buffering"
|
||||||
|
|
||||||
|
media_status.player_state = "PLAYING"
|
||||||
media_status_cb(media_status)
|
media_status_cb(media_status)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state == "playing"
|
assert state.state == "playing"
|
||||||
|
|
||||||
media_status.player_is_playing = False
|
media_status.player_state = None
|
||||||
media_status.player_is_paused = True
|
media_status.player_is_paused = True
|
||||||
media_status_cb(media_status)
|
media_status_cb(media_status)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -1536,15 +1543,22 @@ async def test_group_media_states(hass, mz_mock):
|
|||||||
group_media_status = MagicMock(images=None)
|
group_media_status = MagicMock(images=None)
|
||||||
player_media_status = MagicMock(images=None)
|
player_media_status = MagicMock(images=None)
|
||||||
|
|
||||||
|
# Player has no state, group is buffering -> Should report 'buffering'
|
||||||
|
group_media_status.player_state = "BUFFERING"
|
||||||
|
group_media_status_cb(str(FakeGroupUUID), group_media_status)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state.state == "buffering"
|
||||||
|
|
||||||
# Player has no state, group is playing -> Should report 'playing'
|
# Player has no state, group is playing -> Should report 'playing'
|
||||||
group_media_status.player_is_playing = True
|
group_media_status.player_state = "PLAYING"
|
||||||
group_media_status_cb(str(FakeGroupUUID), group_media_status)
|
group_media_status_cb(str(FakeGroupUUID), group_media_status)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state == "playing"
|
assert state.state == "playing"
|
||||||
|
|
||||||
# Player is paused, group is playing -> Should report 'paused'
|
# Player is paused, group is playing -> Should report 'paused'
|
||||||
player_media_status.player_is_playing = False
|
player_media_status.player_state = None
|
||||||
player_media_status.player_is_paused = True
|
player_media_status.player_is_paused = True
|
||||||
media_status_cb(player_media_status)
|
media_status_cb(player_media_status)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user