mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Add general sound mode support (#14729)
* Media player: general sound mode support * General sound mode support * White spaces * Add sound mode support to demo media player * white space * remove unnessesary code
This commit is contained in:
parent
6b2b92a732
commit
f696331563
@ -57,6 +57,7 @@ ENTITY_IMAGE_CACHE = {
|
|||||||
|
|
||||||
SERVICE_PLAY_MEDIA = 'play_media'
|
SERVICE_PLAY_MEDIA = 'play_media'
|
||||||
SERVICE_SELECT_SOURCE = 'select_source'
|
SERVICE_SELECT_SOURCE = 'select_source'
|
||||||
|
SERVICE_SELECT_SOUND_MODE = 'select_sound_mode'
|
||||||
SERVICE_CLEAR_PLAYLIST = 'clear_playlist'
|
SERVICE_CLEAR_PLAYLIST = 'clear_playlist'
|
||||||
|
|
||||||
ATTR_MEDIA_VOLUME_LEVEL = 'volume_level'
|
ATTR_MEDIA_VOLUME_LEVEL = 'volume_level'
|
||||||
@ -81,6 +82,8 @@ ATTR_APP_ID = 'app_id'
|
|||||||
ATTR_APP_NAME = 'app_name'
|
ATTR_APP_NAME = 'app_name'
|
||||||
ATTR_INPUT_SOURCE = 'source'
|
ATTR_INPUT_SOURCE = 'source'
|
||||||
ATTR_INPUT_SOURCE_LIST = 'source_list'
|
ATTR_INPUT_SOURCE_LIST = 'source_list'
|
||||||
|
ATTR_SOUND_MODE = 'sound_mode'
|
||||||
|
ATTR_SOUND_MODE_LIST = 'sound_mode_list'
|
||||||
ATTR_MEDIA_ENQUEUE = 'enqueue'
|
ATTR_MEDIA_ENQUEUE = 'enqueue'
|
||||||
ATTR_MEDIA_SHUFFLE = 'shuffle'
|
ATTR_MEDIA_SHUFFLE = 'shuffle'
|
||||||
|
|
||||||
@ -109,6 +112,7 @@ SUPPORT_STOP = 4096
|
|||||||
SUPPORT_CLEAR_PLAYLIST = 8192
|
SUPPORT_CLEAR_PLAYLIST = 8192
|
||||||
SUPPORT_PLAY = 16384
|
SUPPORT_PLAY = 16384
|
||||||
SUPPORT_SHUFFLE_SET = 32768
|
SUPPORT_SHUFFLE_SET = 32768
|
||||||
|
SUPPORT_SELECT_SOUND_MODE = 65536
|
||||||
|
|
||||||
# Service call validation schemas
|
# Service call validation schemas
|
||||||
MEDIA_PLAYER_SCHEMA = vol.Schema({
|
MEDIA_PLAYER_SCHEMA = vol.Schema({
|
||||||
@ -132,6 +136,10 @@ MEDIA_PLAYER_SELECT_SOURCE_SCHEMA = MEDIA_PLAYER_SCHEMA.extend({
|
|||||||
vol.Required(ATTR_INPUT_SOURCE): cv.string,
|
vol.Required(ATTR_INPUT_SOURCE): cv.string,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
MEDIA_PLAYER_SELECT_SOUND_MODE_SCHEMA = MEDIA_PLAYER_SCHEMA.extend({
|
||||||
|
vol.Required(ATTR_SOUND_MODE): cv.string,
|
||||||
|
})
|
||||||
|
|
||||||
MEDIA_PLAYER_PLAY_MEDIA_SCHEMA = MEDIA_PLAYER_SCHEMA.extend({
|
MEDIA_PLAYER_PLAY_MEDIA_SCHEMA = MEDIA_PLAYER_SCHEMA.extend({
|
||||||
vol.Required(ATTR_MEDIA_CONTENT_TYPE): cv.string,
|
vol.Required(ATTR_MEDIA_CONTENT_TYPE): cv.string,
|
||||||
vol.Required(ATTR_MEDIA_CONTENT_ID): cv.string,
|
vol.Required(ATTR_MEDIA_CONTENT_ID): cv.string,
|
||||||
@ -167,6 +175,9 @@ SERVICE_TO_METHOD = {
|
|||||||
SERVICE_SELECT_SOURCE: {
|
SERVICE_SELECT_SOURCE: {
|
||||||
'method': 'async_select_source',
|
'method': 'async_select_source',
|
||||||
'schema': MEDIA_PLAYER_SELECT_SOURCE_SCHEMA},
|
'schema': MEDIA_PLAYER_SELECT_SOURCE_SCHEMA},
|
||||||
|
SERVICE_SELECT_SOUND_MODE: {
|
||||||
|
'method': 'async_select_sound_mode',
|
||||||
|
'schema': MEDIA_PLAYER_SELECT_SOUND_MODE_SCHEMA},
|
||||||
SERVICE_PLAY_MEDIA: {
|
SERVICE_PLAY_MEDIA: {
|
||||||
'method': 'async_play_media',
|
'method': 'async_play_media',
|
||||||
'schema': MEDIA_PLAYER_PLAY_MEDIA_SCHEMA},
|
'schema': MEDIA_PLAYER_PLAY_MEDIA_SCHEMA},
|
||||||
@ -197,6 +208,8 @@ ATTR_TO_PROPERTY = [
|
|||||||
ATTR_APP_NAME,
|
ATTR_APP_NAME,
|
||||||
ATTR_INPUT_SOURCE,
|
ATTR_INPUT_SOURCE,
|
||||||
ATTR_INPUT_SOURCE_LIST,
|
ATTR_INPUT_SOURCE_LIST,
|
||||||
|
ATTR_SOUND_MODE,
|
||||||
|
ATTR_SOUND_MODE_LIST,
|
||||||
ATTR_MEDIA_SHUFFLE,
|
ATTR_MEDIA_SHUFFLE,
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -346,6 +359,17 @@ def select_source(hass, source, entity_id=None):
|
|||||||
hass.services.call(DOMAIN, SERVICE_SELECT_SOURCE, data)
|
hass.services.call(DOMAIN, SERVICE_SELECT_SOURCE, data)
|
||||||
|
|
||||||
|
|
||||||
|
@bind_hass
|
||||||
|
def select_sound_mode(hass, sound_mode, entity_id=None):
|
||||||
|
"""Send the media player the command to select sound mode."""
|
||||||
|
data = {ATTR_SOUND_MODE: sound_mode}
|
||||||
|
|
||||||
|
if entity_id:
|
||||||
|
data[ATTR_ENTITY_ID] = entity_id
|
||||||
|
|
||||||
|
hass.services.call(DOMAIN, SERVICE_SELECT_SOUND_MODE, data)
|
||||||
|
|
||||||
|
|
||||||
@bind_hass
|
@bind_hass
|
||||||
def clear_playlist(hass, entity_id=None):
|
def clear_playlist(hass, entity_id=None):
|
||||||
"""Send the media player the command for clear playlist."""
|
"""Send the media player the command for clear playlist."""
|
||||||
@ -399,6 +423,8 @@ async def async_setup(hass, config):
|
|||||||
params['position'] = service.data.get(ATTR_MEDIA_SEEK_POSITION)
|
params['position'] = service.data.get(ATTR_MEDIA_SEEK_POSITION)
|
||||||
elif service.service == SERVICE_SELECT_SOURCE:
|
elif service.service == SERVICE_SELECT_SOURCE:
|
||||||
params['source'] = service.data.get(ATTR_INPUT_SOURCE)
|
params['source'] = service.data.get(ATTR_INPUT_SOURCE)
|
||||||
|
elif service.service == SERVICE_SELECT_SOUND_MODE:
|
||||||
|
params['sound_mode'] = service.data.get(ATTR_SOUND_MODE)
|
||||||
elif service.service == SERVICE_PLAY_MEDIA:
|
elif service.service == SERVICE_PLAY_MEDIA:
|
||||||
params['media_type'] = \
|
params['media_type'] = \
|
||||||
service.data.get(ATTR_MEDIA_CONTENT_TYPE)
|
service.data.get(ATTR_MEDIA_CONTENT_TYPE)
|
||||||
@ -580,6 +606,16 @@ class MediaPlayerDevice(Entity):
|
|||||||
"""List of available input sources."""
|
"""List of available input sources."""
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def sound_mode(self):
|
||||||
|
"""Name of the current sound mode."""
|
||||||
|
return None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def sound_mode_list(self):
|
||||||
|
"""List of available sound modes."""
|
||||||
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def shuffle(self):
|
def shuffle(self):
|
||||||
"""Boolean if shuffle is enabled."""
|
"""Boolean if shuffle is enabled."""
|
||||||
@ -723,6 +759,17 @@ class MediaPlayerDevice(Entity):
|
|||||||
"""
|
"""
|
||||||
return self.hass.async_add_job(self.select_source, source)
|
return self.hass.async_add_job(self.select_source, source)
|
||||||
|
|
||||||
|
def select_sound_mode(self, sound_mode):
|
||||||
|
"""Select sound mode."""
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def async_select_sound_mode(self, sound_mode):
|
||||||
|
"""Select sound mode.
|
||||||
|
|
||||||
|
This method must be run in the event loop and returns a coroutine.
|
||||||
|
"""
|
||||||
|
return self.hass.async_add_job(self.select_sound_mode, sound_mode)
|
||||||
|
|
||||||
def clear_playlist(self):
|
def clear_playlist(self):
|
||||||
"""Clear players playlist."""
|
"""Clear players playlist."""
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
@ -796,6 +843,11 @@ class MediaPlayerDevice(Entity):
|
|||||||
"""Boolean if select source command supported."""
|
"""Boolean if select source command supported."""
|
||||||
return bool(self.supported_features & SUPPORT_SELECT_SOURCE)
|
return bool(self.supported_features & SUPPORT_SELECT_SOURCE)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def support_select_sound_mode(self):
|
||||||
|
"""Boolean if select sound mode command supported."""
|
||||||
|
return bool(self.supported_features & SUPPORT_SELECT_SOUND_MODE)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def support_clear_playlist(self):
|
def support_clear_playlist(self):
|
||||||
"""Boolean if clear playlist command supported."""
|
"""Boolean if clear playlist command supported."""
|
||||||
|
@ -8,8 +8,8 @@ from homeassistant.components.media_player import (
|
|||||||
MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, MEDIA_TYPE_MOVIE, SUPPORT_NEXT_TRACK,
|
MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, MEDIA_TYPE_MOVIE, SUPPORT_NEXT_TRACK,
|
||||||
SUPPORT_PAUSE, SUPPORT_PLAY_MEDIA, SUPPORT_PREVIOUS_TRACK,
|
SUPPORT_PAUSE, SUPPORT_PLAY_MEDIA, SUPPORT_PREVIOUS_TRACK,
|
||||||
SUPPORT_TURN_OFF, SUPPORT_TURN_ON, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET,
|
SUPPORT_TURN_OFF, SUPPORT_TURN_ON, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET,
|
||||||
SUPPORT_SELECT_SOURCE, SUPPORT_CLEAR_PLAYLIST, SUPPORT_PLAY,
|
SUPPORT_SELECT_SOURCE, SUPPORT_SELECT_SOUND_MODE, SUPPORT_CLEAR_PLAYLIST,
|
||||||
SUPPORT_SHUFFLE_SET, MediaPlayerDevice)
|
SUPPORT_PLAY, SUPPORT_SHUFFLE_SET, MediaPlayerDevice)
|
||||||
from homeassistant.const import STATE_OFF, STATE_PAUSED, STATE_PLAYING
|
from homeassistant.const import STATE_OFF, STATE_PAUSED, STATE_PLAYING
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
@ -28,22 +28,26 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
|||||||
|
|
||||||
|
|
||||||
YOUTUBE_COVER_URL_FORMAT = 'https://img.youtube.com/vi/{}/hqdefault.jpg'
|
YOUTUBE_COVER_URL_FORMAT = 'https://img.youtube.com/vi/{}/hqdefault.jpg'
|
||||||
|
SOUND_MODE_LIST = ['Dummy Music', 'Dummy Movie']
|
||||||
|
DEFAULT_SOUND_MODE = 'Dummy Music'
|
||||||
|
|
||||||
YOUTUBE_PLAYER_SUPPORT = \
|
YOUTUBE_PLAYER_SUPPORT = \
|
||||||
SUPPORT_PAUSE | SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE | \
|
SUPPORT_PAUSE | SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE | \
|
||||||
SUPPORT_TURN_ON | SUPPORT_TURN_OFF | SUPPORT_PLAY_MEDIA | SUPPORT_PLAY | \
|
SUPPORT_TURN_ON | SUPPORT_TURN_OFF | SUPPORT_PLAY_MEDIA | SUPPORT_PLAY | \
|
||||||
SUPPORT_SHUFFLE_SET
|
SUPPORT_SHUFFLE_SET | SUPPORT_SELECT_SOUND_MODE
|
||||||
|
|
||||||
MUSIC_PLAYER_SUPPORT = \
|
MUSIC_PLAYER_SUPPORT = \
|
||||||
SUPPORT_PAUSE | SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE | \
|
SUPPORT_PAUSE | SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE | \
|
||||||
SUPPORT_TURN_ON | SUPPORT_TURN_OFF | SUPPORT_CLEAR_PLAYLIST | \
|
SUPPORT_TURN_ON | SUPPORT_TURN_OFF | SUPPORT_CLEAR_PLAYLIST | \
|
||||||
SUPPORT_PLAY | SUPPORT_SHUFFLE_SET | \
|
SUPPORT_PLAY | SUPPORT_SHUFFLE_SET | \
|
||||||
SUPPORT_PREVIOUS_TRACK | SUPPORT_NEXT_TRACK
|
SUPPORT_PREVIOUS_TRACK | SUPPORT_NEXT_TRACK | \
|
||||||
|
SUPPORT_SELECT_SOUND_MODE
|
||||||
|
|
||||||
NETFLIX_PLAYER_SUPPORT = \
|
NETFLIX_PLAYER_SUPPORT = \
|
||||||
SUPPORT_PAUSE | SUPPORT_TURN_ON | SUPPORT_TURN_OFF | \
|
SUPPORT_PAUSE | SUPPORT_TURN_ON | SUPPORT_TURN_OFF | \
|
||||||
SUPPORT_SELECT_SOURCE | SUPPORT_PLAY | SUPPORT_SHUFFLE_SET | \
|
SUPPORT_SELECT_SOURCE | SUPPORT_PLAY | SUPPORT_SHUFFLE_SET | \
|
||||||
SUPPORT_PREVIOUS_TRACK | SUPPORT_NEXT_TRACK
|
SUPPORT_PREVIOUS_TRACK | SUPPORT_NEXT_TRACK | \
|
||||||
|
SUPPORT_SELECT_SOUND_MODE
|
||||||
|
|
||||||
|
|
||||||
class AbstractDemoPlayer(MediaPlayerDevice):
|
class AbstractDemoPlayer(MediaPlayerDevice):
|
||||||
@ -58,6 +62,8 @@ class AbstractDemoPlayer(MediaPlayerDevice):
|
|||||||
self._volume_level = 1.0
|
self._volume_level = 1.0
|
||||||
self._volume_muted = False
|
self._volume_muted = False
|
||||||
self._shuffle = False
|
self._shuffle = False
|
||||||
|
self._sound_mode_list = SOUND_MODE_LIST
|
||||||
|
self._sound_mode = DEFAULT_SOUND_MODE
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def should_poll(self):
|
def should_poll(self):
|
||||||
@ -89,6 +95,16 @@ class AbstractDemoPlayer(MediaPlayerDevice):
|
|||||||
"""Boolean if shuffling is enabled."""
|
"""Boolean if shuffling is enabled."""
|
||||||
return self._shuffle
|
return self._shuffle
|
||||||
|
|
||||||
|
@property
|
||||||
|
def sound_mode(self):
|
||||||
|
"""Return the current sound mode."""
|
||||||
|
return self._sound_mode
|
||||||
|
|
||||||
|
@property
|
||||||
|
def sound_mode_list(self):
|
||||||
|
"""Return a list of available sound modes."""
|
||||||
|
return self._sound_mode_list
|
||||||
|
|
||||||
def turn_on(self):
|
def turn_on(self):
|
||||||
"""Turn the media player on."""
|
"""Turn the media player on."""
|
||||||
self._player_state = STATE_PLAYING
|
self._player_state = STATE_PLAYING
|
||||||
@ -124,6 +140,11 @@ class AbstractDemoPlayer(MediaPlayerDevice):
|
|||||||
self._shuffle = shuffle
|
self._shuffle = shuffle
|
||||||
self.schedule_update_ha_state()
|
self.schedule_update_ha_state()
|
||||||
|
|
||||||
|
def select_sound_mode(self, sound_mode):
|
||||||
|
"""Select sound mode."""
|
||||||
|
self._sound_mode = sound_mode
|
||||||
|
self.schedule_update_ha_state()
|
||||||
|
|
||||||
|
|
||||||
class DemoYoutubePlayer(AbstractDemoPlayer):
|
class DemoYoutubePlayer(AbstractDemoPlayer):
|
||||||
"""A Demo media player that only supports YouTube."""
|
"""A Demo media player that only supports YouTube."""
|
||||||
|
@ -144,6 +144,16 @@ select_source:
|
|||||||
description: Name of the source to switch to. Platform dependent.
|
description: Name of the source to switch to. Platform dependent.
|
||||||
example: 'video1'
|
example: 'video1'
|
||||||
|
|
||||||
|
select_sound_mode:
|
||||||
|
description: Send the media player the command to change sound mode.
|
||||||
|
fields:
|
||||||
|
entity_id:
|
||||||
|
description: Name(s) of entities to change sound mode on.
|
||||||
|
example: 'media_player.marantz'
|
||||||
|
sound_mode:
|
||||||
|
description: Name of the sound mode to switch to.
|
||||||
|
example: 'Music'
|
||||||
|
|
||||||
clear_playlist:
|
clear_playlist:
|
||||||
description: Send the media player the command to clear players playlist.
|
description: Send the media player the command to clear players playlist.
|
||||||
fields:
|
fields:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user