chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import base64
|
||||
from io import BytesIO
|
||||
from typing import Any
|
||||
|
||||
from PIL import Image
|
||||
|
||||
|
||||
def image_from_response_part(part: Any) -> Image.Image | None:
|
||||
inline_data = getattr(part, "inline_data", None)
|
||||
if inline_data is None and isinstance(part, dict):
|
||||
inline_data = part.get("inline_data")
|
||||
if inline_data is None:
|
||||
return None
|
||||
|
||||
as_image = getattr(part, "as_image", None)
|
||||
if callable(as_image):
|
||||
image = as_image()
|
||||
if isinstance(image, Image.Image):
|
||||
return image
|
||||
|
||||
data = _value(inline_data, "data")
|
||||
if data is None:
|
||||
return None
|
||||
if isinstance(data, str):
|
||||
if data.startswith("data:") and "," in data:
|
||||
data = data.split(",", 1)[1]
|
||||
data = base64.b64decode(data)
|
||||
if isinstance(data, bytearray):
|
||||
data = bytes(data)
|
||||
if not isinstance(data, bytes):
|
||||
return None
|
||||
return Image.open(BytesIO(data)).convert("RGB")
|
||||
|
||||
|
||||
def _value(obj: Any, key: str) -> Any:
|
||||
if isinstance(obj, dict):
|
||||
return obj.get(key)
|
||||
return getattr(obj, key, None)
|
||||
Reference in New Issue
Block a user