Extend image_upload to return the original image (#116652)

This commit is contained in:
Adam Kapos 2024-05-29 12:16:23 +03:00 committed by GitHub
parent 585892f067
commit 43f42dd512
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 21 deletions

View File

@ -191,31 +191,33 @@ class ImageServeView(HomeAssistantView):
filename: str, filename: str,
) -> web.FileResponse: ) -> web.FileResponse:
"""Serve image.""" """Serve image."""
try:
width, height = _validate_size_from_filename(filename)
except (ValueError, IndexError) as err:
raise web.HTTPBadRequest from err
image_info = self.image_collection.data.get(image_id) image_info = self.image_collection.data.get(image_id)
if image_info is None: if image_info is None:
raise web.HTTPNotFound raise web.HTTPNotFound
hass = request.app[KEY_HASS] if filename == "original":
target_file = self.image_folder / image_id / f"{width}x{height}" target_file = self.image_folder / image_id / filename
else:
try:
width, height = _validate_size_from_filename(filename)
except (ValueError, IndexError) as err:
raise web.HTTPBadRequest from err
if not target_file.is_file(): hass = request.app[KEY_HASS]
async with self.transform_lock: target_file = self.image_folder / image_id / f"{width}x{height}"
# Another check in case another request already
# finished it while waiting if not target_file.is_file():
if not target_file.is_file(): async with self.transform_lock:
await hass.async_add_executor_job( # Another check in case another request already
_generate_thumbnail, # finished it while waiting
self.image_folder / image_id / "original", if not target_file.is_file():
image_info["content_type"], await hass.async_add_executor_job(
target_file, _generate_thumbnail,
(width, height), self.image_folder / image_id / "original",
) image_info["content_type"],
target_file,
(width, height),
)
return web.FileResponse( return web.FileResponse(
target_file, target_file,

View File

@ -49,7 +49,14 @@ async def test_upload_image(
tempdir = pathlib.Path(tempdir) tempdir = pathlib.Path(tempdir)
item_folder: pathlib.Path = tempdir / item["id"] item_folder: pathlib.Path = tempdir / item["id"]
assert (item_folder / "original").read_bytes() == TEST_IMAGE.read_bytes() test_image_bytes = TEST_IMAGE.read_bytes()
assert (item_folder / "original").read_bytes() == test_image_bytes
# fetch original image
res = await client.get(f"/api/image/serve/{item['id']}/original")
assert res.status == 200
fetched_image_bytes = await res.read()
assert fetched_image_bytes == test_image_bytes
# fetch non-existing image # fetch non-existing image
res = await client.get("/api/image/serve/non-existing/256x256") res = await client.get("/api/image/serve/non-existing/256x256")