Add state buffering to media_player and use it in cast (#70802)

This commit is contained in:
Erik Montnemery 2022-04-27 09:49:50 +02:00 committed by GitHub
parent 4a46fd9559
commit 66551e6fcb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 10 deletions

View File

@ -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:

View File

@ -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"

View File

@ -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()