""" ExifInfo class to expose EXIF info from the library """from__future__importannotationsimportdatetimefromdataclassesimportdataclassfromtypingimportAnyfromosxphotos.photos_datetimeimportphotos_datetime__all__=["ExifInfo","exifinfo_factory"]
[docs]@dataclass(frozen=True)classExifInfo:"""Original EXIF info associated with a photo from the Photos library"""flash_fired:bool|None=Noneiso:int|None=Nonemetering_mode:int|None=Nonesample_rate:int|None=Nonetrack_format:int|None=Nonewhite_balance:int|None=Noneaperture:float|None=Nonebit_rate:float|None=Noneduration:float|None=Noneexposure_bias:float|None=Nonefocal_length:float|None=Nonefps:float|None=Nonelatitude:float|None=Nonelongitude:float|None=Noneshutter_speed:float|None=Nonecamera_make:str|None=Nonecamera_model:str|None=Nonecodec:str|None=Nonelens_model:str|None=Nonedate:datetime.datetime|None=Nonetzoffset:int|None=Nonetzname:str|None=None
defexifinfo_factory(data:dict[str,Any]|None)->ExifInfo:"""Create an ExifInfo object from a dictionary of EXIF data"""ifdataisNone:returnExifInfo()exif_info=ExifInfo(iso=data["ZISO"],flash_fired=Trueifdata["ZFLASHFIRED"]==1elseFalse,metering_mode=data["ZMETERINGMODE"],sample_rate=data["ZSAMPLERATE"],track_format=data["ZTRACKFORMAT"],white_balance=data["ZWHITEBALANCE"],aperture=data["ZAPERTURE"],bit_rate=data["ZBITRATE"],duration=data["ZDURATION"],exposure_bias=data["ZEXPOSUREBIAS"],focal_length=data["ZFOCALLENGTH"],fps=data["ZFPS"],latitude=data["ZLATITUDE"],longitude=data["ZLONGITUDE"],shutter_speed=data["ZSHUTTERSPEED"],camera_make=data["ZCAMERAMAKE"],camera_model=data["ZCAMERAMODEL"],codec=data["ZCODEC"],lens_model=data["ZLENSMODEL"],# ZDATECREATED, ZTIMEZONEOFFSET, ZTIMEZONENAME added in Ventura / Photos 8 so may not be presenttzoffset=data.get("ZTIMEZONEOFFSET"),tzname=data.get("ZTIMEZONENAME"),date=photos_datetime(data.get("ZDATECREATED"),data.get("ZTIMEZONEOFFSET"),data.get("ZTIMEZONENAME"),default=False,),)returnexif_info