osxphotos/examples/photo_inspect.py
2022-05-18 23:07:33 -07:00

91 lines
3.0 KiB
Python

"""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)