photokit 0.2.0

Safe Rust bindings for Apple's Photos framework — photo library access on macOS
Documentation

photokit

Safe Rust bindings for Apple's Photos framework on macOS.

Status: v0.2.0 covers PHAsset, PHAssetCollection, PHCollectionList, PHPhotoLibrary, PHImageManager, PHFetchResult, PHChange, PHContentEditingInput, PHContentEditingOutput, PHObjectChangeDetails, PHFetchOptions, PHAssetCreationRequest, PHLivePhoto, and PHCloudIdentifier through a multi-file Swift bridge.

Quick start

use photokit::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let library = PHPhotoLibrary::shared()?;
    println!("status: {:?}", PHPhotoLibrary::authorization_status());

    let assets = PHAsset::fetch(&PHFetchOptions::default())?;
    println!("assets: {}", assets.len());

    if let Some(asset) = assets.first() {
        let manager = PHImageManager::shared()?;
        let request = manager.request_image_data(
            asset,
            &PHImageRequest::new(320.0, 240.0, PHImageContentMode::AspectFit),
        )?;
        let image = request.wait(10_000)?;
        println!("image bytes: {}", image.data().len());
    }

    let _ = library.fetch_asset_collections(&PHFetchOptions::default())?;
    Ok(())
}

Highlights

  • PHPhotoLibrary authorization helpers plus summary/detailed change observers.
  • PHAsset, PHAssetCollection, and PHCollectionList fetch helpers with editable capability checks.
  • PHFetchOptions and PHFetchResult<T> convenience wrappers for filtering and iteration.
  • PHImageManager / PHCachingImageManager request handles for images, image data, live photos, and caching.
  • PHContentEditingInput / PHContentEditingOutput handles for non-destructive editing workflows.
  • PHAssetCreationRequest builder-style asset creation helpers.
  • PHCloudIdentifier batch lookup helpers for local/cloud identifier mapping.

Coverage audit

See COVERAGE.md for the framework audit, implemented rows, partial rows, and deferred macOS-unavailable or deprecated APIs.

Examples

The crate ships with numbered examples covering every logical area:

  • 01_photokit_smoke
  • 02_phasset_fetch
  • 03_phasset_collection_fetch
  • 04_phcollection_list_fetch
  • 05_phphoto_library_authorization
  • 06_phimage_manager_requests
  • 07_phfetch_result_methods
  • 08_phchange_observer
  • 09_phcontent_editing_input
  • 10_phcontent_editing_output
  • 11_phobject_change_details
  • 12_phfetch_options_builder
  • 13_phasset_creation_request
  • 14_phlive_photo
  • 15_phcloud_identifier

Run them with:

for ex in examples/*.rs; do
  cargo run --example "$(basename "$ex" .rs)"
done

Verification

cargo clippy --all-targets -- -D warnings
cargo test
for ex in examples/*.rs; do cargo run --example "$(basename "$ex" .rs)"; done

License

Licensed under either of Apache-2.0 or MIT at your option.