Remove dependency on libmagic

This commit is contained in:
clydebarrow 2024-08-28 13:20:30 +10:00
parent 458a8970b6
commit 659370e556

View file

@ -1,18 +1,17 @@
from __future__ import annotations from __future__ import annotations
import logging
import hashlib import hashlib
import io import io
import logging
from pathlib import Path from pathlib import Path
import re import re
from magic import Magic
from esphome import core from PIL import UnidentifiedImageError
from esphome.components import font
from esphome import external_files from esphome import core, external_files
import esphome.config_validation as cv
import esphome.codegen as cg import esphome.codegen as cg
from esphome.components import font
import esphome.config_validation as cv
from esphome.const import ( from esphome.const import (
CONF_DITHER, CONF_DITHER,
CONF_FILE, CONF_FILE,
@ -30,7 +29,6 @@ from esphome.core import CORE, HexInt
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
DOMAIN = "image" DOMAIN = "image"
DEPENDENCIES = ["display"]
MULTI_CONF = True MULTI_CONF = True
MULTI_CONF_NO_DEFAULT = True MULTI_CONF_NO_DEFAULT = True
@ -239,12 +237,11 @@ CONFIG_SCHEMA = cv.All(font.validate_pillow_installed, IMAGE_SCHEMA)
def load_svg_image(file: bytes, resize: tuple[int, int]): def load_svg_image(file: bytes, resize: tuple[int, int]):
# Local import only to allow "validate_pillow_installed" to run *before* importing it # Local import only to allow "validate_pillow_installed" to run *before* importing it
from PIL import Image
# This import is only needed in case of SVG images; adding it # This import is only needed in case of SVG images; adding it
# to the top would force configurations not using SVG to also have it # to the top would force configurations not using SVG to also have it
# installed for no reason. # installed for no reason.
from cairosvg import svg2png from cairosvg import svg2png
from PIL import Image
if resize: if resize:
req_width, req_height = resize req_width, req_height = resize
@ -280,17 +277,16 @@ async def to_code(config):
except Exception as e: except Exception as e:
raise core.EsphomeError(f"Could not load image file {path}: {e}") raise core.EsphomeError(f"Could not load image file {path}: {e}")
mime = Magic(mime=True)
file_type = mime.from_buffer(file_contents)
resize = config.get(CONF_RESIZE) resize = config.get(CONF_RESIZE)
if "svg" in file_type: try:
image = load_svg_image(file_contents, resize)
else:
image = Image.open(io.BytesIO(file_contents)) image = Image.open(io.BytesIO(file_contents))
if resize: if resize:
image.thumbnail(resize) image.thumbnail(resize)
except UnidentifiedImageError as exc:
if "<svg" in str(file_contents):
image = load_svg_image(file_contents, resize)
else:
raise core.EsphomeError(f"Could not load image file {path}") from exc
width, height = image.size width, height = image.size
if CONF_RESIZE not in config and (width > 500 or height > 500): if CONF_RESIZE not in config and (width > 500 or height > 500):