Fix EXIF viewer breaking on binary MakerNote fields
Some checks failed
Release / test (push) Failing after 43s
Release / publish (push) Has been skipped
Release / github-release (push) Has been skipped

Pentax and other cameras have binary EXIF fields (MakerNote, etc.) that
contain raw bytes. The previous code used errors="replace" which still
produced strings with replacement characters that broke JSON parsing.

Now properly detect non-printable binary data and display as
"<N bytes binary>" instead.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Aaron D. Lee
2026-01-11 13:40:12 -05:00
parent 1e07630b49
commit 2ebc42f2cd

View File

@@ -66,9 +66,15 @@ def read_image_exif(image_data: bytes) -> dict:
# Convert bytes to string if possible # Convert bytes to string if possible
elif isinstance(value, bytes): elif isinstance(value, bytes):
try: try:
result[tag] = value.decode("utf-8", errors="replace").strip("\x00") # Try to decode as ASCII/UTF-8 text
except Exception: decoded = value.decode("utf-8", errors="strict").strip("\x00")
result[tag] = f"<{len(value)} bytes>" # Only keep if it looks like printable text
if decoded.isprintable() or all(c.isspace() or c.isprintable() for c in decoded):
result[tag] = decoded
else:
result[tag] = f"<{len(value)} bytes binary>"
except (UnicodeDecodeError, Exception):
result[tag] = f"<{len(value)} bytes binary>"
# Handle tuples of IFDRational # Handle tuples of IFDRational
elif isinstance(value, tuple) and value and hasattr(value[0], "numerator"): elif isinstance(value, tuple) and value and hasattr(value[0], "numerator"):
result[tag] = [float(v) for v in value] result[tag] = [float(v) for v in value]