Skip to main content

recordings_manager/
recordings_manager.rs

1use chrono::{Duration as ChronoDuration, Local};
2use dvrip_rs::{Authentication, Connection, DVRIPCam, FileManagement};
3use std::time::Duration;
4
5#[tokio::main]
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    let args: Vec<String> = std::env::args().collect();
8    if args.len() < 4 {
9        println!("Usage: {} <IP> <Username> <Password>", args[0]);
10        return Ok(());
11    }
12
13    let ip = &args[1];
14    let user = &args[2];
15    let pass = &args[3];
16
17    let mut cam = DVRIPCam::new(ip);
18
19    cam.connect(Duration::from_secs(5)).await?;
20    cam.login(user, pass).await?;
21
22    println!("Searching for video files from the last 24 hours...");
23
24    let end_time = Local::now();
25    let start_time = end_time - ChronoDuration::hours(24);
26
27    match cam.list_local_files(start_time, end_time, "video", 0).await {
28        Ok(files) => {
29            println!("Found {} files.", files.len());
30
31            for (i, file) in files.iter().take(5).enumerate() {
32                let name = file
33                    .get("FileName")
34                    .and_then(|f| f.as_str())
35                    .unwrap_or("Unknown");
36                let size_str = file
37                    .get("FileLength")
38                    .and_then(|s| s.as_str())
39                    .unwrap_or("0");
40                let size = u64::from_str_radix(size_str.trim_start_matches("0x"), 16).unwrap_or(0);
41                let begin = file
42                    .get("BeginTime")
43                    .and_then(|t| t.as_str())
44                    .unwrap_or("?");
45
46                println!(
47                    "{}. {} ({:?} MB) - Start: {}",
48                    i + 1,
49                    name,
50                    size as f64 / 1024.0,
51                    begin
52                );
53
54                if i == 0 {
55                    let target = "downloaded_video.h265";
56                    println!(
57                        "Downloading first file to '{}' (this may take time)...",
58                        target
59                    );
60
61                    match cam.download_file(start_time, end_time, name, target).await {
62                        Ok(_) => println!("Download complete! saved to {}", target),
63                        Err(e) => eprintln!("Download failed: {}", e),
64                    }
65                }
66            }
67        }
68        Err(e) => eprintln!("Error listing files: {}", e),
69    }
70
71    cam.close().await?;
72    Ok(())
73}