rust_mediamtx_http_api/
lib.rs

1use reqwest::header::HeaderMap;
2use url::Url;
3pub mod structs;
4#[cfg(test)]
5mod tests;
6
7#[derive(Clone, Debug)]
8pub struct MediamtxHttpClient {
9    client: simplerusthttpsclient::HttpClient,
10}
11
12impl MediamtxHttpClient {
13    #[cfg(feature = "tls")]
14
15    pub fn new(
16        base_url: Url,
17        tls_config: Option<simplerusthttpsclient::TlsConfig>,
18        default_headers: Option<HeaderMap>,
19    ) -> Self {
20        Self {
21            client: simplerusthttpsclient::HttpClient::new(base_url, tls_config, default_headers),
22        }
23    }
24    #[cfg(not(feature = "tls"))]
25
26    pub fn new(base_url: Url, default_headers: Option<HeaderMap>) -> Self {
27        Self {
28            client: simplerusthttpsclient::HttpClient::new(base_url, default_headers),
29        }
30    }
31    pub async fn get_global_config(&self) -> anyhow::Result<structs::TMediaMTXGlobalConfig> {
32        let url = "/v3/config/global/get";
33        let obj: structs::TMediaMTXGlobalConfig = self.client.get(url, None).await?;
34        Ok(obj)
35    }
36    pub async fn patch_global_config(
37        &self,
38        data: structs::TMediaMTXGlobalConfig,
39    ) -> anyhow::Result<()> {
40        let url = "/v3/config/global/patch";
41        self.client.patch(url, &data, None).await?;
42        Ok(())
43    }
44    pub async fn get_default_path(&self) -> anyhow::Result<structs::TMediaMTXGetDefaultPath> {
45        let url = "/v3/config/pathdefaults/get";
46        let obj: structs::TMediaMTXGetDefaultPath = self.client.get(url, None).await?;
47        Ok(obj)
48    }
49    pub async fn patch_default_path(
50        &self,
51        data: structs::TMediaMTXPatchDefaultPath,
52    ) -> anyhow::Result<()> {
53        let url = "/v3/config/pathdefaults/patch";
54        self.client.patch(url, &data, None).await?;
55        Ok(())
56    }
57    pub async fn get_paths_configs(&self) -> anyhow::Result<structs::MediaMTXPathsConfigs> {
58        let url = "/v3/config/paths/list";
59        let obj: structs::MediaMTXPathsConfigs = self.client.get(url, None).await?;
60        Ok(obj)
61    }
62    pub async fn get_path_config(
63        &self,
64        path_name: &str,
65    ) -> anyhow::Result<structs::TMediaMTXGetDefaultPath> {
66        let url = String::from("/v3/config/paths/get/") + path_name;
67        let obj: structs::TMediaMTXGetDefaultPath = self.client.get(&url, None).await?;
68        Ok(obj)
69    }
70    pub async fn add_path(&self, path_config: structs::TMediaMTXAddPath) -> anyhow::Result<()> {
71        let url = String::from("/v3/config/paths/add/") + path_config.name.as_str();
72        self.client.post(&url, &path_config, None).await?;
73        Ok(())
74    }
75    pub async fn patch_path(&self, path_config: structs::TMediaMTXAddPath) -> anyhow::Result<()> {
76        let url = String::from("/v3/config/paths/patch/") + path_config.name.as_str();
77        self.client.patch(&url, &path_config, None).await?;
78        Ok(())
79    }
80    pub async fn replace_path(&self, path_config: structs::TMediaMTXAddPath) -> anyhow::Result<()> {
81        let url = String::from("/v3/config/paths/replace/") + path_config.name.as_str();
82        self.client.post(&url, &path_config, None).await?;
83        Ok(())
84    }
85    pub async fn delete_path(&self, path_name: &str) -> anyhow::Result<()> {
86        let url = String::from("/v3/config/paths/delete/") + path_name;
87        self.client.delete(&url, None).await?;
88        Ok(())
89    }
90    pub async fn get_paths_status(&self) -> anyhow::Result<structs::MediaMTXPathsStatusList> {
91        let url = "/v3/paths/list";
92        let obj: structs::MediaMTXPathsStatusList = self.client.get(url, None).await?;
93        Ok(obj)
94    }
95    pub async fn get_path_status(
96        &self,
97        path_name: &str,
98    ) -> anyhow::Result<structs::MediaMTXPathStatus> {
99        let url = String::from("/v3/paths/get/") + path_name;
100        let obj: structs::MediaMTXPathStatus = self.client.get(&url, None).await?;
101        Ok(obj)
102    }
103
104    pub async fn sync_paths(
105        &self,
106        paths: Vec<structs::TMediaMTXAddPath>,
107        remove_unused: bool,
108    ) -> anyhow::Result<()> {
109        let current_paths = self.get_paths_configs().await?;
110        for path in paths.clone() {
111            let get_path = self.get_path_config(&path.name).await;
112            if let Err(e) = get_path {
113                println!("Adding path: {}", path.name);
114                self.add_path(path).await?;
115            }
116        }
117        if remove_unused {
118            for path in current_paths.items {
119                if paths.iter().any(|p| p.name == path.name) {
120                    continue;
121                }
122                println!("Deleting path: {}", path.name);
123                self.delete_path(&path.name).await?;
124            }
125        }
126
127        Ok(())
128    }
129}