Initial commit: immich-sdk v1.137.0
This commit is contained in:
180
README.md
Normal file
180
README.md
Normal file
@@ -0,0 +1,180 @@
|
||||
# immich-sdk
|
||||
|
||||
A modern Rust SDK for the [Immich](https://immich.app/) photo and video management server.
|
||||
|
||||
## Features
|
||||
|
||||
- **Async-first**: Built on `tokio` and `reqwest` for modern async Rust
|
||||
- **Builder pattern**: Ergonomic API with fluent builders
|
||||
- **Type-safe**: Strongly typed models
|
||||
- **Error handling**: Comprehensive error types with `thiserror`
|
||||
- **Rustls TLS**: Uses rustls instead of OpenSSL
|
||||
|
||||
## Installation
|
||||
|
||||
Add this to your `Cargo.toml`:
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
immich-sdk = "1.137"
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
```rust
|
||||
use immich_sdk::{Client, error::Result};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
// Create a client
|
||||
let client = Client::from_url("https://immich.example.com")?
|
||||
.with_api_key("your-api-key");
|
||||
|
||||
// List albums
|
||||
let albums = client.albums().list().execute().await?;
|
||||
println!("Found {} albums", albums.len());
|
||||
|
||||
// Upload an asset
|
||||
let asset = client
|
||||
.assets()
|
||||
.upload()
|
||||
.file("/path/to/photo.jpg")
|
||||
.device_asset_id("phone-123")
|
||||
.device_id("my-device")
|
||||
.execute()
|
||||
.await?;
|
||||
|
||||
println!("Uploaded asset: {:?}", asset.id);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
```
|
||||
|
||||
## Authentication
|
||||
|
||||
The SDK supports API key authentication:
|
||||
|
||||
```rust
|
||||
use immich_sdk::Client;
|
||||
|
||||
let client = Client::from_url("https://immich.example.com")?
|
||||
.with_api_key("your-api-key-here");
|
||||
```
|
||||
|
||||
## API Modules
|
||||
|
||||
### Assets
|
||||
|
||||
Upload, download, and manage photos and videos:
|
||||
|
||||
```rust
|
||||
// List all assets
|
||||
let assets = client.assets().list().execute().await?;
|
||||
|
||||
// Get a specific asset
|
||||
let asset = client.assets().get(asset_id).execute().await?;
|
||||
|
||||
// Upload a new asset
|
||||
let uploaded = client
|
||||
.assets()
|
||||
.upload()
|
||||
.file("/path/to/photo.jpg")
|
||||
.device_asset_id("unique-device-id")
|
||||
.device_id("device-name")
|
||||
.favorite()
|
||||
.execute()
|
||||
.await?;
|
||||
|
||||
// Delete assets
|
||||
client
|
||||
.assets()
|
||||
.delete()
|
||||
.id(asset_id)
|
||||
.execute()
|
||||
.await?;
|
||||
```
|
||||
|
||||
### Albums
|
||||
|
||||
Create and manage albums:
|
||||
|
||||
```rust
|
||||
// Create an album
|
||||
let album = client
|
||||
.albums()
|
||||
.create()
|
||||
.name("My Vacation")
|
||||
.execute()
|
||||
.await?;
|
||||
|
||||
// Add assets to album
|
||||
client
|
||||
.albums()
|
||||
.add_assets(album.id)
|
||||
.asset_ids(vec![asset_id1, asset_id2])
|
||||
.execute()
|
||||
.await?;
|
||||
|
||||
// List all albums
|
||||
let albums = client.albums().list().execute().await?;
|
||||
```
|
||||
|
||||
### Server Info
|
||||
|
||||
Get server information:
|
||||
|
||||
```rust
|
||||
// Get server version
|
||||
let version = client.server().version().await?;
|
||||
println!("Server version: {}", version);
|
||||
|
||||
// Get server features
|
||||
let features = client.server().features().await?;
|
||||
println!("OAuth enabled: {}", features.oauth);
|
||||
|
||||
// Ping the server
|
||||
let pong = client.server().ping().await?;
|
||||
println!("Ping: {}", pong);
|
||||
```
|
||||
|
||||
## Error Handling
|
||||
|
||||
The SDK uses the `ImmichError` type for all errors:
|
||||
|
||||
```rust
|
||||
use immich_sdk::error::ImmichError;
|
||||
|
||||
match client.assets().get(asset_id).execute().await {
|
||||
Ok(asset) => println!("Found: {:?}", asset),
|
||||
Err(ImmichError::NotFound(_)) => println!("Asset not found"),
|
||||
Err(ImmichError::Authentication(_)) => println!("Auth failed"),
|
||||
Err(e) => println!("Error: {}", e),
|
||||
}
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
Create a client with custom configuration:
|
||||
|
||||
```rust
|
||||
use immich_sdk::{Client, Config};
|
||||
use std::time::Duration;
|
||||
|
||||
let config = Config::new("https://immich.example.com")
|
||||
.with_api_key("your-api-key")
|
||||
.with_timeout(Duration::from_secs(60));
|
||||
|
||||
let client = Client::new(config)?;
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT OR Apache-2.0 license.
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome! Please feel free to submit a Pull Request.
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
- [Immich](https://immich.app/) - The amazing photo and video management solution
|
||||
Reference in New Issue
Block a user