mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 12:17:07 +00:00
Update integrations to pass target player when resolving media (#72597)
This commit is contained in:
parent
f76afffd5a
commit
47d0cc9b09
@ -284,7 +284,9 @@ class AppleTvMediaPlayer(AppleTVEntity, MediaPlayerEntity):
|
|||||||
await self.atv.apps.launch_app(media_id)
|
await self.atv.apps.launch_app(media_id)
|
||||||
|
|
||||||
if media_source.is_media_source_id(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_id = play_item.url
|
||||||
media_type = MEDIA_TYPE_MUSIC
|
media_type = MEDIA_TYPE_MUSIC
|
||||||
|
|
||||||
|
@ -1025,7 +1025,9 @@ class BluesoundPlayer(MediaPlayerEntity):
|
|||||||
return
|
return
|
||||||
|
|
||||||
if media_source.is_media_source_id(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_id = play_item.url
|
||||||
|
|
||||||
media_id = async_process_play_media_url(self.hass, media_id)
|
media_id = async_process_play_media_url(self.hass, media_id)
|
||||||
|
@ -605,7 +605,9 @@ class CastMediaPlayerEntity(CastDevice, MediaPlayerEntity):
|
|||||||
"""Play a piece of media."""
|
"""Play a piece of media."""
|
||||||
# Handle media_source
|
# Handle media_source
|
||||||
if media_source.is_media_source_id(media_id):
|
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_type = sourced_media.mime_type
|
||||||
media_id = sourced_media.url
|
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 is media_source, resolve it to url and MIME type, and maybe metadata
|
||||||
if media_source.is_media_source_id(media_id):
|
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_type = sourced_media.mime_type
|
||||||
media_id = sourced_media.url
|
media_id = sourced_media.url
|
||||||
_LOGGER.debug("sourced_media is %s", sourced_media)
|
_LOGGER.debug("sourced_media is %s", sourced_media)
|
||||||
|
@ -95,7 +95,9 @@ class EsphomeMediaPlayer(
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""Send the play command with media url to the media player."""
|
"""Send the play command with media url to the media player."""
|
||||||
if media_source.is_media_source_id(media_id):
|
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 = sourced_media.url
|
||||||
|
|
||||||
media_id = async_process_play_media_url(self.hass, media_id)
|
media_id = async_process_play_media_url(self.hass, media_id)
|
||||||
|
@ -666,7 +666,9 @@ class ForkedDaapdMaster(MediaPlayerEntity):
|
|||||||
"""Play a URI."""
|
"""Play a URI."""
|
||||||
if media_source.is_media_source_id(media_id):
|
if media_source.is_media_source_id(media_id):
|
||||||
media_type = MEDIA_TYPE_MUSIC
|
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
|
media_id = play_item.url
|
||||||
|
|
||||||
if media_type == MEDIA_TYPE_MUSIC:
|
if media_type == MEDIA_TYPE_MUSIC:
|
||||||
|
@ -96,7 +96,9 @@ class GstreamerDevice(MediaPlayerEntity):
|
|||||||
"""Play media."""
|
"""Play media."""
|
||||||
# Handle media_source
|
# Handle media_source
|
||||||
if media_source.is_media_source_id(media_id):
|
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 = sourced_media.url
|
||||||
|
|
||||||
elif media_type != MEDIA_TYPE_MUSIC:
|
elif media_type != MEDIA_TYPE_MUSIC:
|
||||||
|
@ -201,7 +201,9 @@ class HeosMediaPlayer(MediaPlayerEntity):
|
|||||||
"""Play a piece of media."""
|
"""Play a piece of media."""
|
||||||
if media_source.is_media_source_id(media_id):
|
if media_source.is_media_source_id(media_id):
|
||||||
media_type = MEDIA_TYPE_URL
|
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_id = play_item.url
|
||||||
|
|
||||||
if media_type in (MEDIA_TYPE_URL, MEDIA_TYPE_MUSIC):
|
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."""
|
"""Send the play_media command to the media player."""
|
||||||
if media_source.is_media_source_id(media_id):
|
if media_source.is_media_source_id(media_id):
|
||||||
media_type = MEDIA_TYPE_URL
|
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_id = play_item.url
|
||||||
|
|
||||||
media_type_lower = media_type.lower()
|
media_type_lower = media_type.lower()
|
||||||
|
@ -453,7 +453,9 @@ class MpdDevice(MediaPlayerEntity):
|
|||||||
"""Send the media player the command for playing a playlist."""
|
"""Send the media player the command for playing a playlist."""
|
||||||
if media_source.is_media_source_id(media_id):
|
if media_source.is_media_source_id(media_id):
|
||||||
media_type = MEDIA_TYPE_MUSIC
|
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)
|
media_id = async_process_play_media_url(self.hass, play_item.url)
|
||||||
|
|
||||||
if media_type == MEDIA_TYPE_PLAYLIST:
|
if media_type == MEDIA_TYPE_PLAYLIST:
|
||||||
|
@ -209,7 +209,9 @@ class OpenhomeDevice(MediaPlayerEntity):
|
|||||||
"""Send the play_media command to the media player."""
|
"""Send the play_media command to the media player."""
|
||||||
if media_source.is_media_source_id(media_id):
|
if media_source.is_media_source_id(media_id):
|
||||||
media_type = MEDIA_TYPE_MUSIC
|
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
|
media_id = play_item.url
|
||||||
|
|
||||||
if media_type != MEDIA_TYPE_MUSIC:
|
if media_type != MEDIA_TYPE_MUSIC:
|
||||||
|
@ -188,7 +188,9 @@ class PanasonicVieraTVEntity(MediaPlayerEntity):
|
|||||||
"""Play media."""
|
"""Play media."""
|
||||||
if media_source.is_media_source_id(media_id):
|
if media_source.is_media_source_id(media_id):
|
||||||
media_type = MEDIA_TYPE_URL
|
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_id = play_item.url
|
||||||
|
|
||||||
if media_type != MEDIA_TYPE_URL:
|
if media_type != MEDIA_TYPE_URL:
|
||||||
|
@ -384,7 +384,9 @@ class RokuMediaPlayer(RokuEntity, MediaPlayerEntity):
|
|||||||
|
|
||||||
# Handle media_source
|
# Handle media_source
|
||||||
if media_source.is_media_source_id(media_id):
|
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_type = MEDIA_TYPE_URL
|
||||||
media_id = sourced_media.url
|
media_id = sourced_media.url
|
||||||
mime_type = sourced_media.mime_type
|
mime_type = sourced_media.mime_type
|
||||||
|
@ -180,7 +180,9 @@ class SlimProtoPlayer(MediaPlayerEntity):
|
|||||||
to_send_media_type: str | None = media_type
|
to_send_media_type: str | None = media_type
|
||||||
# Handle media_source
|
# Handle media_source
|
||||||
if media_source.is_media_source_id(media_id):
|
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 = sourced_media.url
|
||||||
to_send_media_type = sourced_media.mime_type
|
to_send_media_type = sourced_media.mime_type
|
||||||
|
|
||||||
|
@ -550,7 +550,9 @@ class SonosMediaPlayerEntity(SonosEntity, MediaPlayerEntity):
|
|||||||
media_type = MEDIA_TYPE_MUSIC
|
media_type = MEDIA_TYPE_MUSIC
|
||||||
media_id = (
|
media_id = (
|
||||||
run_coroutine_threadsafe(
|
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,
|
self.hass.loop,
|
||||||
)
|
)
|
||||||
.result()
|
.result()
|
||||||
|
@ -357,7 +357,9 @@ class SoundTouchDevice(MediaPlayerEntity):
|
|||||||
async def async_play_media(self, media_type, media_id, **kwargs):
|
async def async_play_media(self, media_type, media_id, **kwargs):
|
||||||
"""Play a piece of media."""
|
"""Play a piece of media."""
|
||||||
if media_source.is_media_source_id(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 = async_process_play_media_url(self.hass, play_item.url)
|
media_id = async_process_play_media_url(self.hass, play_item.url)
|
||||||
|
|
||||||
await self.hass.async_add_executor_job(
|
await self.hass.async_add_executor_job(
|
||||||
|
@ -484,7 +484,9 @@ class SqueezeBoxEntity(MediaPlayerEntity):
|
|||||||
|
|
||||||
if media_source.is_media_source_id(media_id):
|
if media_source.is_media_source_id(media_id):
|
||||||
media_type = MEDIA_TYPE_MUSIC
|
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
|
media_id = play_item.url
|
||||||
|
|
||||||
if media_type in MEDIA_TYPE_MUSIC:
|
if media_type in MEDIA_TYPE_MUSIC:
|
||||||
|
@ -118,7 +118,9 @@ class ProtectMediaPlayer(ProtectDeviceEntity, MediaPlayerEntity):
|
|||||||
"""Play a piece of media."""
|
"""Play a piece of media."""
|
||||||
if media_source.is_media_source_id(media_id):
|
if media_source.is_media_source_id(media_id):
|
||||||
media_type = MEDIA_TYPE_MUSIC
|
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)
|
media_id = async_process_play_media_url(self.hass, play_item.url)
|
||||||
|
|
||||||
if media_type != MEDIA_TYPE_MUSIC:
|
if media_type != MEDIA_TYPE_MUSIC:
|
||||||
|
@ -168,7 +168,9 @@ class VlcDevice(MediaPlayerEntity):
|
|||||||
"""Play media from a URL or file."""
|
"""Play media from a URL or file."""
|
||||||
# Handle media_source
|
# Handle media_source
|
||||||
if media_source.is_media_source_id(media_id):
|
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 = sourced_media.url
|
||||||
|
|
||||||
elif media_type != MEDIA_TYPE_MUSIC:
|
elif media_type != MEDIA_TYPE_MUSIC:
|
||||||
|
@ -296,7 +296,9 @@ class VlcDevice(MediaPlayerEntity):
|
|||||||
"""Play media from a URL or file."""
|
"""Play media from a URL or file."""
|
||||||
# Handle media_source
|
# Handle media_source
|
||||||
if media_source.is_media_source_id(media_id):
|
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_type = sourced_media.mime_type
|
||||||
media_id = sourced_media.url
|
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:
|
async def async_play_media(self, media_type: str, media_id: str, **kwargs) -> None:
|
||||||
"""Play media."""
|
"""Play media."""
|
||||||
if media_source.is_media_source_id(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_id = play_item.url
|
||||||
|
|
||||||
if self.state == STATE_OFF:
|
if self.state == STATE_OFF:
|
||||||
|
@ -62,7 +62,7 @@ async def test_resolving(hass, mock_camera_hls):
|
|||||||
return_value="http://example.com/stream",
|
return_value="http://example.com/stream",
|
||||||
):
|
):
|
||||||
item = await media_source.async_resolve_media(
|
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 is not None
|
||||||
assert item.url == "http://example.com/stream"
|
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:
|
with pytest.raises(media_source.Unresolvable) as exc_info:
|
||||||
await media_source.async_resolve_media(
|
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"
|
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:
|
with pytest.raises(media_source.Unresolvable) as exc_info:
|
||||||
await media_source.async_resolve_media(
|
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"
|
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),
|
new_callable=PropertyMock(return_value=StreamType.WEB_RTC),
|
||||||
):
|
):
|
||||||
await media_source.async_resolve_media(
|
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."
|
assert str(exc_info.value) == "Camera does not support MJPEG or HLS streaming."
|
||||||
|
|
||||||
with pytest.raises(media_source.Unresolvable) as exc_info:
|
with pytest.raises(media_source.Unresolvable) as exc_info:
|
||||||
await media_source.async_resolve_media(
|
await media_source.async_resolve_media(
|
||||||
hass, "media-source://camera/camera.demo_camera"
|
hass, "media-source://camera/camera.demo_camera", None
|
||||||
)
|
)
|
||||||
assert (
|
assert (
|
||||||
str(exc_info.value) == "camera.demo_camera does not support play stream service"
|
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"):
|
with pytest.raises(Unresolvable, match="DMS is not connected"):
|
||||||
await media_source.async_resolve_media(
|
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"):
|
with pytest.raises(Unresolvable, match="DMS is not connected"):
|
||||||
await media_source.async_resolve_media(
|
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):
|
with pytest.raises(Unresolvable):
|
||||||
await media_source.async_resolve_media(
|
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
|
# Check async_resolve_object currently works
|
||||||
assert await media_source.async_resolve_media(
|
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
|
# Now break the network connection
|
||||||
@ -660,7 +660,7 @@ async def test_become_unavailable(
|
|||||||
# async_resolve_object should fail
|
# async_resolve_object should fail
|
||||||
with pytest.raises(Unresolvable):
|
with pytest.raises(Unresolvable):
|
||||||
await media_source.async_resolve_media(
|
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
|
# The device should now be unavailable
|
||||||
|
@ -45,7 +45,7 @@ async def async_resolve_media(
|
|||||||
) -> DidlPlayMedia:
|
) -> DidlPlayMedia:
|
||||||
"""Call media_source.async_resolve_media with the test source's ID."""
|
"""Call media_source.async_resolve_media with the test source's ID."""
|
||||||
result = await media_source.async_resolve_media(
|
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)
|
assert isinstance(result, DidlPlayMedia)
|
||||||
return result
|
return result
|
||||||
|
@ -60,31 +60,31 @@ async def test_resolve_media_bad_identifier(
|
|||||||
"""Test trying to resolve an item that has an unresolvable identifier."""
|
"""Test trying to resolve an item that has an unresolvable identifier."""
|
||||||
# Empty identifier
|
# Empty identifier
|
||||||
with pytest.raises(Unresolvable, match="No source ID.*"):
|
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
|
# Identifier has media_id but no source_id
|
||||||
# media_source.URI_SCHEME_REGEX won't let the ID through to dlna_dms
|
# media_source.URI_SCHEME_REGEX won't let the ID through to dlna_dms
|
||||||
with pytest.raises(Unresolvable, match="Invalid media source URI"):
|
with pytest.raises(Unresolvable, match="Invalid media source URI"):
|
||||||
await media_source.async_resolve_media(
|
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
|
# Identifier has source_id but no media_id
|
||||||
with pytest.raises(Unresolvable, match="No media ID.*"):
|
with pytest.raises(Unresolvable, match="No media ID.*"):
|
||||||
await media_source.async_resolve_media(
|
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
|
# Identifier is missing source_id/media_id separator
|
||||||
with pytest.raises(Unresolvable, match="No media ID.*"):
|
with pytest.raises(Unresolvable, match="No media ID.*"):
|
||||||
await media_source.async_resolve_media(
|
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
|
# Identifier has an unknown source_id
|
||||||
with pytest.raises(Unresolvable, match="Unknown source ID: unknown_source"):
|
with pytest.raises(Unresolvable, match="Unknown source ID: unknown_source"):
|
||||||
await media_source.async_resolve_media(
|
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
|
dms_device_mock.async_browse_metadata.return_value = didl_item
|
||||||
|
|
||||||
result = await media_source.async_resolve_media(
|
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 isinstance(result, DidlPlayMedia)
|
||||||
assert result.url == f"{MOCK_DEVICE_BASE_URL}/{res_url}"
|
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:
|
if media_source.DOMAIN not in hass.config.components:
|
||||||
assert await async_setup_component(hass, media_source.DOMAIN, {})
|
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
|
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:
|
if media_source.DOMAIN not in hass.config.components:
|
||||||
assert await async_setup_component(hass, media_source.DOMAIN, {})
|
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
|
return resolved.url
|
||||||
|
|
||||||
|
|
||||||
|
@ -103,6 +103,7 @@ async def test_async_resolve_media(hass):
|
|||||||
media = await media_source.async_resolve_media(
|
media = await media_source.async_resolve_media(
|
||||||
hass,
|
hass,
|
||||||
media_source.generate_media_source_id(media_source.DOMAIN, "local/test.mp3"),
|
media_source.generate_media_source_id(media_source.DOMAIN, "local/test.mp3"),
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
assert isinstance(media, media_source.models.PlayMedia)
|
assert isinstance(media, media_source.models.PlayMedia)
|
||||||
assert media.url == "/media/local/test.mp3"
|
assert media.url == "/media/local/test.mp3"
|
||||||
@ -135,15 +136,17 @@ async def test_async_unresolve_media(hass):
|
|||||||
|
|
||||||
# Test no media content
|
# Test no media content
|
||||||
with pytest.raises(media_source.Unresolvable):
|
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
|
# Test invalid media content
|
||||||
with pytest.raises(media_source.Unresolvable):
|
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
|
# Test invalid media source
|
||||||
with pytest.raises(media_source.Unresolvable):
|
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):
|
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)
|
await media_source.async_browse_media(Mock(data={}), None)
|
||||||
|
|
||||||
with pytest.raises(media_source.Unresolvable):
|
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"{const.URI_SCHEME}{DOMAIN}"
|
||||||
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#movies#/foo.mp4"
|
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#movies#/foo.mp4"
|
||||||
),
|
),
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
assert media == PlayMedia(url="http://movie-url", mime_type="video/mp4")
|
assert media == PlayMedia(url="http://movie-url", mime_type="video/mp4")
|
||||||
assert client.get_movie_url.call_args == call(TEST_CAMERA_ID, "/foo.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"{const.URI_SCHEME}{DOMAIN}"
|
||||||
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#images#/foo.jpg"
|
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#images#/foo.jpg"
|
||||||
),
|
),
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
assert media == PlayMedia(url="http://image-url", mime_type="image/jpeg")
|
assert media == PlayMedia(url="http://image-url", mime_type="image/jpeg")
|
||||||
assert client.get_image_url.call_args == call(TEST_CAMERA_ID, "/foo.jpg")
|
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.
|
# URI doesn't contain necessary components.
|
||||||
with pytest.raises(Unresolvable):
|
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.
|
# Config entry doesn't exist.
|
||||||
with pytest.raises(MediaSourceError):
|
with pytest.raises(MediaSourceError):
|
||||||
await media_source.async_resolve_media(
|
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.
|
# Device doesn't exist.
|
||||||
with pytest.raises(MediaSourceError):
|
with pytest.raises(MediaSourceError):
|
||||||
await media_source.async_resolve_media(
|
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)
|
# 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"{const.URI_SCHEME}{DOMAIN}"
|
||||||
f"/{TEST_CONFIG_ENTRY_ID}#{broken_device_1.id}#images#4"
|
f"/{TEST_CONFIG_ENTRY_ID}#{broken_device_1.id}#images#4"
|
||||||
),
|
),
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Device identifiers are incorrect (non integer camera id)
|
# 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"{const.URI_SCHEME}{DOMAIN}"
|
||||||
f"/{TEST_CONFIG_ENTRY_ID}#{broken_device_2.id}#images#4"
|
f"/{TEST_CONFIG_ENTRY_ID}#{broken_device_2.id}#images#4"
|
||||||
),
|
),
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Kind is incorrect.
|
# Kind is incorrect.
|
||||||
@ -448,6 +454,7 @@ async def test_async_resolve_media_failure(hass: HomeAssistant) -> None:
|
|||||||
await media_source.async_resolve_media(
|
await media_source.async_resolve_media(
|
||||||
hass,
|
hass,
|
||||||
f"{const.URI_SCHEME}{DOMAIN}/{TEST_CONFIG_ENTRY_ID}#{device.id}#games#moo",
|
f"{const.URI_SCHEME}{DOMAIN}/{TEST_CONFIG_ENTRY_ID}#{device.id}#games#moo",
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Playback URL raises exception.
|
# Playback URL raises exception.
|
||||||
@ -459,6 +466,7 @@ async def test_async_resolve_media_failure(hass: HomeAssistant) -> None:
|
|||||||
f"{const.URI_SCHEME}{DOMAIN}"
|
f"{const.URI_SCHEME}{DOMAIN}"
|
||||||
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#movies#/foo.mp4"
|
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#movies#/foo.mp4"
|
||||||
),
|
),
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Media path does not start with '/'
|
# 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"{const.URI_SCHEME}{DOMAIN}"
|
||||||
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#movies#foo.mp4"
|
f"/{TEST_CONFIG_ENTRY_ID}#{device.id}#movies#foo.mp4"
|
||||||
),
|
),
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Media missing path.
|
# Media missing path.
|
||||||
|
@ -361,7 +361,7 @@ async def test_camera_event(hass, auth, hass_client):
|
|||||||
|
|
||||||
# Resolving the event links to the media
|
# Resolving the event links to the media
|
||||||
media = await media_source.async_resolve_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.url == f"/api/nest/event_media/{device.id}/{event_identifier}"
|
||||||
assert media.mime_type == "image/jpeg"
|
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
|
# Resolving the device id points to the most recent event
|
||||||
media = await media_source.async_resolve_media(
|
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.url == f"/api/nest/event_media/{device.id}/{event_identifier}"
|
||||||
assert media.mime_type == "image/jpeg"
|
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
|
# Resolve the most recent event
|
||||||
media = await media_source.async_resolve_media(
|
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.url == f"/api/nest/event_media/{device.id}/{event_identifier2}"
|
||||||
assert media.mime_type == "image/jpeg"
|
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
|
# Resolving the event links to the media
|
||||||
media = await media_source.async_resolve_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.url == f"/api/nest/event_media/{device.id}/{event_identifier1}"
|
||||||
assert media.mime_type == "image/jpeg"
|
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.
|
# to the same clip preview media clip object.
|
||||||
# Resolve media for the first event
|
# Resolve media for the first event
|
||||||
media = await media_source.async_resolve_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.url == f"/api/nest/event_media/{device.id}/{event_identifier1}"
|
||||||
assert media.mime_type == "video/mp4"
|
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
|
# Resolve media for the second event
|
||||||
media = await media_source.async_resolve_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.url == f"/api/nest/event_media/{device.id}/{event_identifier1}"
|
||||||
assert media.mime_type == "video/mp4"
|
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(
|
await media_source.async_resolve_media(
|
||||||
hass,
|
hass,
|
||||||
f"{const.URI_SCHEME}{DOMAIN}/{device.id}",
|
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(
|
await media_source.async_resolve_media(
|
||||||
hass,
|
hass,
|
||||||
f"{const.URI_SCHEME}{DOMAIN}/invalid-device-id/GXXWRWVeHNUlUU3V3MGV3bUOYW...",
|
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(
|
media = await media_source.async_resolve_media(
|
||||||
hass,
|
hass,
|
||||||
f"{const.URI_SCHEME}{DOMAIN}/{device.id}/GXXWRWVeHNUlUU3V3MGV3bUOYW...",
|
f"{const.URI_SCHEME}{DOMAIN}/{device.id}/GXXWRWVeHNUlUU3V3MGV3bUOYW...",
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
assert (
|
assert (
|
||||||
media.url == f"/api/nest/event_media/{device.id}/GXXWRWVeHNUlUU3V3MGV3bUOYW..."
|
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
|
# Resolving the event links to the media
|
||||||
media = await media_source.async_resolve_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.url == f"/api/nest/event_media/{device.id}/{event_identifier}"
|
||||||
assert media.mime_type == "video/mp4"
|
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
|
# Resolving the event links to the media
|
||||||
media = await media_source.async_resolve_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.url == f"/api/nest/event_media/{device.id}/{event_identifier}"
|
||||||
assert media.mime_type == "image/jpeg"
|
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
|
event_identifier = browse.children[0].identifier
|
||||||
|
|
||||||
media = await media_source.async_resolve_media(
|
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.url == f"/api/nest/event_media/{event_identifier}"
|
||||||
assert media.mime_type == "video/mp4"
|
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
|
event_identifier = browse.children[0].identifier
|
||||||
|
|
||||||
media = await media_source.async_resolve_media(
|
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.url == f"/api/nest/event_media/{event_identifier}"
|
||||||
assert media.mime_type == "video/mp4"
|
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]
|
event = browse.children[0]
|
||||||
|
|
||||||
media = await media_source.async_resolve_media(
|
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.url == f"/api/nest/event_media/{event.identifier}"
|
||||||
assert media.mime_type == "video/mp4"
|
assert media.mime_type == "video/mp4"
|
||||||
|
@ -79,7 +79,7 @@ async def test_async_browse_media(hass):
|
|||||||
|
|
||||||
# Test successful event resolve
|
# Test successful event resolve
|
||||||
media = await media_source.async_resolve_media(
|
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(
|
assert media == PlayMedia(
|
||||||
url="http:///files/high/index.m3u8", mime_type="application/x-mpegURL"
|
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:
|
if media_source.DOMAIN not in hass.config.components:
|
||||||
assert await async_setup_component(hass, media_source.DOMAIN, {})
|
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
|
return resolved.url
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ async def test_browsing(hass):
|
|||||||
async def test_resolving(hass, mock_get_tts_audio):
|
async def test_resolving(hass, mock_get_tts_audio):
|
||||||
"""Test resolving."""
|
"""Test resolving."""
|
||||||
media = await media_source.async_resolve_media(
|
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.url.startswith("/api/tts_proxy/")
|
||||||
assert media.mime_type == "audio/mpeg"
|
assert media.mime_type == "audio/mpeg"
|
||||||
@ -82,7 +82,9 @@ async def test_resolving(hass, mock_get_tts_audio):
|
|||||||
# Pass language and options
|
# Pass language and options
|
||||||
mock_get_tts_audio.reset_mock()
|
mock_get_tts_audio.reset_mock()
|
||||||
media = await media_source.async_resolve_media(
|
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.url.startswith("/api/tts_proxy/")
|
||||||
assert media.mime_type == "audio/mpeg"
|
assert media.mime_type == "audio/mpeg"
|
||||||
@ -98,16 +100,18 @@ async def test_resolving_errors(hass):
|
|||||||
"""Test resolving."""
|
"""Test resolving."""
|
||||||
# No message added
|
# No message added
|
||||||
with pytest.raises(media_source.Unresolvable):
|
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
|
# Non-existing provider
|
||||||
with pytest.raises(media_source.Unresolvable):
|
with pytest.raises(media_source.Unresolvable):
|
||||||
await media_source.async_resolve_media(
|
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
|
# Non-existing option
|
||||||
with pytest.raises(media_source.Unresolvable):
|
with pytest.raises(media_source.Unresolvable):
|
||||||
await media_source.async_resolve_media(
|
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:
|
if media_source.DOMAIN not in hass.config.components:
|
||||||
assert await async_setup_component(hass, media_source.DOMAIN, {})
|
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
|
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:
|
if media_source.DOMAIN not in hass.config.components:
|
||||||
assert await async_setup_component(hass, media_source.DOMAIN, {})
|
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
|
return resolved.url
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user