use reqwest::header::HeaderMap;
use url::Url;
pub mod structs;
#[cfg(test)]
mod tests;
#[derive(Clone, Debug)]
pub struct MediamtxHttpClient {
client: simplerusthttpsclient::HttpClient,
}
impl MediamtxHttpClient {
#[cfg(feature = "tls")]
pub fn new(
base_url: Url,
tls_config: Option<simplerusthttpsclient::TlsConfig>,
default_headers: Option<HeaderMap>,
) -> Self {
Self {
client: simplerusthttpsclient::HttpClient::new(base_url, tls_config, default_headers),
}
}
#[cfg(not(feature = "tls"))]
pub fn new(base_url: Url, default_headers: Option<HeaderMap>) -> Self {
Self {
client: simplerusthttpsclient::HttpClient::new(base_url, default_headers),
}
}
pub async fn get_global_config(&self) -> anyhow::Result<structs::TMediaMTXGlobalConfig> {
let url = "/v3/config/global/get";
let obj: structs::TMediaMTXGlobalConfig = self.client.get(url, None).await?;
Ok(obj)
}
pub async fn patch_global_config(
&self,
data: structs::TMediaMTXGlobalConfig,
) -> anyhow::Result<()> {
let url = "/v3/config/global/patch";
self.client.patch(url, &data, None).await?;
Ok(())
}
pub async fn get_default_path(&self) -> anyhow::Result<structs::TMediaMTXGetDefaultPath> {
let url = "/v3/config/pathdefaults/get";
let obj: structs::TMediaMTXGetDefaultPath = self.client.get(url, None).await?;
Ok(obj)
}
pub async fn patch_default_path(
&self,
data: structs::TMediaMTXPatchDefaultPath,
) -> anyhow::Result<()> {
let url = "/v3/config/pathdefaults/patch";
self.client.patch(url, &data, None).await?;
Ok(())
}
pub async fn get_paths_configs(&self) -> anyhow::Result<structs::MediaMTXPathsConfigs> {
let url = "/v3/config/paths/list";
let obj: structs::MediaMTXPathsConfigs = self.client.get(url, None).await?;
Ok(obj)
}
pub async fn get_path_config(
&self,
path_name: &str,
) -> anyhow::Result<structs::TMediaMTXGetDefaultPath> {
let url = String::from("/v3/config/paths/get/") + path_name;
let obj: structs::TMediaMTXGetDefaultPath = self.client.get(&url, None).await?;
Ok(obj)
}
pub async fn add_path(&self, path_config: structs::TMediaMTXAddPath) -> anyhow::Result<()> {
let url = String::from("/v3/config/paths/add/") + path_config.name.as_str();
self.client.post(&url, &path_config, None).await?;
Ok(())
}
pub async fn patch_path(&self, path_config: structs::TMediaMTXAddPath) -> anyhow::Result<()> {
let url = String::from("/v3/config/paths/patch/") + path_config.name.as_str();
self.client.patch(&url, &path_config, None).await?;
Ok(())
}
pub async fn replace_path(&self, path_config: structs::TMediaMTXAddPath) -> anyhow::Result<()> {
let url = String::from("/v3/config/paths/replace/") + path_config.name.as_str();
self.client.post(&url, &path_config, None).await?;
Ok(())
}
pub async fn delete_path(&self, path_name: &str) -> anyhow::Result<()> {
let url = String::from("/v3/config/paths/delete/") + path_name;
self.client.delete(&url, None).await?;
Ok(())
}
pub async fn get_paths_status(&self) -> anyhow::Result<structs::MediaMTXPathsStatusList> {
let url = "/v3/paths/list";
let obj: structs::MediaMTXPathsStatusList = self.client.get(url, None).await?;
Ok(obj)
}
pub async fn get_path_status(
&self,
path_name: &str,
) -> anyhow::Result<structs::MediaMTXPathStatus> {
let url = String::from("/v3/paths/get/") + path_name;
let obj: structs::MediaMTXPathStatus = self.client.get(&url, None).await?;
Ok(obj)
}
pub async fn sync_paths(
&self,
paths: Vec<structs::TMediaMTXAddPath>,
remove_unused: bool,
) -> anyhow::Result<()> {
let current_paths = self.get_paths_configs().await?;
for path in paths.clone() {
let get_path = self.get_path_config(&path.name).await;
if let Err(e) = get_path {
println!("Adding path: {}", path.name);
self.add_path(path).await?;
}
}
if remove_unused {
for path in current_paths.items {
if paths.iter().any(|p| p.name == path.name) {
continue;
}
println!("Deleting path: {}", path.name);
self.delete_path(&path.name).await?;
}
}
Ok(())
}
}