Source code for osxphotos.exifinfo

""" ExifInfo class to expose EXIF info from the library """

from __future__ import annotations

import datetime
from dataclasses import dataclass
from typing import Any

from osxphotos.photos_datetime import photos_datetime

__all__ = ["ExifInfo", "exifinfo_factory"]


[docs] @dataclass(frozen=True) class ExifInfo: """Original EXIF info associated with a photo from the Photos library""" flash_fired: bool | None = None iso: int | None = None metering_mode: int | None = None sample_rate: int | None = None track_format: int | None = None white_balance: int | None = None aperture: float | None = None bit_rate: float | None = None duration: float | None = None exposure_bias: float | None = None focal_length: float | None = None fps: float | None = None latitude: float | None = None longitude: float | None = None shutter_speed: float | None = None camera_make: str | None = None camera_model: str | None = None codec: str | None = None lens_model: str | None = None date: datetime.datetime | None = None tzoffset: int | None = None tzname: str | None = None
def exifinfo_factory(data: dict[str, Any] | None) -> ExifInfo: """Create an ExifInfo object from a dictionary of EXIF data""" if data is None: return ExifInfo() exif_info = ExifInfo( iso=data["ZISO"], flash_fired=True if data["ZFLASHFIRED"] == 1 else False, 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 present tzoffset=data.get("ZTIMEZONEOFFSET"), tzname=data.get("ZTIMEZONENAME"), date=photos_datetime( data.get("ZDATECREATED"), data.get("ZTIMEZONEOFFSET"), data.get("ZTIMEZONENAME"), default=False, ), ) return exif_info