immich 0.2.0

Client for Immich photo and video management
Documentation
use std::thread;

use crossbeam_channel::unbounded;
use immich::{
    takeout,
    upload::{Status, Uploaded},
    Client,
};

fn main() {
    let mut args = std::env::args();
    if args.len() < 5 {
        println!("Usage:");
        println!("multithread_upload <URL> <EMAIL> <PASSWORD> <PATH_TO_TAKEOUT_FILE>");
    }
    let _ = args.next();
    let url = args.next().expect("No URL specified");
    let email = args.next().expect("No email specified");
    let password = args.next().expect("No password specified");
    let path = args.next().expect("No path to Takeout specified");

    let client =
        Client::with_email(&url, &email, &password).expect("Unable to connect to specified host");

    println!("Scanning Takeout archive. This might take a while");
    let mut takeout = takeout::Uploader::new(path).unwrap();

    let total = takeout.len();

    let (result_sender, result_receiver) = unbounded::<Uploaded>();

    thread::spawn(move || {
        let mut created = 0;
        let mut duplicate = 0;
        let mut failure = 0;
        while let Ok(result) = result_receiver.recv() {
            match result.status() {
                Status::Created => created += 1,
                Status::Duplicate => duplicate += 1,
                Status::Failure => failure += 1,
            };
            print!(
                "\rCreated: {created} | Duplicate: {duplicate} | Failure: {failure} | Total: {}/{total} | [{}: {}]             ",
                created + duplicate + failure,
                result.status(),
                result.device_asset_id()
            )
        }
    });

    let res = takeout
        .upload(&client, 5, result_sender, |_record| true)
        .unwrap();
    println!("Uploaded and moved {} assets", res.len());
}