Files
immich-sdk/examples/upload_photos.rs
Joakim Hulthe 2e7db3b35a Add integration testing infrastructure with Podman Compose
- Add docker/podman-compose.yml for Immich server (no ML)
- Add test-data/sample-photos/ with 3 public domain images
- Add scripts/start-immich.sh for container startup + admin/API key creation
- Add scripts/seed-data.sh for uploading test photos and creating albums
- Add scripts/stop-immich.sh for cleanup with volume destruction
- Add scripts/run-example.sh wrapper (fixed env var export)
- Update examples to use IMMICH_URL and IMMICH_API_KEY env vars
- Add .github/workflows/integration-test.yml for CI
- Update assets.list() to use /search/metadata endpoint
- Update AGENTS.md with example running instructions
- Add 5 new examples: search_metadata, album_management, timeline_browsing,
  delete_assets, server_info
2026-04-14 20:13:30 +00:00

83 lines
2.3 KiB
Rust

//! 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<dyn std::error::Error>> {
// 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(())
}