recordings_manager/
recordings_manager.rs1use 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}