Include path when media source file can be accessed on disk (#148180)

This commit is contained in:
Paulus Schoutsen 2025-07-05 10:14:52 +02:00 committed by GitHub
parent 7898e3f0fb
commit 1e164c94b1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 20 additions and 4 deletions

View File

@ -80,7 +80,7 @@ class LocalSource(MediaSource):
path = self.async_full_path(source_dir_id, location) path = self.async_full_path(source_dir_id, location)
mime_type, _ = mimetypes.guess_type(str(path)) mime_type, _ = mimetypes.guess_type(str(path))
assert isinstance(mime_type, str) assert isinstance(mime_type, str)
return PlayMedia(f"/media/{item.identifier}", mime_type) return PlayMedia(f"/media/{item.identifier}", mime_type, path=path)
async def async_browse_media(self, item: MediaSourceItem) -> BrowseMediaSource: async def async_browse_media(self, item: MediaSourceItem) -> BrowseMediaSource:
"""Return media.""" """Return media."""

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass, field
from typing import TYPE_CHECKING, Any from typing import TYPE_CHECKING, Any
from homeassistant.components.media_player import BrowseMedia, MediaClass, MediaType from homeassistant.components.media_player import BrowseMedia, MediaClass, MediaType
@ -10,6 +10,9 @@ from homeassistant.core import HomeAssistant, callback
from .const import MEDIA_SOURCE_DATA, URI_SCHEME, URI_SCHEME_REGEX from .const import MEDIA_SOURCE_DATA, URI_SCHEME, URI_SCHEME_REGEX
if TYPE_CHECKING:
from pathlib import Path
@dataclass(slots=True) @dataclass(slots=True)
class PlayMedia: class PlayMedia:
@ -17,6 +20,7 @@ class PlayMedia:
url: str url: str
mime_type: str mime_type: str
path: Path | None = field(kw_only=True, default=None)
class BrowseMediaSource(BrowseMedia): class BrowseMediaSource(BrowseMedia):

View File

@ -167,13 +167,23 @@ async def test_upload_view(
res = await client.post( res = await client.post(
"/api/media_source/local_source/upload", "/api/media_source/local_source/upload",
data={ data={
"media_content_id": "media-source://media_source/test_dir/.", "media_content_id": "media-source://media_source/test_dir",
"file": get_file("logo.png"), "file": get_file("logo.png"),
}, },
) )
assert res.status == 200 assert res.status == 200
assert (Path(temp_dir) / "logo.png").is_file() data = await res.json()
assert data["media_content_id"] == "media-source://media_source/test_dir/logo.png"
uploaded_path = Path(temp_dir) / "logo.png"
assert uploaded_path.is_file()
resolved = await media_source.async_resolve_media(
hass, data["media_content_id"], target_media_player=None
)
assert resolved.url == "/media/test_dir/logo.png"
assert resolved.mime_type == "image/png"
assert resolved.path == uploaded_path
# Test with bad media source ID # Test with bad media source ID
for bad_id in ( for bad_id in (

View File

@ -28,12 +28,14 @@
# name: test_file[system_bridge_media_source_file_image] # name: test_file[system_bridge_media_source_file_image]
dict({ dict({
'mime_type': 'image/jpeg', 'mime_type': 'image/jpeg',
'path': None,
'url': 'http://127.0.0.1:9170/api/media/file/data?token=abc-123-def-456-ghi&base=documents&path=testimage.jpg', 'url': 'http://127.0.0.1:9170/api/media/file/data?token=abc-123-def-456-ghi&base=documents&path=testimage.jpg',
}) })
# --- # ---
# name: test_file[system_bridge_media_source_file_text] # name: test_file[system_bridge_media_source_file_text]
dict({ dict({
'mime_type': 'text/plain', 'mime_type': 'text/plain',
'path': None,
'url': 'http://127.0.0.1:9170/api/media/file/data?token=abc-123-def-456-ghi&base=documents&path=testfile.txt', 'url': 'http://127.0.0.1:9170/api/media/file/data?token=abc-123-def-456-ghi&base=documents&path=testfile.txt',
}) })
# --- # ---