Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from datetime import datetime
- from pathlib import Path
- class Exif:
- class Prop:
- def __init__(self, name):
- self.name = name
- def __get__(self, obj: 'Exif', objtype=None):
- if obj is None:
- return self
- return self.fget(obj)
- def fget(self, obj: 'Exif'):
- return obj._raw.get(self.name)
- maker = Prop('Exif:Make')
- model = Prop('Exif:Model')
- lens_model = Prop('Exif:LensModel')
- iso = Prop('Exif:ISO')
- fnumber = Prop('Exif:FNumber')
- exposure_time = Prop('Exif:ExposureTime')
- focal_length = Prop('Exif:FocalLength')
- orientation = Prop('Exif:Orientation')
- style = Prop('MakerNotes:FilmMode')
- datetime_original = Prop('Exif:DateTimeOriginal')
- def __init__(self, raw):
- """
- :type raw: dict
- """
- self.path = Path(raw['SourceFile'])
- self._raw = raw
- @property
- def datetime(self):
- if 'DateTimeOriginal' in self._raw:
- return datetime.strptime(self._raw['DateTimeOriginal'], '%Y:%m:%d %H:%M:%S')
- return None
- def diff(self, other: 'Exif'):
- props = (Exif.maker, Exif.model, Exif.lens_model, Exif.style, Exif.orientation, Exif.datetime_original)
- for p in props:
- self_value = p.fget(self)
- other_value = p.fget(other)
- if self_value != other_value:
- name = p.name.ljust(8, ' ')
- yield f'{name}\t{self_value}\t->\t{other_value}'
- def __eq__(self, other: 'Exif') -> bool:
- props = (
- Exif.maker,
- Exif.model,
- Exif.lens_model,
- Exif.iso,
- Exif.fnumber,
- Exif.exposure_time,
- Exif.focal_length,
- Exif.orientation,
- Exif.style,
- Exif.datetime_original,
- )
- return all(p.fget(self) == p.fget(other) for p in props)
- def test_exif():
- raw = {'SourceFile': '123.jpg', 'Exif:ISO': 320, 'Exif:Make': 'Canon'}
- exif = Exif(raw)
- raw2 = dict(raw, **{'Exif:Make': 'Fuji'})
- exi2 = Exif(raw2)
- assert exif.iso == 320
- assert exif == Exif(raw)
- assert exif != exi2
- assert list(exif.diff(exi2)) == ['Exif:Make\tCanon\t->\tFuji']
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement