From 707f112f511cd41cbdb9c2ee57b5b211c0736ee6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 14 Feb 2022 06:41:53 -0800 Subject: [PATCH] Improve raised exception consistency for media source (#66497) --- homeassistant/components/media_source/__init__.py | 13 +++++++++++-- .../components/media_source/local_source.py | 2 +- tests/components/media_source/test_init.py | 8 +++++++- tests/components/netatmo/test_media_source.py | 4 ++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/media_source/__init__.py b/homeassistant/components/media_source/__init__.py index 81c629529df..3be5bf040d7 100644 --- a/homeassistant/components/media_source/__init__.py +++ b/homeassistant/components/media_source/__init__.py @@ -102,7 +102,10 @@ async def async_browse_media( if DOMAIN not in hass.data: raise BrowseError("Media Source not loaded") - item = await _get_media_item(hass, media_content_id).async_browse() + try: + item = await _get_media_item(hass, media_content_id).async_browse() + except ValueError as err: + raise BrowseError("Not a media source item") from err if content_filter is None or item.children is None: return item @@ -118,7 +121,13 @@ async def async_resolve_media(hass: HomeAssistant, media_content_id: str) -> Pla """Get info to play media.""" if DOMAIN not in hass.data: raise Unresolvable("Media Source not loaded") - return await _get_media_item(hass, media_content_id).async_resolve() + + try: + item = _get_media_item(hass, media_content_id) + except ValueError as err: + raise Unresolvable("Not a media source item") from err + + return await item.async_resolve() @websocket_api.websocket_command( diff --git a/homeassistant/components/media_source/local_source.py b/homeassistant/components/media_source/local_source.py index 66e6bdd8379..d5e1671c135 100644 --- a/homeassistant/components/media_source/local_source.py +++ b/homeassistant/components/media_source/local_source.py @@ -276,7 +276,7 @@ class UploadMediaView(HomeAssistantView): uploaded_file: FileField = data["file"] - if not uploaded_file.content_type.startswith(("image/", "video/")): + if not uploaded_file.content_type.startswith(("image/", "video/", "audio/")): LOGGER.error("Content type not allowed") raise vol.Invalid("Only images and video are allowed") diff --git a/tests/components/media_source/test_init.py b/tests/components/media_source/test_init.py index 5b25e878e5a..7aae72475cb 100644 --- a/tests/components/media_source/test_init.py +++ b/tests/components/media_source/test_init.py @@ -60,7 +60,7 @@ async def test_async_browse_media(hass): media.children[0].title = "Epic Sax Guy 10 Hours" # Test invalid media content - with pytest.raises(ValueError): + with pytest.raises(BrowseError): await media_source.async_browse_media(hass, "invalid") # Test base URI returns all domains @@ -80,6 +80,8 @@ async def test_async_resolve_media(hass): media_source.generate_media_source_id(media_source.DOMAIN, "local/test.mp3"), ) assert isinstance(media, media_source.models.PlayMedia) + assert media.url == "/media/local/test.mp3" + assert media.mime_type == "audio/mpeg" async def test_async_unresolve_media(hass): @@ -91,6 +93,10 @@ async def test_async_unresolve_media(hass): with pytest.raises(media_source.Unresolvable): await media_source.async_resolve_media(hass, "") + # Test invalid media content + with pytest.raises(media_source.Unresolvable): + await media_source.async_resolve_media(hass, "invalid") + async def test_websocket_browse_media(hass, hass_ws_client): """Test browse media websocket.""" diff --git a/tests/components/netatmo/test_media_source.py b/tests/components/netatmo/test_media_source.py index 2ba70ca9489..c4741672186 100644 --- a/tests/components/netatmo/test_media_source.py +++ b/tests/components/netatmo/test_media_source.py @@ -52,9 +52,9 @@ async def test_async_browse_media(hass): assert str(excinfo.value) == "Unknown source directory." # Test invalid base - with pytest.raises(ValueError) as excinfo: + with pytest.raises(media_source.BrowseError) as excinfo: await media_source.async_browse_media(hass, f"{const.URI_SCHEME}{DOMAIN}/") - assert str(excinfo.value) == "Invalid media source URI" + assert str(excinfo.value) == "Not a media source item" # Test successful listing media = await media_source.async_browse_media(