From 6e6d6c65ef81ce1c67837134ee0be23685147848 Mon Sep 17 00:00:00 2001 From: rajlaud <50647620+rajlaud@users.noreply.github.com> Date: Mon, 14 Sep 2020 04:48:16 -0500 Subject: [PATCH] Improve reproduce_state for media players (#38266) --- .../media_player/reproduce_state.py | 35 +++++++++++-------- .../media_player/test_reproduce_state.py | 5 ++- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/homeassistant/components/media_player/reproduce_state.py b/homeassistant/components/media_player/reproduce_state.py index a90e4fffdc1..64955d1913b 100644 --- a/homeassistant/components/media_player/reproduce_state.py +++ b/homeassistant/components/media_player/reproduce_state.py @@ -5,7 +5,6 @@ from typing import Any, Dict, Iterable, Optional from homeassistant.const import ( SERVICE_MEDIA_PAUSE, SERVICE_MEDIA_PLAY, - SERVICE_MEDIA_SEEK, SERVICE_MEDIA_STOP, SERVICE_TURN_OFF, SERVICE_TURN_ON, @@ -25,7 +24,6 @@ from .const import ( ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_CONTENT_TYPE, ATTR_MEDIA_ENQUEUE, - ATTR_MEDIA_SEEK_POSITION, ATTR_MEDIA_VOLUME_LEVEL, ATTR_MEDIA_VOLUME_MUTED, ATTR_SOUND_MODE, @@ -58,16 +56,18 @@ async def _async_reproduce_states( DOMAIN, service, data, blocking=True, context=context ) - if state.state == STATE_ON: - await call_service(SERVICE_TURN_ON, []) - elif state.state == STATE_OFF: + if state.state == STATE_OFF: await call_service(SERVICE_TURN_OFF, []) - elif state.state == STATE_PLAYING: - await call_service(SERVICE_MEDIA_PLAY, []) - elif state.state == STATE_IDLE: - await call_service(SERVICE_MEDIA_STOP, []) - elif state.state == STATE_PAUSED: - await call_service(SERVICE_MEDIA_PAUSE, []) + # entities that are off have no other attributes to restore + return + + if state.state in [ + STATE_ON, + STATE_PLAYING, + STATE_IDLE, + STATE_PAUSED, + ]: + await call_service(SERVICE_TURN_ON, []) if ATTR_MEDIA_VOLUME_LEVEL in state.attributes: await call_service(SERVICE_VOLUME_SET, [ATTR_MEDIA_VOLUME_LEVEL]) @@ -75,15 +75,14 @@ async def _async_reproduce_states( if ATTR_MEDIA_VOLUME_MUTED in state.attributes: await call_service(SERVICE_VOLUME_MUTE, [ATTR_MEDIA_VOLUME_MUTED]) - if ATTR_MEDIA_SEEK_POSITION in state.attributes: - await call_service(SERVICE_MEDIA_SEEK, [ATTR_MEDIA_SEEK_POSITION]) - if ATTR_INPUT_SOURCE in state.attributes: await call_service(SERVICE_SELECT_SOURCE, [ATTR_INPUT_SOURCE]) if ATTR_SOUND_MODE in state.attributes: await call_service(SERVICE_SELECT_SOUND_MODE, [ATTR_SOUND_MODE]) + already_playing = False + if (ATTR_MEDIA_CONTENT_TYPE in state.attributes) and ( ATTR_MEDIA_CONTENT_ID in state.attributes ): @@ -91,6 +90,14 @@ async def _async_reproduce_states( SERVICE_PLAY_MEDIA, [ATTR_MEDIA_CONTENT_TYPE, ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_ENQUEUE], ) + already_playing = True + + if state.state == STATE_PLAYING and not already_playing: + await call_service(SERVICE_MEDIA_PLAY, []) + elif state.state == STATE_IDLE: + await call_service(SERVICE_MEDIA_STOP, []) + elif state.state == STATE_PAUSED: + await call_service(SERVICE_MEDIA_PAUSE, []) async def async_reproduce_states( diff --git a/tests/components/media_player/test_reproduce_state.py b/tests/components/media_player/test_reproduce_state.py index ee2c9be377f..ba0072bc2f8 100644 --- a/tests/components/media_player/test_reproduce_state.py +++ b/tests/components/media_player/test_reproduce_state.py @@ -7,7 +7,6 @@ from homeassistant.components.media_player.const import ( ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_CONTENT_TYPE, ATTR_MEDIA_ENQUEUE, - ATTR_MEDIA_SEEK_POSITION, ATTR_MEDIA_VOLUME_LEVEL, ATTR_MEDIA_VOLUME_MUTED, ATTR_SOUND_MODE, @@ -20,7 +19,6 @@ from homeassistant.components.media_player.reproduce_state import async_reproduc from homeassistant.const import ( SERVICE_MEDIA_PAUSE, SERVICE_MEDIA_PLAY, - SERVICE_MEDIA_SEEK, SERVICE_MEDIA_STOP, SERVICE_TURN_OFF, SERVICE_TURN_ON, @@ -53,6 +51,8 @@ ENTITY_2 = "media_player.test2" async def test_state(hass, service, state): """Test that we can turn a state into a service call.""" calls_1 = async_mock_service(hass, DOMAIN, service) + if service != SERVICE_TURN_ON: + async_mock_service(hass, DOMAIN, SERVICE_TURN_ON) await async_reproduce_states(hass, [State(ENTITY_1, state)]) @@ -149,7 +149,6 @@ async def test_attribute_no_state(hass): [ (SERVICE_VOLUME_SET, ATTR_MEDIA_VOLUME_LEVEL), (SERVICE_VOLUME_MUTE, ATTR_MEDIA_VOLUME_MUTED), - (SERVICE_MEDIA_SEEK, ATTR_MEDIA_SEEK_POSITION), (SERVICE_SELECT_SOURCE, ATTR_INPUT_SOURCE), (SERVICE_SELECT_SOUND_MODE, ATTR_SOUND_MODE), ],