diff --git a/starpunk/media.py b/starpunk/media.py index a7c0c79..c4a6401 100644 --- a/starpunk/media.py +++ b/starpunk/media.py @@ -108,7 +108,23 @@ def validate_image(file_data: bytes, filename: str) -> Tuple[bytes, str, int, in # Re-open after verify (verify() closes the file) img = Image.open(io.BytesIO(file_data)) except Exception as e: - raise ValueError(f"Invalid or corrupted image: {e}") + # v1.4.2: If Pillow can't open, try explicitly as HEIC + # iOS sometimes saves HEIC with .jpeg extension + if HEIC_SUPPORTED: + try: + heif_file = pillow_heif.read_heif(file_data) + img = Image.frombytes( + heif_file.mode, + heif_file.size, + heif_file.data, + "raw", + ) + # Mark as HEIF so conversion happens below + img.format = 'HEIF' + except Exception: + raise ValueError(f"Invalid or corrupted image: {e}") + else: + raise ValueError(f"Invalid or corrupted image: {e}") # HEIC/HEIF conversion (v1.4.2) # HEIC cannot be displayed in browsers, convert to JPEG