ianare / exif-py

Easy to use Python module to extract Exif metadata from digital image files.
BSD 3-Clause "New" or "Revised" License
831 stars 191 forks source link

KeyError: hdlr #160

Closed JonathanRoth13 closed 1 year ago

JonathanRoth13 commented 2 years ago

i encountered this error using python 3.9.2 and while trying to extract exif data from a HEIC file. 2022-01-18_screenshot_bumbling : bash

exifread

aapris commented 2 years ago

pip install "exifread<3" solved this for me.

I'm on macOS (Apple silicon).

helgeerbe commented 1 year ago

Works fine on macos, but fails on raspberrypi

samrushing commented 1 year ago

I just came across the same issue. No idea what 'hdlr' contains. In the exiv2 source it parses it with a function called parseHandler (in quicktimevideo.cpp). Just skipping it seems to work, though:

diff --git a/exifread/heic.py b/exifread/heic.py
index 1109d15..e61f833 100644
--- a/exifread/heic.py
+++ b/exifread/heic.py
@@ -158,6 +158,11 @@ def parse_meta (self, meta):
             # skip any unparsed data
             self.skip (box)

+    def parse_hdlr (self, box):
+        self.get_full (box)
+        # can I just ignore it?
+        self.skip (box)
+
     def parse_infe (self, box):
         self.get_full (box)
         if box.version >= 2:
hpoul commented 1 year ago

imho just ignoring it would be the right thing to do, i've created a PR #175

fwiw, the following monkey patch also seems to work for me..

def _monkey_patch_exifread():
    from exifread import HEICExifFinder
    from exifread.heic import NoParser

    _old_get_parser = HEICExifFinder.get_parser

    def _get_parser(self, box):
        try:
            return _old_get_parser(self, box)
        except NoParser:
            logger.warning("ignoring parser %s", box.name)
            return None

    HEICExifFinder.get_parser = _get_parser

_monkey_patch_exifread()
honzajavorek commented 1 year ago

Seems like this is not yet fully fixed? https://github.com/ianare/exif-py/issues/184

OPunWide commented 3 weeks ago

This is still an issue. I'm trying to parse an image that was made on an iPhone, but the Python code and the image are on Win11 WSL.

It's the error during the process_file call:

  File ".../lib/python3.8/site-packages/exifread/heic.py", line 173, in get_parser
      raise NoParser(box.name) from err
  exifread.heic.NoParser: hdlr