//! Example: Upload photos to Immich //! //! This example uses environment variables for configuration: //! - IMMICH_URL: The Immich server URL (defaults to http://localhost:2283) //! - IMMICH_API_KEY: Your API key (required) //! //! It also reads photos from test-data/sample-photos/ directory. use immich_sdk::Client; #[tokio::main] async fn main() -> Result<(), Box> { // Configure the client from environment variables let url = std::env::var("IMMICH_URL").unwrap_or_else(|_| "http://localhost:2283".to_string()); let api_key = std::env::var("IMMICH_API_KEY").expect("IMMICH_API_KEY environment variable not set"); // Create a client let client = Client::from_url(&url)?.with_api_key(api_key); // Use test data photos let photo_dir = std::path::Path::new("test-data/sample-photos"); let photos: Vec<_> = std::fs::read_dir(photo_dir)? .filter_map(|e| e.ok()) .map(|e| e.path()) .filter(|p| p.extension().map(|e| e == "jpg").unwrap_or(false)) .collect(); if photos.is_empty() { println!("No photos found in test-data/sample-photos/"); return Ok(()); } // Upload first photo let photo_path = &photos[0]; // Upload the photo println!("Uploading: {}", photo_path.display()); let result = client .assets() .upload() .file(photo_path) .device_asset_id("my-photo-001") .device_id("my-computer") .favorite() .execute() .await?; match result.status { immich_sdk::models::AssetUploadStatus::Created => { println!("Successfully uploaded! Asset ID: {:?}", result.id); } immich_sdk::models::AssetUploadStatus::Duplicate => { println!("Photo already exists (duplicate)"); } _ => { println!("Upload status: {:?}", result.status); } } // Create an album and add the uploaded asset if let Some(asset_id) = result.id { let album = client .albums() .create() .name("Uploaded Photos") .execute() .await?; client .albums() .add_assets(album.id) .asset_ids([asset_id]) .execute() .await?; println!("Added to album: {}", album.album_name); } Ok(()) }