mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 19:27:45 +00:00
Fix camera play stream (#40641)
Co-authored-by: Justin Wong <46082645+uvjustin@users.noreply.github.com>
This commit is contained in:
parent
af88a78aae
commit
59daab9434
@ -19,6 +19,7 @@ from homeassistant.components.http import KEY_AUTHENTICATED, HomeAssistantView
|
|||||||
from homeassistant.components.media_player.const import (
|
from homeassistant.components.media_player.const import (
|
||||||
ATTR_MEDIA_CONTENT_ID,
|
ATTR_MEDIA_CONTENT_ID,
|
||||||
ATTR_MEDIA_CONTENT_TYPE,
|
ATTR_MEDIA_CONTENT_TYPE,
|
||||||
|
ATTR_MEDIA_EXTRA,
|
||||||
DOMAIN as DOMAIN_MP,
|
DOMAIN as DOMAIN_MP,
|
||||||
SERVICE_PLAY_MEDIA,
|
SERVICE_PLAY_MEDIA,
|
||||||
)
|
)
|
||||||
@ -46,7 +47,7 @@ from homeassistant.helpers.config_validation import ( # noqa: F401
|
|||||||
PLATFORM_SCHEMA,
|
PLATFORM_SCHEMA,
|
||||||
PLATFORM_SCHEMA_BASE,
|
PLATFORM_SCHEMA_BASE,
|
||||||
)
|
)
|
||||||
from homeassistant.helpers.entity import Entity
|
from homeassistant.helpers.entity import Entity, entity_sources
|
||||||
from homeassistant.helpers.entity_component import EntityComponent
|
from homeassistant.helpers.entity_component import EntityComponent
|
||||||
from homeassistant.helpers.network import get_url
|
from homeassistant.helpers.network import get_url
|
||||||
from homeassistant.loader import bind_hass
|
from homeassistant.loader import bind_hass
|
||||||
@ -695,13 +696,46 @@ async def async_handle_play_stream_service(camera, service_call):
|
|||||||
options=camera.stream_options,
|
options=camera.stream_options,
|
||||||
)
|
)
|
||||||
data = {
|
data = {
|
||||||
ATTR_ENTITY_ID: entity_ids,
|
|
||||||
ATTR_MEDIA_CONTENT_ID: f"{get_url(hass)}{url}",
|
ATTR_MEDIA_CONTENT_ID: f"{get_url(hass)}{url}",
|
||||||
ATTR_MEDIA_CONTENT_TYPE: FORMAT_CONTENT_TYPE[fmt],
|
ATTR_MEDIA_CONTENT_TYPE: FORMAT_CONTENT_TYPE[fmt],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# It is required to send a different payload for cast media players
|
||||||
|
cast_entity_ids = [
|
||||||
|
entity
|
||||||
|
for entity, source in entity_sources(hass).items()
|
||||||
|
if entity in entity_ids and source["domain"] == "cast"
|
||||||
|
]
|
||||||
|
other_entity_ids = list(set(entity_ids) - set(cast_entity_ids))
|
||||||
|
|
||||||
|
if cast_entity_ids:
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
DOMAIN_MP, SERVICE_PLAY_MEDIA, data, blocking=True, context=service_call.context
|
DOMAIN_MP,
|
||||||
|
SERVICE_PLAY_MEDIA,
|
||||||
|
{
|
||||||
|
ATTR_ENTITY_ID: cast_entity_ids,
|
||||||
|
**data,
|
||||||
|
ATTR_MEDIA_EXTRA: {
|
||||||
|
"stream_type": "LIVE",
|
||||||
|
"media_info": {
|
||||||
|
"hlsVideoSegmentFormat": "fmp4",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
blocking=True,
|
||||||
|
context=service_call.context,
|
||||||
|
)
|
||||||
|
|
||||||
|
if other_entity_ids:
|
||||||
|
await hass.services.async_call(
|
||||||
|
DOMAIN_MP,
|
||||||
|
SERVICE_PLAY_MEDIA,
|
||||||
|
{
|
||||||
|
ATTR_ENTITY_ID: other_entity_ids,
|
||||||
|
**data,
|
||||||
|
},
|
||||||
|
blocking=True,
|
||||||
|
context=service_call.context,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"name": "Google Cast",
|
"name": "Google Cast",
|
||||||
"config_flow": true,
|
"config_flow": true,
|
||||||
"documentation": "https://www.home-assistant.io/integrations/cast",
|
"documentation": "https://www.home-assistant.io/integrations/cast",
|
||||||
"requirements": ["pychromecast==7.2.1"],
|
"requirements": ["pychromecast==7.5.0"],
|
||||||
"after_dependencies": ["cloud", "http", "media_source", "tts", "zeroconf"],
|
"after_dependencies": ["cloud", "http", "media_source", "tts", "zeroconf"],
|
||||||
"zeroconf": ["_googlecast._tcp.local."],
|
"zeroconf": ["_googlecast._tcp.local."],
|
||||||
"codeowners": ["@emontnemery"]
|
"codeowners": ["@emontnemery"]
|
||||||
|
@ -21,6 +21,7 @@ from homeassistant.components import media_source, zeroconf
|
|||||||
from homeassistant.components.http.auth import async_sign_path
|
from homeassistant.components.http.auth import async_sign_path
|
||||||
from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity
|
from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity
|
||||||
from homeassistant.components.media_player.const import (
|
from homeassistant.components.media_player.const import (
|
||||||
|
ATTR_MEDIA_EXTRA,
|
||||||
MEDIA_TYPE_MOVIE,
|
MEDIA_TYPE_MOVIE,
|
||||||
MEDIA_TYPE_MUSIC,
|
MEDIA_TYPE_MUSIC,
|
||||||
MEDIA_TYPE_TVSHOW,
|
MEDIA_TYPE_TVSHOW,
|
||||||
@ -574,7 +575,9 @@ class CastDevice(MediaPlayerEntity):
|
|||||||
except NotImplementedError:
|
except NotImplementedError:
|
||||||
_LOGGER.error("App %s not supported", app_name)
|
_LOGGER.error("App %s not supported", app_name)
|
||||||
else:
|
else:
|
||||||
self._chromecast.media_controller.play_media(media_id, media_type)
|
self._chromecast.media_controller.play_media(
|
||||||
|
media_id, media_type, **kwargs.get(ATTR_MEDIA_EXTRA, {})
|
||||||
|
)
|
||||||
|
|
||||||
# ========== Properties ==========
|
# ========== Properties ==========
|
||||||
@property
|
@property
|
||||||
|
@ -71,6 +71,7 @@ from .const import (
|
|||||||
ATTR_MEDIA_DURATION,
|
ATTR_MEDIA_DURATION,
|
||||||
ATTR_MEDIA_ENQUEUE,
|
ATTR_MEDIA_ENQUEUE,
|
||||||
ATTR_MEDIA_EPISODE,
|
ATTR_MEDIA_EPISODE,
|
||||||
|
ATTR_MEDIA_EXTRA,
|
||||||
ATTR_MEDIA_PLAYLIST,
|
ATTR_MEDIA_PLAYLIST,
|
||||||
ATTR_MEDIA_POSITION,
|
ATTR_MEDIA_POSITION,
|
||||||
ATTR_MEDIA_POSITION_UPDATED_AT,
|
ATTR_MEDIA_POSITION_UPDATED_AT,
|
||||||
@ -139,6 +140,7 @@ MEDIA_PLAYER_PLAY_MEDIA_SCHEMA = {
|
|||||||
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,
|
||||||
vol.Optional(ATTR_MEDIA_ENQUEUE): cv.boolean,
|
vol.Optional(ATTR_MEDIA_ENQUEUE): cv.boolean,
|
||||||
|
vol.Optional(ATTR_MEDIA_EXTRA, default={}): dict,
|
||||||
}
|
}
|
||||||
|
|
||||||
ATTR_TO_PROPERTY = [
|
ATTR_TO_PROPERTY = [
|
||||||
|
@ -12,6 +12,7 @@ ATTR_MEDIA_CONTENT_ID = "media_content_id"
|
|||||||
ATTR_MEDIA_CONTENT_TYPE = "media_content_type"
|
ATTR_MEDIA_CONTENT_TYPE = "media_content_type"
|
||||||
ATTR_MEDIA_DURATION = "media_duration"
|
ATTR_MEDIA_DURATION = "media_duration"
|
||||||
ATTR_MEDIA_ENQUEUE = "enqueue"
|
ATTR_MEDIA_ENQUEUE = "enqueue"
|
||||||
|
ATTR_MEDIA_EXTRA = "extra"
|
||||||
ATTR_MEDIA_EPISODE = "media_episode"
|
ATTR_MEDIA_EPISODE = "media_episode"
|
||||||
ATTR_MEDIA_PLAYLIST = "media_playlist"
|
ATTR_MEDIA_PLAYLIST = "media_playlist"
|
||||||
ATTR_MEDIA_POSITION = "media_position"
|
ATTR_MEDIA_POSITION = "media_position"
|
||||||
|
@ -1265,7 +1265,7 @@ pycfdns==0.0.1
|
|||||||
pychannels==1.0.0
|
pychannels==1.0.0
|
||||||
|
|
||||||
# homeassistant.components.cast
|
# homeassistant.components.cast
|
||||||
pychromecast==7.2.1
|
pychromecast==7.5.0
|
||||||
|
|
||||||
# homeassistant.components.cmus
|
# homeassistant.components.cmus
|
||||||
pycmus==0.1.1
|
pycmus==0.1.1
|
||||||
|
@ -613,7 +613,7 @@ pyblackbird==0.5
|
|||||||
pybotvac==0.0.17
|
pybotvac==0.0.17
|
||||||
|
|
||||||
# homeassistant.components.cast
|
# homeassistant.components.cast
|
||||||
pychromecast==7.2.1
|
pychromecast==7.5.0
|
||||||
|
|
||||||
# homeassistant.components.coolmaster
|
# homeassistant.components.coolmaster
|
||||||
pycoolmasternet-async==0.1.2
|
pycoolmasternet-async==0.1.2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user