91 lines
3.0 KiB
Python
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)
|