Update integrations to pass target player when resolving media (#72597)
parent
f76afffd5a
commit
47d0cc9b09
homeassistant/components
apple_tv
bluesound
cast
dlna_dmr
esphome
forked_daapd
gstreamer
heos
kodi
openhome
panasonic_viera
roku
slimproto
sonos
soundtouch
squeezebox
unifiprotect
vlc_telnet
yamaha_musiccast
tests/components
camera
google_translate
marytts
media_source
motioneye
netatmo
voicerss
yandextts
|
@ -284,7 +284,9 @@ class AppleTvMediaPlayer(AppleTVEntity, MediaPlayerEntity):
|
|||
await self.atv.apps.launch_app(media_id)
|
||||
|
||||
if media_source.is_media_source_id(media_id):
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = play_item.url
|
||||
media_type = MEDIA_TYPE_MUSIC
|
||||
|
||||
|
|
|
@ -1025,7 +1025,9 @@ class BluesoundPlayer(MediaPlayerEntity):
|
|||
return
|
||||
|
||||
if media_source.is_media_source_id(media_id):
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = play_item.url
|
||||
|
||||
media_id = async_process_play_media_url(self.hass, media_id)
|
||||
|
|
|
@ -605,7 +605,9 @@ class CastMediaPlayerEntity(CastDevice, MediaPlayerEntity):
|
|||
"""Play a piece of media."""
|
||||
# Handle media_source
|
||||
if media_source.is_media_source_id(media_id):
|
||||
sourced_media = await media_source.async_resolve_media(self.hass, media_id)
|
||||
sourced_media = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_type = sourced_media.mime_type
|
||||
media_id = sourced_media.url
|
||||
|
||||
|
|
|
@ -597,7 +597,9 @@ class DlnaDmrEntity(MediaPlayerEntity):
|
|||
|
||||
# If media is media_source, resolve it to url and MIME type, and maybe metadata
|
||||
if media_source.is_media_source_id(media_id):
|
||||
sourced_media = await media_source.async_resolve_media(self.hass, media_id)
|
||||
sourced_media = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_type = sourced_media.mime_type
|
||||
media_id = sourced_media.url
|
||||
_LOGGER.debug("sourced_media is %s", sourced_media)
|
||||
|
|
|
@ -95,7 +95,9 @@ class EsphomeMediaPlayer(
|
|||
) -> None:
|
||||
"""Send the play command with media url to the media player."""
|
||||
if media_source.is_media_source_id(media_id):
|
||||
sourced_media = await media_source.async_resolve_media(self.hass, media_id)
|
||||
sourced_media = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = sourced_media.url
|
||||
|
||||
media_id = async_process_play_media_url(self.hass, media_id)
|
||||
|
|
|
@ -666,7 +666,9 @@ class ForkedDaapdMaster(MediaPlayerEntity):
|
|||
"""Play a URI."""
|
||||
if media_source.is_media_source_id(media_id):
|
||||
media_type = MEDIA_TYPE_MUSIC
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = play_item.url
|
||||
|
||||
if media_type == MEDIA_TYPE_MUSIC:
|
||||
|
|
|
@ -96,7 +96,9 @@ class GstreamerDevice(MediaPlayerEntity):
|
|||
"""Play media."""
|
||||
# Handle media_source
|
||||
if media_source.is_media_source_id(media_id):
|
||||
sourced_media = await media_source.async_resolve_media(self.hass, media_id)
|
||||
sourced_media = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = sourced_media.url
|
||||
|
||||
elif media_type != MEDIA_TYPE_MUSIC:
|
||||
|
|
|
@ -201,7 +201,9 @@ class HeosMediaPlayer(MediaPlayerEntity):
|
|||
"""Play a piece of media."""
|
||||
if media_source.is_media_source_id(media_id):
|
||||
media_type = MEDIA_TYPE_URL
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = play_item.url
|
||||
|
||||
if media_type in (MEDIA_TYPE_URL, MEDIA_TYPE_MUSIC):
|
||||
|
|
|
@ -713,7 +713,9 @@ class KodiEntity(MediaPlayerEntity):
|
|||
"""Send the play_media command to the media player."""
|
||||
if media_source.is_media_source_id(media_id):
|
||||
media_type = MEDIA_TYPE_URL
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = play_item.url
|
||||
|
||||
media_type_lower = media_type.lower()
|
||||
|
|
|
@ -453,7 +453,9 @@ class MpdDevice(MediaPlayerEntity):
|
|||
"""Send the media player the command for playing a playlist."""
|
||||
if media_source.is_media_source_id(media_id):
|
||||
media_type = MEDIA_TYPE_MUSIC
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = async_process_play_media_url(self.hass, play_item.url)
|
||||
|
||||
if media_type == MEDIA_TYPE_PLAYLIST:
|
||||
|
|
|
@ -209,7 +209,9 @@ class OpenhomeDevice(MediaPlayerEntity):
|
|||
"""Send the play_media command to the media player."""
|
||||
if media_source.is_media_source_id(media_id):
|
||||
media_type = MEDIA_TYPE_MUSIC
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = play_item.url
|
||||
|
||||
if media_type != MEDIA_TYPE_MUSIC:
|
||||
|
|
|
@ -188,7 +188,9 @@ class PanasonicVieraTVEntity(MediaPlayerEntity):
|
|||
"""Play media."""
|
||||
if media_source.is_media_source_id(media_id):
|
||||
media_type = MEDIA_TYPE_URL
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = play_item.url
|
||||
|
||||
if media_type != MEDIA_TYPE_URL:
|
||||
|
|
|
@ -384,7 +384,9 @@ class RokuMediaPlayer(RokuEntity, MediaPlayerEntity):
|
|||
|
||||
# Handle media_source
|
||||
if media_source.is_media_source_id(media_id):
|
||||
sourced_media = await media_source.async_resolve_media(self.hass, media_id)
|
||||
sourced_media = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_type = MEDIA_TYPE_URL
|
||||
media_id = sourced_media.url
|
||||
mime_type = sourced_media.mime_type
|
||||
|
|
|
@ -180,7 +180,9 @@ class SlimProtoPlayer(MediaPlayerEntity):
|
|||
to_send_media_type: str | None = media_type
|
||||
# Handle media_source
|
||||
if media_source.is_media_source_id(media_id):
|
||||
sourced_media = await media_source.async_resolve_media(self.hass, media_id)
|
||||
sourced_media = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = sourced_media.url
|
||||
to_send_media_type = sourced_media.mime_type
|
||||
|
||||
|
|
|
@ -550,7 +550,9 @@ class SonosMediaPlayerEntity(SonosEntity, MediaPlayerEntity):
|
|||
media_type = MEDIA_TYPE_MUSIC
|
||||
media_id = (
|
||||
run_coroutine_threadsafe(
|
||||
media_source.async_resolve_media(self.hass, media_id),
|
||||
media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
),
|
||||
self.hass.loop,
|
||||
)
|
||||
.result()
|
||||
|
|
|
@ -357,7 +357,9 @@ class SoundTouchDevice(MediaPlayerEntity):
|
|||
async def async_play_media(self, media_type, media_id, **kwargs):
|
||||
"""Play a piece of media."""
|
||||
if media_source.is_media_source_id(media_id):
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = async_process_play_media_url(self.hass, play_item.url)
|
||||
|
||||
await self.hass.async_add_executor_job(
|
||||
|
|
|
@ -484,7 +484,9 @@ class SqueezeBoxEntity(MediaPlayerEntity):
|
|||
|
||||
if media_source.is_media_source_id(media_id):
|
||||
media_type = MEDIA_TYPE_MUSIC
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = play_item.url
|
||||
|
||||
if media_type in MEDIA_TYPE_MUSIC:
|
||||
|
|
|
@ -118,7 +118,9 @@ class ProtectMediaPlayer(ProtectDeviceEntity, MediaPlayerEntity):
|
|||
"""Play a piece of media."""
|
||||
if media_source.is_media_source_id(media_id):
|
||||
media_type = MEDIA_TYPE_MUSIC
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = async_process_play_media_url(self.hass, play_item.url)
|
||||
|
||||
if media_type != MEDIA_TYPE_MUSIC:
|
||||
|
|
|
@ -168,7 +168,9 @@ class VlcDevice(MediaPlayerEntity):
|
|||
"""Play media from a URL or file."""
|
||||
# Handle media_source
|
||||
if media_source.is_media_source_id(media_id):
|
||||
sourced_media = await media_source.async_resolve_media(self.hass, media_id)
|
||||
sourced_media = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = sourced_media.url
|
||||
|
||||
elif media_type != MEDIA_TYPE_MUSIC:
|
||||
|
|
|
@ -296,7 +296,9 @@ class VlcDevice(MediaPlayerEntity):
|
|||
"""Play media from a URL or file."""
|
||||
# Handle media_source
|
||||
if media_source.is_media_source_id(media_id):
|
||||
sourced_media = await media_source.async_resolve_media(self.hass, media_id)
|
||||
sourced_media = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_type = sourced_media.mime_type
|
||||
media_id = sourced_media.url
|
||||
|
||||
|
|
|
@ -275,7 +275,9 @@ class MusicCastMediaPlayer(MusicCastDeviceEntity, MediaPlayerEntity):
|
|||
async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> None:
|
||||
"""Play media."""
|
||||
if media_source.is_media_source_id(media_id):
|
||||
play_item = await media_source.async_resolve_media(self.hass, media_id)
|
||||
play_item = await media_source.async_resolve_media(
|
||||
self.hass, media_id, self.entity_id
|
||||
)
|
||||
media_id = play_item.url
|
||||
|
||||
if self.state == STATE_OFF:
|
||||
|
|
|
@ -62,7 +62,7 @@ async def test_resolving(hass, mock_camera_hls):
|
|||
return_value="http://example.com/stream",
|
||||
):
|
||||
item = await media_source.async_resolve_media(
|
||||
hass, "media-source://camera/camera.demo_camera"
|
||||
hass, "media-source://camera/camera.demo_camera", None
|
||||
)
|
||||
assert item is not None
|
||||
assert item.url == "http://example.com/stream"
|
||||
|
@ -74,7 +74,7 @@ async def test_resolving_errors(hass, mock_camera_hls):
|
|||
|
||||
with pytest.raises(media_source.Unresolvable) as exc_info:
|
||||
await media_source.async_resolve_media(
|
||||
hass, "media-source://camera/camera.demo_camera"
|
||||
hass, "media-source://camera/camera.demo_camera", None
|
||||
)
|
||||
assert str(exc_info.value) == "Stream integration not loaded"
|
||||
|
||||
|
@ -82,7 +82,7 @@ async def test_resolving_errors(hass, mock_camera_hls):
|
|||
|
||||
with pytest.raises(media_source.Unresolvable) as exc_info:
|
||||
await media_source.async_resolve_media(
|
||||
hass, "media-source://camera/camera.non_existing"
|
||||
hass, "media-source://camera/camera.non_existing", None
|
||||
)
|
||||
assert str(exc_info.value) == "Could not resolve media item: camera.non_existing"
|
||||
|
||||
|
@ -91,13 +91,13 @@ async def test_resolving_errors(hass, mock_camera_hls):
|
|||
new_callable=PropertyMock(return_value=StreamType.WEB_RTC),
|
||||
):
|
||||
await media_source.async_resolve_media(
|
||||
hass, "media-source://camera/camera.demo_camera"
|
||||
hass, "media-source://camera/camera.demo_camera", None
|
||||
)
|
||||
assert str(exc_info.value) == "Camera does not support MJPEG or HLS streaming."
|
||||
|
||||
with pytest.raises(media_source.Unresolvable) as exc_info:
|
||||
await media_source.async_resolve_media(
|
||||
hass, "media-source://camera/camera.demo_camera"
|
||||
hass, "media-source://camera/camera.demo_camera", None
|
||||
)
|
||||
assert (
|
||||
str(exc_info.value) == "camera.demo_camera does not support play stream service"
|
||||
|
|
|
@ -152,15 +152,15 @@ async def test_unavailable_device(
|
|||
)
|
||||
with pytest.raises(Unresolvable, match="DMS is not connected"):
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}//resolve_path"
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}//resolve_path", None
|
||||
)
|
||||
with pytest.raises(Unresolvable, match="DMS is not connected"):
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/:resolve_object"
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/:resolve_object", None
|
||||
)
|
||||
with pytest.raises(Unresolvable):
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/?resolve_search"
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/?resolve_search", None
|
||||
)
|
||||
|
||||
|
||||
|
@ -651,7 +651,7 @@ async def test_become_unavailable(
|
|||
|
||||
# Check async_resolve_object currently works
|
||||
assert await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/:object_id"
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/:object_id", None
|
||||
)
|
||||
|
||||
# Now break the network connection
|
||||
|
@ -660,7 +660,7 @@ async def test_become_unavailable(
|
|||
# async_resolve_object should fail
|
||||
with pytest.raises(Unresolvable):
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/:object_id"
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/:object_id", None
|
||||
)
|
||||
|
||||
# The device should now be unavailable
|
||||
|
|
|
@ -45,7 +45,7 @@ async def async_resolve_media(
|
|||
) -> DidlPlayMedia:
|
||||
"""Call media_source.async_resolve_media with the test source's ID."""
|
||||
result = await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/{media_content_id}"
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/{media_content_id}", None
|
||||
)
|
||||
assert isinstance(result, DidlPlayMedia)
|
||||
return result
|
||||
|
|
|
@ -60,31 +60,31 @@ async def test_resolve_media_bad_identifier(
|
|||
"""Test trying to resolve an item that has an unresolvable identifier."""
|
||||
# Empty identifier
|
||||
with pytest.raises(Unresolvable, match="No source ID.*"):
|
||||
await media_source.async_resolve_media(hass, f"media-source://{DOMAIN}")
|
||||
await media_source.async_resolve_media(hass, f"media-source://{DOMAIN}", None)
|
||||
|
||||
# Identifier has media_id but no source_id
|
||||
# media_source.URI_SCHEME_REGEX won't let the ID through to dlna_dms
|
||||
with pytest.raises(Unresolvable, match="Invalid media source URI"):
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}//media_id"
|
||||
hass, f"media-source://{DOMAIN}//media_id", None
|
||||
)
|
||||
|
||||
# Identifier has source_id but no media_id
|
||||
with pytest.raises(Unresolvable, match="No media ID.*"):
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}/source_id/"
|
||||
hass, f"media-source://{DOMAIN}/source_id/", None
|
||||
)
|
||||
|
||||
# Identifier is missing source_id/media_id separator
|
||||
with pytest.raises(Unresolvable, match="No media ID.*"):
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}/source_id"
|
||||
hass, f"media-source://{DOMAIN}/source_id", None
|
||||
)
|
||||
|
||||
# Identifier has an unknown source_id
|
||||
with pytest.raises(Unresolvable, match="Unknown source ID: unknown_source"):
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}/unknown_source/media_id"
|
||||
hass, f"media-source://{DOMAIN}/unknown_source/media_id", None
|
||||
)
|
||||
|
||||
|
||||
|
@ -105,7 +105,7 @@ async def test_resolve_media_success(
|
|||
dms_device_mock.async_browse_metadata.return_value = didl_item
|
||||
|
||||
result = await media_source.async_resolve_media(
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/:{object_id}"
|
||||
hass, f"media-source://{DOMAIN}/{MOCK_SOURCE_ID}/:{object_id}", None
|
||||
)
|
||||
assert isinstance(result, DidlPlayMedia)
|
||||
assert result.url == f"{MOCK_DEVICE_BASE_URL}/{res_url}"
|
||||
|
|
|
@ -25,7 +25,7 @@ async def get_media_source_url(hass, media_content_id):
|
|||
if media_source.DOMAIN not in hass.config.components:
|
||||
assert await async_setup_component(hass, media_source.DOMAIN, {})
|
||||
|
||||
resolved = await media_source.async_resolve_media(hass, media_content_id)
|
||||
resolved = await media_source.async_resolve_media(hass, media_content_id, None)
|
||||
return resolved.url
|
||||
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ async def get_media_source_url(hass, media_content_id):
|
|||
if media_source.DOMAIN not in hass.config.components:
|
||||
assert await async_setup_component(hass, media_source.DOMAIN, {})
|
||||
|
||||
resolved = await media_source.async_resolve_media(hass, media_content_id)
|
||||
resolved = await media_source.async_resolve_media(hass, media_content_id, None)
|
||||
return resolved.url
|
||||
|
||||
|
||||
|
|
|
@ -103,6 +103,7 @@ async def test_async_resolve_media(hass):
|
|||
media = await media_source.async_resolve_media(
|
||||
hass,
|
||||
media_source.generate_media_source_id(media_source.DOMAIN, "local/test.mp3"),
|
||||
None,
|
||||
)
|
||||
assert isinstance(media, media_source.models.PlayMedia)
|
||||
assert media.url == "/media/local/test.mp3"
|
||||
|
@ -135,15 +136,17 @@ async def test_async_unresolve_media(hass):
|
|||
|
||||
# Test no media content
|
||||
with pytest.raises(media_source.Unresolvable):
|
||||
await media_source.async_resolve_media(hass, "")
|
||||
await media_source.async_resolve_media(hass, "", None)
|
||||
|
||||
# Test invalid media content
|
||||
with pytest.raises(media_source.Unresolvable):
|
||||
await media_source.async_resolve_media(hass, "invalid")
|
||||
await media_source.async_resolve_media(hass, "invalid", None)
|
||||
|
||||
# Test invalid media source
|
||||
with pytest.raises(media_source.Unresolvable):
|
||||
await media_source.async_resolve_media(hass, "media-source://media_source2")
|
||||
await media_source.async_resolve_media(
|
||||
hass, "media-source://media_source2", None
|
||||
)
|
||||
|
||||
|
||||
async def test_websocket_browse_media(hass, hass_ws_client):
|
||||
|
@ -261,4 +264,4 @@ async def test_browse_resolve_without_setup():
|
|||
await media_source.async_browse_media(Mock(data={}), None)
|
||||
|
||||
with pytest.raises(media_source.Unresolvable):
|
||||
await media_source.async_resolve_media(Mock(data={}), None)
|
||||
await media_source.async_resolve_media(Mock(data={}), None, None)
|
||||
|
|
|
@ -367,6 +367,7 @@ async def test_async_resolve_media_success(hass: HomeAssistant) -> None:
|
|||
f"{const.URI_SCHEME}{DOMAIN}"
|
||||
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#movies#/foo.mp4"
|
||||
),
|
||||
None,
|
||||
)
|
||||
assert media == PlayMedia(url="http://movie-url", mime_type="video/mp4")
|
||||
assert client.get_movie_url.call_args == call(TEST_CAMERA_ID, "/foo.mp4")
|
||||
|
@ -379,6 +380,7 @@ async def test_async_resolve_media_success(hass: HomeAssistant) -> None:
|
|||
f"{const.URI_SCHEME}{DOMAIN}"
|
||||
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#images#/foo.jpg"
|
||||
),
|
||||
None,
|
||||
)
|
||||
assert media == PlayMedia(url="http://image-url", mime_type="image/jpeg")
|
||||
assert client.get_image_url.call_args == call(TEST_CAMERA_ID, "/foo.jpg")
|
||||
|
@ -409,18 +411,20 @@ async def test_async_resolve_media_failure(hass: HomeAssistant) -> None:
|
|||
|
||||
# URI doesn't contain necessary components.
|
||||
with pytest.raises(Unresolvable):
|
||||
await media_source.async_resolve_media(hass, f"{const.URI_SCHEME}{DOMAIN}/foo")
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/foo", None
|
||||
)
|
||||
|
||||
# Config entry doesn't exist.
|
||||
with pytest.raises(MediaSourceError):
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/1#2#3#4"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/1#2#3#4", None
|
||||
)
|
||||
|
||||
# Device doesn't exist.
|
||||
with pytest.raises(MediaSourceError):
|
||||
await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{TEST_CONFIG_ENTRY_ID}#2#3#4"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{TEST_CONFIG_ENTRY_ID}#2#3#4", None
|
||||
)
|
||||
|
||||
# Device identifiers are incorrect (no camera id)
|
||||
|
@ -431,6 +435,7 @@ async def test_async_resolve_media_failure(hass: HomeAssistant) -> None:
|
|||
f"{const.URI_SCHEME}{DOMAIN}"
|
||||
f"/{TEST_CONFIG_ENTRY_ID}#{broken_device_1.id}#images#4"
|
||||
),
|
||||
None,
|
||||
)
|
||||
|
||||
# Device identifiers are incorrect (non integer camera id)
|
||||
|
@ -441,6 +446,7 @@ async def test_async_resolve_media_failure(hass: HomeAssistant) -> None:
|
|||
f"{const.URI_SCHEME}{DOMAIN}"
|
||||
f"/{TEST_CONFIG_ENTRY_ID}#{broken_device_2.id}#images#4"
|
||||
),
|
||||
None,
|
||||
)
|
||||
|
||||
# Kind is incorrect.
|
||||
|
@ -448,6 +454,7 @@ async def test_async_resolve_media_failure(hass: HomeAssistant) -> None:
|
|||
await media_source.async_resolve_media(
|
||||
hass,
|
||||
f"{const.URI_SCHEME}{DOMAIN}/{TEST_CONFIG_ENTRY_ID}#{device.id}#games#moo",
|
||||
None,
|
||||
)
|
||||
|
||||
# Playback URL raises exception.
|
||||
|
@ -459,6 +466,7 @@ async def test_async_resolve_media_failure(hass: HomeAssistant) -> None:
|
|||
f"{const.URI_SCHEME}{DOMAIN}"
|
||||
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#movies#/foo.mp4"
|
||||
),
|
||||
None,
|
||||
)
|
||||
|
||||
# Media path does not start with '/'
|
||||
|
@ -470,6 +478,7 @@ async def test_async_resolve_media_failure(hass: HomeAssistant) -> None:
|
|||
f"{const.URI_SCHEME}{DOMAIN}"
|
||||
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#movies#foo.mp4"
|
||||
),
|
||||
None,
|
||||
)
|
||||
|
||||
# Media missing path.
|
||||
|
|
|
@ -361,7 +361,7 @@ async def test_camera_event(hass, auth, hass_client):
|
|||
|
||||
# Resolving the event links to the media
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{device.id}/{event_identifier}"
|
||||
assert media.mime_type == "image/jpeg"
|
||||
|
@ -374,7 +374,7 @@ async def test_camera_event(hass, auth, hass_client):
|
|||
|
||||
# Resolving the device id points to the most recent event
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{device.id}/{event_identifier}"
|
||||
assert media.mime_type == "image/jpeg"
|
||||
|
@ -535,7 +535,7 @@ async def test_multiple_image_events_in_session(hass, auth, hass_client):
|
|||
|
||||
# Resolve the most recent event
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier2}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier2}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{device.id}/{event_identifier2}"
|
||||
assert media.mime_type == "image/jpeg"
|
||||
|
@ -548,7 +548,7 @@ async def test_multiple_image_events_in_session(hass, auth, hass_client):
|
|||
|
||||
# Resolving the event links to the media
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier1}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier1}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{device.id}/{event_identifier1}"
|
||||
assert media.mime_type == "image/jpeg"
|
||||
|
@ -632,7 +632,7 @@ async def test_multiple_clip_preview_events_in_session(hass, auth, hass_client):
|
|||
# to the same clip preview media clip object.
|
||||
# Resolve media for the first event
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier1}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier1}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{device.id}/{event_identifier1}"
|
||||
assert media.mime_type == "video/mp4"
|
||||
|
@ -645,7 +645,7 @@ async def test_multiple_clip_preview_events_in_session(hass, auth, hass_client):
|
|||
|
||||
# Resolve media for the second event
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier1}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier1}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{device.id}/{event_identifier1}"
|
||||
assert media.mime_type == "video/mp4"
|
||||
|
@ -712,6 +712,7 @@ async def test_resolve_missing_event_id(hass, auth):
|
|||
await media_source.async_resolve_media(
|
||||
hass,
|
||||
f"{const.URI_SCHEME}{DOMAIN}/{device.id}",
|
||||
None,
|
||||
)
|
||||
|
||||
|
||||
|
@ -723,6 +724,7 @@ async def test_resolve_invalid_device_id(hass, auth):
|
|||
await media_source.async_resolve_media(
|
||||
hass,
|
||||
f"{const.URI_SCHEME}{DOMAIN}/invalid-device-id/GXXWRWVeHNUlUU3V3MGV3bUOYW...",
|
||||
None,
|
||||
)
|
||||
|
||||
|
||||
|
@ -740,6 +742,7 @@ async def test_resolve_invalid_event_id(hass, auth):
|
|||
media = await media_source.async_resolve_media(
|
||||
hass,
|
||||
f"{const.URI_SCHEME}{DOMAIN}/{device.id}/GXXWRWVeHNUlUU3V3MGV3bUOYW...",
|
||||
None,
|
||||
)
|
||||
assert (
|
||||
media.url == f"/api/nest/event_media/{device.id}/GXXWRWVeHNUlUU3V3MGV3bUOYW..."
|
||||
|
@ -835,7 +838,7 @@ async def test_camera_event_clip_preview(hass, auth, hass_client, mp4):
|
|||
|
||||
# Resolving the event links to the media
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{device.id}/{event_identifier}"
|
||||
assert media.mime_type == "video/mp4"
|
||||
|
@ -921,7 +924,7 @@ async def test_event_media_failure(hass, auth, hass_client):
|
|||
|
||||
# Resolving the event links to the media
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{device.id}/{event_identifier}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{device.id}/{event_identifier}"
|
||||
assert media.mime_type == "image/jpeg"
|
||||
|
@ -1128,7 +1131,7 @@ async def test_media_store_persistence(hass, auth, hass_client, event_store):
|
|||
event_identifier = browse.children[0].identifier
|
||||
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{event_identifier}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{event_identifier}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{event_identifier}"
|
||||
assert media.mime_type == "video/mp4"
|
||||
|
@ -1182,7 +1185,7 @@ async def test_media_store_persistence(hass, auth, hass_client, event_store):
|
|||
event_identifier = browse.children[0].identifier
|
||||
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{event_identifier}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{event_identifier}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{event_identifier}"
|
||||
assert media.mime_type == "video/mp4"
|
||||
|
@ -1234,7 +1237,7 @@ async def test_media_store_save_filesystem_error(hass, auth, hass_client):
|
|||
event = browse.children[0]
|
||||
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{event.identifier}"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/{event.identifier}", None
|
||||
)
|
||||
assert media.url == f"/api/nest/event_media/{event.identifier}"
|
||||
assert media.mime_type == "video/mp4"
|
||||
|
|
|
@ -79,7 +79,7 @@ async def test_async_browse_media(hass):
|
|||
|
||||
# Test successful event resolve
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/events/12:34:56:78:90:ab/1599152672"
|
||||
hass, f"{const.URI_SCHEME}{DOMAIN}/events/12:34:56:78:90:ab/1599152672", None
|
||||
)
|
||||
assert media == PlayMedia(
|
||||
url="http:///files/high/index.m3u8", mime_type="application/x-mpegURL"
|
||||
|
|
|
@ -29,7 +29,7 @@ async def get_media_source_url(hass, media_content_id):
|
|||
if media_source.DOMAIN not in hass.config.components:
|
||||
assert await async_setup_component(hass, media_source.DOMAIN, {})
|
||||
|
||||
resolved = await media_source.async_resolve_media(hass, media_content_id)
|
||||
resolved = await media_source.async_resolve_media(hass, media_content_id, None)
|
||||
return resolved.url
|
||||
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ async def test_browsing(hass):
|
|||
async def test_resolving(hass, mock_get_tts_audio):
|
||||
"""Test resolving."""
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, "media-source://tts/demo?message=Hello%20World"
|
||||
hass, "media-source://tts/demo?message=Hello%20World", None
|
||||
)
|
||||
assert media.url.startswith("/api/tts_proxy/")
|
||||
assert media.mime_type == "audio/mpeg"
|
||||
|
@ -82,7 +82,9 @@ async def test_resolving(hass, mock_get_tts_audio):
|
|||
# Pass language and options
|
||||
mock_get_tts_audio.reset_mock()
|
||||
media = await media_source.async_resolve_media(
|
||||
hass, "media-source://tts/demo?message=Bye%20World&language=de&voice=Paulus"
|
||||
hass,
|
||||
"media-source://tts/demo?message=Bye%20World&language=de&voice=Paulus",
|
||||
None,
|
||||
)
|
||||
assert media.url.startswith("/api/tts_proxy/")
|
||||
assert media.mime_type == "audio/mpeg"
|
||||
|
@ -98,16 +100,18 @@ async def test_resolving_errors(hass):
|
|||
"""Test resolving."""
|
||||
# No message added
|
||||
with pytest.raises(media_source.Unresolvable):
|
||||
await media_source.async_resolve_media(hass, "media-source://tts/demo")
|
||||
await media_source.async_resolve_media(hass, "media-source://tts/demo", None)
|
||||
|
||||
# Non-existing provider
|
||||
with pytest.raises(media_source.Unresolvable):
|
||||
await media_source.async_resolve_media(
|
||||
hass, "media-source://tts/non-existing?message=bla"
|
||||
hass, "media-source://tts/non-existing?message=bla", None
|
||||
)
|
||||
|
||||
# Non-existing option
|
||||
with pytest.raises(media_source.Unresolvable):
|
||||
await media_source.async_resolve_media(
|
||||
hass, "media-source://tts/non-existing?message=bla&non_existing_option=bla"
|
||||
hass,
|
||||
"media-source://tts/non-existing?message=bla&non_existing_option=bla",
|
||||
None,
|
||||
)
|
||||
|
|
|
@ -33,7 +33,7 @@ async def get_media_source_url(hass, media_content_id):
|
|||
if media_source.DOMAIN not in hass.config.components:
|
||||
assert await async_setup_component(hass, media_source.DOMAIN, {})
|
||||
|
||||
resolved = await media_source.async_resolve_media(hass, media_content_id)
|
||||
resolved = await media_source.async_resolve_media(hass, media_content_id, None)
|
||||
return resolved.url
|
||||
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ async def get_media_source_url(hass, media_content_id):
|
|||
if media_source.DOMAIN not in hass.config.components:
|
||||
assert await async_setup_component(hass, media_source.DOMAIN, {})
|
||||
|
||||
resolved = await media_source.async_resolve_media(hass, media_content_id)
|
||||
resolved = await media_source.async_resolve_media(hass, media_content_id, None)
|
||||
return resolved.url
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue