From 9bc6780a8e74a85c279cdc82cdf5c157e02ce00c Mon Sep 17 00:00:00 2001 From: Phil Skentelbery Date: Tue, 16 Dec 2025 17:54:50 -0700 Subject: [PATCH] fix(media): Handle HEIC files with wrong extension - v1.4.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit iOS sometimes saves HEIC with .jpeg extension. Pillow fails to open these as JPEG, so now we fallback to trying pillow-heif directly when initial open fails. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- starpunk/media.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) 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