2 Commits

Author SHA1 Message Date
e8ff0a0dcb fix(media): Add debug logging for unrecognized image formats - v1.4.2
Logs magic bytes when both Pillow and HEIC parsers fail,
to help diagnose what format the file actually is.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 18:06:09 -07:00
9bc6780a8e fix(media): Handle HEIC files with wrong extension - v1.4.2
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 <noreply@anthropic.com>
2025-12-16 17:54:50 -07:00

View File

@@ -108,7 +108,32 @@ 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 as heic_error:
# Log the magic bytes for debugging (if in app context)
try:
magic = file_data[:12].hex() if len(file_data) >= 12 else file_data.hex()
current_app.logger.warning(
f'Media upload failed both Pillow and HEIC: filename="{filename}", '
f'magic_bytes={magic}, pillow_error="{e}", heic_error="{heic_error}"'
)
except RuntimeError:
pass # Outside app context (e.g., tests)
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