From 24a16ff8febff2040c00b83b42b04e02233854fa Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 19 Aug 2020 11:33:04 +0200 Subject: [PATCH] Add image integration (#38969) --- CODEOWNERS | 1 + homeassistant/components/doods/manifest.json | 2 +- homeassistant/components/image/__init__.py | 204 ++++++++++++++++++ homeassistant/components/image/const.py | 3 + homeassistant/components/image/manifest.json | 12 ++ homeassistant/components/person/__init__.py | 9 + homeassistant/components/person/manifest.json | 1 + homeassistant/components/proxy/manifest.json | 2 +- homeassistant/components/qrcode/manifest.json | 2 +- .../components/seven_segments/manifest.json | 2 +- .../components/sighthound/manifest.json | 2 +- .../components/tensorflow/manifest.json | 2 +- homeassistant/helpers/collection.py | 35 +-- homeassistant/package_constraints.txt | 1 + requirements_all.txt | 3 +- requirements_test_all.txt | 3 +- tests/components/image/__init__.py | 1 + tests/components/image/logo.png | Bin 0 -> 38847 bytes tests/components/image/test_init.py | 76 +++++++ tests/components/person/test_init.py | 36 ++-- 20 files changed, 356 insertions(+), 41 deletions(-) create mode 100644 homeassistant/components/image/__init__.py create mode 100644 homeassistant/components/image/const.py create mode 100644 homeassistant/components/image/manifest.json create mode 100644 tests/components/image/__init__.py create mode 100644 tests/components/image/logo.png create mode 100644 tests/components/image/test_init.py diff --git a/CODEOWNERS b/CODEOWNERS index 472e0ae730d..f497b64d7ae 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -195,6 +195,7 @@ homeassistant/components/iammeter/* @lewei50 homeassistant/components/iaqualink/* @flz homeassistant/components/icloud/* @Quentame homeassistant/components/ign_sismologia/* @exxamalte +homeassistant/components/image/* @home-assistant/core homeassistant/components/incomfort/* @zxdavb homeassistant/components/influxdb/* @fabaff @mdegat01 homeassistant/components/input_boolean/* @home-assistant/core diff --git a/homeassistant/components/doods/manifest.json b/homeassistant/components/doods/manifest.json index f363f46d2d7..7f75a5e8897 100644 --- a/homeassistant/components/doods/manifest.json +++ b/homeassistant/components/doods/manifest.json @@ -2,6 +2,6 @@ "domain": "doods", "name": "DOODS - Distributed Outside Object Detection Service", "documentation": "https://www.home-assistant.io/integrations/doods", - "requirements": ["pydoods==1.0.2", "pillow==7.1.2"], + "requirements": ["pydoods==1.0.2", "pillow==7.2.0"], "codeowners": [] } diff --git a/homeassistant/components/image/__init__.py b/homeassistant/components/image/__init__.py new file mode 100644 index 00000000000..a8110decd0a --- /dev/null +++ b/homeassistant/components/image/__init__.py @@ -0,0 +1,204 @@ +"""The Picture integration.""" +import asyncio +import logging +import pathlib +import secrets +import shutil +import typing + +from PIL import Image, ImageOps, UnidentifiedImageError +from aiohttp import hdrs, web +from aiohttp.web_request import FileField +import voluptuous as vol + +from homeassistant.components.http.view import HomeAssistantView +from homeassistant.const import CONF_ID +from homeassistant.core import HomeAssistant, callback +from homeassistant.helpers import collection +from homeassistant.helpers.storage import Store +import homeassistant.util.dt as dt_util + +from .const import DOMAIN + +_LOGGER = logging.getLogger(__name__) +STORAGE_KEY = DOMAIN +STORAGE_VERSION = 1 +VALID_SIZES = {256, 512} +MAX_SIZE = 1024 * 1024 * 10 + +CREATE_FIELDS = { + vol.Required("file"): FileField, +} + +UPDATE_FIELDS = { + vol.Optional("name"): vol.All(str, vol.Length(min=1)), +} + + +async def async_setup(hass: HomeAssistant, config: dict): + """Set up the Image integration.""" + image_dir = pathlib.Path(hass.config.path(DOMAIN)) + hass.data[DOMAIN] = storage_collection = ImageStorageCollection(hass, image_dir) + await storage_collection.async_load() + collection.StorageCollectionWebsocket( + storage_collection, DOMAIN, DOMAIN, CREATE_FIELDS, UPDATE_FIELDS, + ).async_setup(hass, create_create=False) + + hass.http.register_view(ImageUploadView) + hass.http.register_view(ImageServeView(image_dir, storage_collection)) + return True + + +class ImageStorageCollection(collection.StorageCollection): + """Image collection stored in storage.""" + + CREATE_SCHEMA = vol.Schema(CREATE_FIELDS) + UPDATE_SCHEMA = vol.Schema(UPDATE_FIELDS) + + def __init__(self, hass: HomeAssistant, image_dir: pathlib.Path) -> None: + """Initialize media storage collection.""" + super().__init__( + Store(hass, STORAGE_VERSION, STORAGE_KEY), + logging.getLogger(f"{__name__}.storage_collection"), + ) + self.async_add_listener(self._change_listener) + self.image_dir = image_dir + + async def _process_create_data(self, data: typing.Dict) -> typing.Dict: + """Validate the config is valid.""" + data = self.CREATE_SCHEMA(dict(data)) + uploaded_file: FileField = data["file"] + + if not uploaded_file.content_type.startswith("image/"): + raise vol.Invalid("Only images are allowed") + + data[CONF_ID] = secrets.token_hex(16) + data["filesize"] = await self.hass.async_add_executor_job(self._move_data, data) + + data["content_type"] = uploaded_file.content_type + data["name"] = uploaded_file.filename + data["uploaded_at"] = dt_util.utcnow().isoformat() + + return data + + def _move_data(self, data): + """Move data.""" + uploaded_file: FileField = data.pop("file") + + # Verify we can read the image + try: + image = Image.open(uploaded_file.file) + except UnidentifiedImageError: + raise vol.Invalid("Unable to identify image file") + + # Reset content + uploaded_file.file.seek(0) + + media_folder: pathlib.Path = (self.image_dir / data[CONF_ID]) + media_folder.mkdir(parents=True) + + media_file = media_folder / "original" + + # Raises if path is no longer relative to the media dir + media_file.relative_to(media_folder) + + _LOGGER.debug("Storing file %s", media_file) + + with media_file.open("wb") as target: + shutil.copyfileobj(uploaded_file.file, target) + + image.close() + + return media_file.stat().st_size + + @callback + def _get_suggested_id(self, info: typing.Dict) -> str: + """Suggest an ID based on the config.""" + return info[CONF_ID] + + async def _update_data(self, data: dict, update_data: typing.Dict) -> typing.Dict: + """Return a new updated data object.""" + return {**data, **self.UPDATE_SCHEMA(update_data)} + + async def _change_listener(self, change_type, item_id, data): + """Handle change.""" + if change_type != collection.CHANGE_REMOVED: + return + + await self.hass.async_add_executor_job(shutil.rmtree, self.image_dir / item_id) + + +class ImageUploadView(HomeAssistantView): + """View to upload images.""" + + url = "/api/image/upload" + name = "api:image:upload" + + async def post(self, request): + """Handle upload.""" + # Increase max payload + request._client_max_size = MAX_SIZE # pylint: disable=protected-access + + data = await request.post() + item = await request.app["hass"].data[DOMAIN].async_create_item(data) + return self.json(item) + + +class ImageServeView(HomeAssistantView): + """View to download images.""" + + url = "/api/image/serve/{image_id}/{filename}" + name = "api:image:serve" + requires_auth = False + + def __init__( + self, image_folder: pathlib.Path, image_collection: ImageStorageCollection + ): + """Initialize image serve view.""" + self.transform_lock = asyncio.Lock() + self.image_folder = image_folder + self.image_collection = image_collection + + async def get(self, request: web.Request, image_id: str, filename: str): + """Serve image.""" + image_size = filename.split("-", 1)[0] + try: + parts = image_size.split("x", 1) + width = int(parts[0]) + height = int(parts[1]) + except (ValueError, IndexError): + raise web.HTTPBadRequest + + if not width or width != height or width not in VALID_SIZES: + raise web.HTTPBadRequest + + image_info = self.image_collection.data.get(image_id) + + if image_info is None: + raise web.HTTPNotFound() + + hass = request.app["hass"] + target_file = self.image_folder / image_id / f"{width}x{height}" + + if not target_file.is_file(): + async with self.transform_lock: + # Another check in case another request already finished it while waiting + if not target_file.is_file(): + await hass.async_add_executor_job( + _generate_thumbnail, + self.image_folder / image_id / "original", + image_info["content_type"], + target_file, + (width, height), + ) + + return web.FileResponse( + target_file, headers={hdrs.CONTENT_TYPE: image_info["content_type"]} + ) + + +def _generate_thumbnail(original_path, content_type, target_path, target_size): + """Generate a size.""" + image = ImageOps.exif_transpose(Image.open(original_path)) + image.thumbnail(target_size) + image.save(target_path, format=content_type.split("/", 1)[1]) diff --git a/homeassistant/components/image/const.py b/homeassistant/components/image/const.py new file mode 100644 index 00000000000..5241f7ec07b --- /dev/null +++ b/homeassistant/components/image/const.py @@ -0,0 +1,3 @@ +"""Constants for the Image integration.""" + +DOMAIN = "image" diff --git a/homeassistant/components/image/manifest.json b/homeassistant/components/image/manifest.json new file mode 100644 index 00000000000..4fc9c2d1d05 --- /dev/null +++ b/homeassistant/components/image/manifest.json @@ -0,0 +1,12 @@ +{ + "domain": "image", + "name": "Image", + "config_flow": false, + "documentation": "https://www.home-assistant.io/integrations/image", + "requirements": ["pillow==7.2.0"], + "ssdp": [], + "zeroconf": [], + "homekit": {}, + "dependencies": ["http"], + "codeowners": ["@home-assistant/core"] +} diff --git a/homeassistant/components/person/__init__.py b/homeassistant/components/person/__init__.py index 49f1b45f2ed..584ce708d15 100644 --- a/homeassistant/components/person/__init__.py +++ b/homeassistant/components/person/__init__.py @@ -57,6 +57,7 @@ ATTR_USER_ID = "user_id" CONF_DEVICE_TRACKERS = "device_trackers" CONF_USER_ID = "user_id" +CONF_PICTURE = "picture" DOMAIN = "person" @@ -73,6 +74,7 @@ PERSON_SCHEMA = vol.Schema( vol.Optional(CONF_DEVICE_TRACKERS, default=[]): vol.All( cv.ensure_list, cv.entities_domain(DEVICE_TRACKER_DOMAIN) ), + vol.Optional(CONF_PICTURE): cv.string, } ) @@ -129,6 +131,7 @@ CREATE_FIELDS = { vol.Optional(CONF_DEVICE_TRACKERS, default=list): vol.All( cv.ensure_list, cv.entities_domain(DEVICE_TRACKER_DOMAIN) ), + vol.Optional(CONF_PICTURE): vol.Any(str, None), } @@ -138,6 +141,7 @@ UPDATE_FIELDS = { vol.Optional(CONF_DEVICE_TRACKERS, default=list): vol.All( cv.ensure_list, cv.entities_domain(DEVICE_TRACKER_DOMAIN) ), + vol.Optional(CONF_PICTURE): vol.Any(str, None), } @@ -372,6 +376,11 @@ class Person(RestoreEntity): """Return the name of the entity.""" return self._config[CONF_NAME] + @property + def entity_picture(self) -> Optional[str]: + """Return entity picture.""" + return self._config.get(CONF_PICTURE) + @property def should_poll(self): """Return True if entity has to be polled for state. diff --git a/homeassistant/components/person/manifest.json b/homeassistant/components/person/manifest.json index bd1dfa6b588..7aec7df7c9a 100644 --- a/homeassistant/components/person/manifest.json +++ b/homeassistant/components/person/manifest.json @@ -2,6 +2,7 @@ "domain": "person", "name": "Person", "documentation": "https://www.home-assistant.io/integrations/person", + "dependencies": ["image"], "after_dependencies": ["device_tracker"], "codeowners": [], "quality_scale": "internal" diff --git a/homeassistant/components/proxy/manifest.json b/homeassistant/components/proxy/manifest.json index ffa659f979e..081645a4aa8 100644 --- a/homeassistant/components/proxy/manifest.json +++ b/homeassistant/components/proxy/manifest.json @@ -2,6 +2,6 @@ "domain": "proxy", "name": "Camera Proxy", "documentation": "https://www.home-assistant.io/integrations/proxy", - "requirements": ["pillow==7.1.2"], + "requirements": ["pillow==7.2.0"], "codeowners": [] } diff --git a/homeassistant/components/qrcode/manifest.json b/homeassistant/components/qrcode/manifest.json index eaa813cae95..00d528ba399 100644 --- a/homeassistant/components/qrcode/manifest.json +++ b/homeassistant/components/qrcode/manifest.json @@ -2,6 +2,6 @@ "domain": "qrcode", "name": "QR Code", "documentation": "https://www.home-assistant.io/integrations/qrcode", - "requirements": ["pillow==7.1.2", "pyzbar==0.1.7"], + "requirements": ["pillow==7.2.0", "pyzbar==0.1.7"], "codeowners": [] } diff --git a/homeassistant/components/seven_segments/manifest.json b/homeassistant/components/seven_segments/manifest.json index 352b96b5f22..4996ba29f83 100644 --- a/homeassistant/components/seven_segments/manifest.json +++ b/homeassistant/components/seven_segments/manifest.json @@ -2,6 +2,6 @@ "domain": "seven_segments", "name": "Seven Segments OCR", "documentation": "https://www.home-assistant.io/integrations/seven_segments", - "requirements": ["pillow==7.1.2"], + "requirements": ["pillow==7.2.0"], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/sighthound/manifest.json b/homeassistant/components/sighthound/manifest.json index 1ad7effdf0e..a5c56b37778 100644 --- a/homeassistant/components/sighthound/manifest.json +++ b/homeassistant/components/sighthound/manifest.json @@ -2,6 +2,6 @@ "domain": "sighthound", "name": "Sighthound", "documentation": "https://www.home-assistant.io/integrations/sighthound", - "requirements": ["pillow==7.1.2", "simplehound==0.3"], + "requirements": ["pillow==7.2.0", "simplehound==0.3"], "codeowners": ["@robmarkcole"] } diff --git a/homeassistant/components/tensorflow/manifest.json b/homeassistant/components/tensorflow/manifest.json index fc87b5cdbff..ddb0ec542ba 100644 --- a/homeassistant/components/tensorflow/manifest.json +++ b/homeassistant/components/tensorflow/manifest.json @@ -9,7 +9,7 @@ "pycocotools==2.0.1", "numpy==1.19.1", "protobuf==3.12.2", - "pillow==7.1.2" + "pillow==7.2.0" ], "codeowners": [] } diff --git a/homeassistant/helpers/collection.py b/homeassistant/helpers/collection.py index 06c86d3aa1c..9e7c6061987 100644 --- a/homeassistant/helpers/collection.py +++ b/homeassistant/helpers/collection.py @@ -353,7 +353,13 @@ class StorageCollectionWebsocket: return f"{self.model_name}_id" @callback - def async_setup(self, hass: HomeAssistant, *, create_list: bool = True) -> None: + def async_setup( + self, + hass: HomeAssistant, + *, + create_list: bool = True, + create_create: bool = True, + ) -> None: """Set up the websocket commands.""" if create_list: websocket_api.async_register_command( @@ -365,19 +371,20 @@ class StorageCollectionWebsocket: ), ) - websocket_api.async_register_command( - hass, - f"{self.api_prefix}/create", - websocket_api.require_admin( - websocket_api.async_response(self.ws_create_item) - ), - websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( - { - **self.create_schema, - vol.Required("type"): f"{self.api_prefix}/create", - } - ), - ) + if create_create: + websocket_api.async_register_command( + hass, + f"{self.api_prefix}/create", + websocket_api.require_admin( + websocket_api.async_response(self.ws_create_item) + ), + websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( + { + **self.create_schema, + vol.Required("type"): f"{self.api_prefix}/create", + } + ), + ) websocket_api.async_register_command( hass, diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 58d3e3be883..9a8efbe2bd6 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -18,6 +18,7 @@ importlib-metadata==1.6.0;python_version<'3.8' jinja2>=2.11.1 netdisco==2.8.2 paho-mqtt==1.5.0 +pillow==7.2.0 pip>=8.0.3 python-slugify==4.0.1 pytz>=2020.1 diff --git a/requirements_all.txt b/requirements_all.txt index c2527888b73..58fdb388958 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1081,12 +1081,13 @@ piglow==1.2.4 pilight==0.1.1 # homeassistant.components.doods +# homeassistant.components.image # homeassistant.components.proxy # homeassistant.components.qrcode # homeassistant.components.seven_segments # homeassistant.components.sighthound # homeassistant.components.tensorflow -pillow==7.1.2 +pillow==7.2.0 # homeassistant.components.dominos pizzapi==0.0.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 4b8b4019fbd..c035d938e5d 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -501,12 +501,13 @@ pexpect==4.6.0 pilight==0.1.1 # homeassistant.components.doods +# homeassistant.components.image # homeassistant.components.proxy # homeassistant.components.qrcode # homeassistant.components.seven_segments # homeassistant.components.sighthound # homeassistant.components.tensorflow -pillow==7.1.2 +pillow==7.2.0 # homeassistant.components.plex plexapi==4.0.0 diff --git a/tests/components/image/__init__.py b/tests/components/image/__init__.py new file mode 100644 index 00000000000..8bf90c4f516 --- /dev/null +++ b/tests/components/image/__init__.py @@ -0,0 +1 @@ +"""Tests for the Image integration.""" diff --git a/tests/components/image/logo.png b/tests/components/image/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe49f1263073fe708e82d1301ea136ad33ae2a0 GIT binary patch literal 38847 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