unifi_protect/api/
fetch_cameras.rs

1use crate::{UnifiProtectCamera, UnifiProtectServer};
2use reqwest::Client;
3use crate::camera::UnifiProtectCameraSimple;
4
5impl UnifiProtectServer {
6    pub async fn fetch_cameras(&mut self, require_detailed_cameras : bool) -> Result<(), String> {
7        let response = Client::builder()
8            .danger_accept_invalid_certs(true)
9            .build()
10            .unwrap()
11            .get(&(self.uri.to_string() + "/proxy/protect/api/cameras"))
12            .headers(self.headers.clone())
13            .send()
14            .await
15            .expect("Failed to make fetch cameras request");
16
17        // Something went wrong with the login call, possibly a controller reboot or failure.
18        if !response.status().is_success() {
19            println!("Failed to fetch cameras: {}", response.status());
20            return Err(String::from("Failed to make cameras request!"));
21        }
22
23        // fetch the raw JSON text
24        let cameras_raw_text = response.text().await;
25        if cameras_raw_text.is_err() {
26            return Err(format!("Failed to parse camera-data: {}", cameras_raw_text.err().unwrap().to_string()));
27        }
28
29        // attempt to parse the most basic camera data
30        let parsed_cameras_simple_result = serde_json::from_str::<Vec<UnifiProtectCameraSimple>>(cameras_raw_text.as_ref().unwrap());
31        if parsed_cameras_simple_result.is_err() {
32            return Err(format!("Failed to parse camera-data: {}", parsed_cameras_simple_result.err().unwrap().to_string()));
33        }
34        self.cameras_simple = parsed_cameras_simple_result.unwrap();
35
36        // attempt to parse complete camera data
37        let parsed_cameras_result = serde_json::from_str::<Vec<UnifiProtectCamera>>(cameras_raw_text.as_ref().unwrap());
38        if !parsed_cameras_result.is_err() {
39            self.cameras = parsed_cameras_result.unwrap();
40        }else if require_detailed_cameras {
41            return Err(format!("Failed to parse camera-data: {}", parsed_cameras_result.err().unwrap().to_string()));
42        }else{
43            println!("Warning: Unable to parse complete set of camera data - data formats dont match");
44        }
45
46        Ok(())
47    }
48}