53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
"""Proxy HTTP pour les images statiques de CookCLI.
|
|
|
|
Le navigateur ne peut pas atteindre le serveur CookCLI directement (ni le
|
|
port ingress 9080, restreint à l'IP du Supervisor par nginx, ni le port
|
|
direct 9081, non publié sur le LAN). Seul le backend Home Assistant, sur le
|
|
même réseau Docker interne que l'add-on, peut le faire. Cette vue relaie
|
|
donc les octets de l'image en passant par ce backend.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from aiohttp import web
|
|
from homeassistant.components.http import HomeAssistantView
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from .api import CookCliApiError
|
|
from .const import DOMAIN
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
class CookCliImageView(HomeAssistantView):
|
|
"""GET /api/cookcli/image/{entry_id}/{image_ref} -> octets de l'image."""
|
|
|
|
url = "/api/cookcli/image/{entry_id}{image_ref:.*}"
|
|
name = "api:cookcli:image"
|
|
requires_auth = True
|
|
|
|
def __init__(self, hass: HomeAssistant) -> None:
|
|
self.hass = hass
|
|
|
|
async def get(
|
|
self, request: web.Request, entry_id: str, image_ref: str
|
|
) -> web.Response:
|
|
entry_data = self.hass.data.get(DOMAIN, {}).get(entry_id)
|
|
if entry_data is None:
|
|
return web.Response(status=404, text="Intégration CookCLI introuvable")
|
|
|
|
client = entry_data["client"]
|
|
try:
|
|
data, content_type = await client.async_get_image(image_ref)
|
|
except CookCliApiError as err:
|
|
_LOGGER.debug("Échec de récupération de l'image %s: %s", image_ref, err)
|
|
return web.Response(status=502, text="Impossible de récupérer l'image")
|
|
|
|
return web.Response(
|
|
body=data,
|
|
content_type=content_type or "application/octet-stream",
|
|
headers={"Cache-Control": "max-age=3600"},
|
|
)
|