Add asset download functionality with builder pattern and example
This commit is contained in:
40
examples/download_asset.rs
Normal file
40
examples/download_asset.rs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
//! Example: Download an asset from Immich
|
||||||
|
|
||||||
|
use immich_sdk::Client;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
// Create a client
|
||||||
|
let client = Client::from_url("https://immich.example.com")?.with_api_key("your-api-key");
|
||||||
|
|
||||||
|
// Asset ID to download (replace with a real asset ID)
|
||||||
|
let asset_id = "your-asset-id-here".parse()?;
|
||||||
|
|
||||||
|
// Download the asset
|
||||||
|
println!("Downloading asset...");
|
||||||
|
let bytes = client.assets().download(asset_id).execute().await?;
|
||||||
|
|
||||||
|
// Save to file
|
||||||
|
let output_path = "/path/to/output/photo.jpg";
|
||||||
|
fs::write(output_path, &bytes)?;
|
||||||
|
println!("Saved {} bytes to {}", bytes.len(), output_path);
|
||||||
|
|
||||||
|
// Or download the edited version if available
|
||||||
|
let edited_bytes = client
|
||||||
|
.assets()
|
||||||
|
.download(asset_id)
|
||||||
|
.edited()
|
||||||
|
.execute()
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let edited_path = "/path/to/output/photo_edited.jpg";
|
||||||
|
fs::write(edited_path, &edited_bytes)?;
|
||||||
|
println!(
|
||||||
|
"Saved edited version {} bytes to {}",
|
||||||
|
edited_bytes.len(),
|
||||||
|
edited_path
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
@@ -39,6 +39,11 @@ impl AssetsApi {
|
|||||||
pub fn delete(&self) -> DeleteAssetsBuilder {
|
pub fn delete(&self) -> DeleteAssetsBuilder {
|
||||||
DeleteAssetsBuilder::new(self.client.clone())
|
DeleteAssetsBuilder::new(self.client.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Download an asset
|
||||||
|
pub fn download(&self, id: AssetId) -> DownloadAssetBuilder {
|
||||||
|
DownloadAssetBuilder::new(self.client.clone(), id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Builder for listing assets
|
/// Builder for listing assets
|
||||||
@@ -255,3 +260,42 @@ impl DeleteAssetsBuilder {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Builder for downloading an asset
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct DownloadAssetBuilder {
|
||||||
|
client: Client,
|
||||||
|
id: AssetId,
|
||||||
|
edited: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DownloadAssetBuilder {
|
||||||
|
/// Create a new download builder
|
||||||
|
const fn new(client: Client, id: AssetId) -> Self {
|
||||||
|
Self {
|
||||||
|
client,
|
||||||
|
id,
|
||||||
|
edited: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Download the edited version if available
|
||||||
|
pub fn edited(mut self) -> Self {
|
||||||
|
self.edited = true;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Execute the download
|
||||||
|
pub async fn execute(self) -> Result<bytes::Bytes> {
|
||||||
|
let path = format!("/assets/{}/original", self.id);
|
||||||
|
let mut req = self.client.get(&path);
|
||||||
|
|
||||||
|
if self.edited {
|
||||||
|
req = req.query(&[("edited", "true")]);
|
||||||
|
}
|
||||||
|
|
||||||
|
let response = self.client.execute(req.build()?).await?;
|
||||||
|
let bytes = response.bytes().await?;
|
||||||
|
Ok(bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user