"""Print information about one or more items selected in Photos; run with `osxphotos run photo_inspect.py`""" from time import sleep import bitmath from photoscript import PhotosLibrary from rich import print from osxphotos import PhotoInfo, PhotosDB from osxphotos.utils import dd_to_dms_str def get_photo_type(photo: PhotoInfo): """Return a string describing the type of photo""" if photo.ismovie: photo_type = "video" else: raw = "RAW+JPEG " if photo.has_raw else "RAW " if photo.israw else "" photo_type = f"{raw}photo" if photo.burst: photo_type += " burst" if photo.live_photo: photo_type += " live" if photo.selfie: photo_type += " selfie" if photo.panorama: photo_type += " panorama" if photo.hdr: photo_type += " HDR" if photo.screenshot: photo_type += " screenshot" if photo.slow_mo: photo_type += " slow-mo" if photo.time_lapse: photo_type += " time-lapse" if photo.portrait: photo_type += " portrait" return photo_type def inspect_photo(photo: PhotoInfo): """Print info about an osxphotos PhotoInfo object""" properties = [ f"filename: {photo.original_filename}", f"type: {get_photo_type(photo)}", f"uuid: {photo.uuid}", f"date: {photo.date.isoformat()}", f"dimensions: {photo.height} x {photo.width}", f"file size: {bitmath.Byte(photo.original_filesize).to_MB()}", f"title: {photo.title or '-'}", f"description: {photo.description or '-'}", f"edited: {'✔' if photo.hasadjustments else '-'}", f"keywords: {', '.join(photo.keywords) or '-'}", f"persons: {', '.join(photo.persons) or '-'}", f"location: {', '.join(dd_to_dms_str(*photo.location)) if photo.location[0] else '-'}", f"place: {photo.place.name if photo.place else '-'}", f"categories: {', '.join(photo.labels) or '-'}", f"albums: {', '.join(photo.albums) or '-'}", f"favorite: {'♥' if photo.favorite else '-'}", ] if photo.exif_info: properties.extend( [ f"camera: {photo.exif_info.camera_make or '-'} {photo.exif_info.camera_model or '-'}", f"lens: {photo.exif_info.lens_model or '-'}", ] ) for property in properties: print(property) print("-" * 20) if __name__ == "__main__": print("Loading Photos Library...") photosdb = PhotosDB() photoslib = PhotosLibrary() # keep track of last seen UUIDs so we don't print duplicates last_uuids = [] print("Select one or more photos in Photos (press Ctrl+C to quit)") while True: if photos := photoslib.selection: uuids = sorted([photo.uuid for photo in photos]) if uuids != last_uuids: for photo in photos: photoinfo = photosdb.get_photo(photo.uuid) inspect_photo(photoinfo) last_uuids = uuids sleep(0.200)