Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. from datetime import datetime
  2.  
  3. from pathlib import Path
  4.  
  5.  
  6. class Exif:
  7. class Prop:
  8. def __init__(self, name):
  9. self.name = name
  10.  
  11. def __get__(self, obj: 'Exif', objtype=None):
  12. if obj is None:
  13. return self
  14. return self.fget(obj)
  15.  
  16. def fget(self, obj: 'Exif'):
  17. return obj._raw.get(self.name)
  18.  
  19. maker = Prop('Exif:Make')
  20. model = Prop('Exif:Model')
  21. lens_model = Prop('Exif:LensModel')
  22. iso = Prop('Exif:ISO')
  23. fnumber = Prop('Exif:FNumber')
  24. exposure_time = Prop('Exif:ExposureTime')
  25. focal_length = Prop('Exif:FocalLength')
  26. orientation = Prop('Exif:Orientation')
  27. style = Prop('MakerNotes:FilmMode')
  28. datetime_original = Prop('Exif:DateTimeOriginal')
  29.  
  30. def __init__(self, raw):
  31. """
  32. :type raw: dict
  33. """
  34. self.path = Path(raw['SourceFile'])
  35. self._raw = raw
  36.  
  37. @property
  38. def datetime(self):
  39. if 'DateTimeOriginal' in self._raw:
  40. return datetime.strptime(self._raw['DateTimeOriginal'], '%Y:%m:%d %H:%M:%S')
  41. return None
  42.  
  43. def diff(self, other: 'Exif'):
  44. props = (Exif.maker, Exif.model, Exif.lens_model, Exif.style, Exif.orientation, Exif.datetime_original)
  45. for p in props:
  46. self_value = p.fget(self)
  47. other_value = p.fget(other)
  48. if self_value != other_value:
  49. name = p.name.ljust(8, ' ')
  50. yield f'{name}\t{self_value}\t->\t{other_value}'
  51.  
  52. def __eq__(self, other: 'Exif') -> bool:
  53. props = (
  54. Exif.maker,
  55. Exif.model,
  56. Exif.lens_model,
  57. Exif.iso,
  58. Exif.fnumber,
  59. Exif.exposure_time,
  60. Exif.focal_length,
  61. Exif.orientation,
  62. Exif.style,
  63. Exif.datetime_original,
  64. )
  65. return all(p.fget(self) == p.fget(other) for p in props)
  66.  
  67.  
  68. def test_exif():
  69. raw = {'SourceFile': '123.jpg', 'Exif:ISO': 320, 'Exif:Make': 'Canon'}
  70. exif = Exif(raw)
  71. raw2 = dict(raw, **{'Exif:Make': 'Fuji'})
  72. exi2 = Exif(raw2)
  73.  
  74. assert exif.iso == 320
  75. assert exif == Exif(raw)
  76. assert exif != exi2
  77. assert list(exif.diff(exi2)) == ['Exif:Make\tCanon\t->\tFuji']
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement