Adjust serializing resolved media (#67240)
This commit is contained in:
parent
07a792019e
commit
6fd9e71b8f
3 changed files with 19 additions and 18 deletions
|
@ -15,7 +15,9 @@ from .const import CONTENT_AUTH_EXPIRY_TIME, MEDIA_CLASS_DIRECTORY
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_process_play_media_url(hass: HomeAssistant, media_content_id: str) -> str:
|
def async_process_play_media_url(
|
||||||
|
hass: HomeAssistant, media_content_id: str, *, allow_relative_url: bool = False
|
||||||
|
) -> str:
|
||||||
"""Update a media URL with authentication if it points at Home Assistant."""
|
"""Update a media URL with authentication if it points at Home Assistant."""
|
||||||
if media_content_id[0] != "/" and not is_hass_url(hass, media_content_id):
|
if media_content_id[0] != "/" and not is_hass_url(hass, media_content_id):
|
||||||
return media_content_id
|
return media_content_id
|
||||||
|
@ -34,8 +36,8 @@ def async_process_play_media_url(hass: HomeAssistant, media_content_id: str) ->
|
||||||
)
|
)
|
||||||
media_content_id = str(parsed.join(yarl.URL(signed_path)))
|
media_content_id = str(parsed.join(yarl.URL(signed_path)))
|
||||||
|
|
||||||
# prepend external URL
|
# convert relative URL to absolute URL
|
||||||
if media_content_id[0] == "/":
|
if media_content_id[0] == "/" and not allow_relative_url:
|
||||||
media_content_id = f"{get_url(hass)}{media_content_id}"
|
media_content_id = f"{get_url(hass)}{media_content_id}"
|
||||||
|
|
||||||
return media_content_id
|
return media_content_id
|
||||||
|
|
|
@ -2,21 +2,20 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
import dataclasses
|
|
||||||
from datetime import timedelta
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from urllib.parse import quote
|
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.components import frontend, websocket_api
|
from homeassistant.components import frontend, websocket_api
|
||||||
from homeassistant.components.http.auth import async_sign_path
|
|
||||||
from homeassistant.components.media_player import (
|
from homeassistant.components.media_player import (
|
||||||
ATTR_MEDIA_CONTENT_ID,
|
ATTR_MEDIA_CONTENT_ID,
|
||||||
CONTENT_AUTH_EXPIRY_TIME,
|
CONTENT_AUTH_EXPIRY_TIME,
|
||||||
BrowseError,
|
BrowseError,
|
||||||
BrowseMedia,
|
BrowseMedia,
|
||||||
)
|
)
|
||||||
|
from homeassistant.components.media_player.browse_media import (
|
||||||
|
async_process_play_media_url,
|
||||||
|
)
|
||||||
from homeassistant.components.websocket_api import ActiveConnection
|
from homeassistant.components.websocket_api import ActiveConnection
|
||||||
from homeassistant.core import HomeAssistant, callback
|
from homeassistant.core import HomeAssistant, callback
|
||||||
from homeassistant.helpers.integration_platform import (
|
from homeassistant.helpers.integration_platform import (
|
||||||
|
@ -177,13 +176,12 @@ async def websocket_resolve_media(
|
||||||
connection.send_error(msg["id"], "resolve_media_failed", str(err))
|
connection.send_error(msg["id"], "resolve_media_failed", str(err))
|
||||||
return
|
return
|
||||||
|
|
||||||
data = dataclasses.asdict(media)
|
connection.send_result(
|
||||||
|
msg["id"],
|
||||||
if data["url"][0] == "/":
|
{
|
||||||
data["url"] = async_sign_path(
|
"url": async_process_play_media_url(
|
||||||
hass,
|
hass, media.url, allow_relative_url=True
|
||||||
quote(data["url"]),
|
),
|
||||||
timedelta(seconds=msg["expires"]),
|
"mime_type": media.mime_type,
|
||||||
)
|
},
|
||||||
|
)
|
||||||
connection.send_result(msg["id"], data)
|
|
||||||
|
|
|
@ -187,7 +187,8 @@ async def test_websocket_resolve_media(hass, hass_ws_client, filename):
|
||||||
assert msg["id"] == 1
|
assert msg["id"] == 1
|
||||||
assert msg["result"]["mime_type"] == media.mime_type
|
assert msg["result"]["mime_type"] == media.mime_type
|
||||||
|
|
||||||
# Validate url is signed.
|
# Validate url is relative and signed.
|
||||||
|
assert msg["result"]["url"][0] == "/"
|
||||||
parsed = yarl.URL(msg["result"]["url"])
|
parsed = yarl.URL(msg["result"]["url"])
|
||||||
assert parsed.path == getattr(media, "url")
|
assert parsed.path == getattr(media, "url")
|
||||||
assert "authSig" in parsed.query
|
assert "authSig" in parsed.query
|
||||||
|
|
Loading…
Add table
Reference in a new issue