diff --git a/API.md b/API.md index 94a0c6f0d..eb0af881e 100644 --- a/API.md +++ b/API.md @@ -47,6 +47,7 @@ The addons from `addons` are only installed one. "repository": "12345678|null", "version": "LAST_VERSION", "installed": "INSTALL_VERSION", + "icon": "bool", "logo": "bool", "state": "started|stopped", } @@ -346,6 +347,7 @@ Get all available addons. "detached": "bool", "build": "bool", "url": "null|url", + "icon": "bool", "logo": "bool" } ], @@ -386,6 +388,7 @@ Get all available addons. "privileged": ["NET_ADMIN", "SYS_ADMIN"], "devices": ["/dev/xy"], "auto_uart": "bool", + "icon": "bool", "logo": "bool", "changelog": "bool", "hassio_api": "bool", @@ -399,6 +402,8 @@ Get all available addons. } ``` +- GET `/addons/{addon}/icon` + - GET `/addons/{addon}/logo` - GET `/addons/{addon}/changelog` diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index 128daa062..5208f52c8 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -370,6 +370,11 @@ class Addon(CoreSysAttributes): """Return url of addon.""" return self._mesh.get(ATTR_URL) + @property + def with_icon(self): + """Return True if a icon exists.""" + return self.path_icon.exists() + @property def with_logo(self): """Return True if a logo exists.""" @@ -434,6 +439,11 @@ class Addon(CoreSysAttributes): """Return path to this addon.""" return Path(self._mesh[ATTR_LOCATON]) + @property + def path_icon(self): + """Return path to addon icon.""" + return Path(self.path_location, 'icon.png') + @property def path_logo(self): """Return path to addon logo.""" diff --git a/hassio/api/__init__.py b/hassio/api/__init__.py index 0c106d93d..351c1f4d2 100644 --- a/hassio/api/__init__.py +++ b/hassio/api/__init__.py @@ -132,6 +132,7 @@ class RestAPI(CoreSysAttributes): self.webapp.router.add_post( '/addons/{addon}/rebuild', api_addons.rebuild) self.webapp.router.add_get('/addons/{addon}/logs', api_addons.logs) + self.webapp.router.add_get('/addons/{addon}/icon', api_addons.icon) self.webapp.router.add_get('/addons/{addon}/logo', api_addons.logo) self.webapp.router.add_get( '/addons/{addon}/changelog', api_addons.changelog) diff --git a/hassio/api/addons.py b/hassio/api/addons.py index 9880ad9ec..2884da0c3 100644 --- a/hassio/api/addons.py +++ b/hassio/api/addons.py @@ -16,7 +16,7 @@ from ..const import ( ATTR_GPIO, ATTR_HOMEASSISTANT_API, ATTR_STDIN, BOOT_AUTO, BOOT_MANUAL, ATTR_CHANGELOG, ATTR_HOST_IPC, ATTR_HOST_DBUS, ATTR_LONG_DESCRIPTION, ATTR_CPU_PERCENT, ATTR_MEMORY_LIMIT, ATTR_MEMORY_USAGE, ATTR_NETWORK_TX, - ATTR_NETWORK_RX, ATTR_BLK_READ, ATTR_BLK_WRITE, + ATTR_NETWORK_RX, ATTR_BLK_READ, ATTR_BLK_WRITE, ATTR_ICON, CONTENT_TYPE_PNG, CONTENT_TYPE_BINARY, CONTENT_TYPE_TEXT) from ..coresys import CoreSysAttributes from ..validate import DOCKER_PORTS @@ -73,6 +73,7 @@ class APIAddons(CoreSysAttributes): ATTR_REPOSITORY: addon.repository, ATTR_BUILD: addon.need_build, ATTR_URL: addon.url, + ATTR_ICON: addon.with_icon, ATTR_LOGO: addon.with_logo, }) @@ -122,6 +123,7 @@ class APIAddons(CoreSysAttributes): ATTR_HOST_DBUS: addon.host_dbus, ATTR_PRIVILEGED: addon.privileged, ATTR_DEVICES: self._pretty_devices(addon), + ATTR_ICON: addon.with_icon, ATTR_LOGO: addon.with_logo, ATTR_CHANGELOG: addon.with_changelog, ATTR_WEBUI: addon.webui, @@ -243,12 +245,22 @@ class APIAddons(CoreSysAttributes): addon = self._extract_addon(request) return addon.logs() + @api_process_raw(CONTENT_TYPE_PNG) + async def icon(self, request): + """Return icon from addon.""" + addon = self._extract_addon(request, check_installed=False) + if not addon.with_icon: + raise RuntimeError("No icon found!") + + with addon.path_icon.open('rb') as png: + return png.read() + @api_process_raw(CONTENT_TYPE_PNG) async def logo(self, request): """Return logo from addon.""" addon = self._extract_addon(request, check_installed=False) if not addon.with_logo: - raise RuntimeError("No image found!") + raise RuntimeError("No logo found!") with addon.path_logo.open('rb') as png: return png.read() diff --git a/hassio/api/supervisor.py b/hassio/api/supervisor.py index 0ed39868e..ad8c70cff 100644 --- a/hassio/api/supervisor.py +++ b/hassio/api/supervisor.py @@ -11,7 +11,7 @@ from ..const import ( ATTR_DESCRIPTON, ATTR_NAME, ATTR_SLUG, ATTR_INSTALLED, ATTR_TIMEZONE, ATTR_STATE, ATTR_WAIT_BOOT, ATTR_CPU_PERCENT, ATTR_MEMORY_USAGE, ATTR_MEMORY_LIMIT, ATTR_NETWORK_RX, ATTR_NETWORK_TX, ATTR_BLK_READ, - ATTR_BLK_WRITE, CONTENT_TYPE_BINARY) + ATTR_BLK_WRITE, CONTENT_TYPE_BINARY, ATTR_ICON) from ..coresys import CoreSysAttributes from ..validate import validate_timezone, WAIT_BOOT, REPOSITORIES @@ -52,6 +52,7 @@ class APISupervisor(CoreSysAttributes): ATTR_VERSION: addon.last_version, ATTR_INSTALLED: addon.version_installed, ATTR_REPOSITORY: addon.repository, + ATTR_ICON: addon.with_icon, ATTR_LOGO: addon.with_logo, }) diff --git a/hassio/const.py b/hassio/const.py index fd16f0f60..23ec877aa 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -79,6 +79,7 @@ ATTR_DETACHED = 'detached' ATTR_STATE = 'state' ATTR_SCHEMA = 'schema' ATTR_IMAGE = 'image' +ATTR_ICON = 'icon' ATTR_LOGO = 'logo' ATTR_STDIN = 'stdin' ATTR_ADDONS_REPOSITORIES = 'addons_repositories'