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