diff --git a/src/api.rs b/src/api.rs index 6deb1d7..f7fde72 100644 --- a/src/api.rs +++ b/src/api.rs @@ -43,11 +43,29 @@ pub struct RadioBrowserAPI { impl RadioBrowserAPI { /// Create a new instance of a radiobrowser api client. - /// It will fetch a list of radiobrowser server with get_servers() + /// It will fetch a list of radiobrowser server with get_default_servers() /// and save it internally. pub async fn new() -> Result> { Ok(RadioBrowserAPI { - servers: RadioBrowserAPI::get_servers().await?, + servers: RadioBrowserAPI::get_default_servers().await?, + current: 0, + }) + } + + /// Create a new instance of a radiobrowser api client from + /// a single dns name. Use this is you want to connect to a single named server. + pub async fn new_from_dns_a>(dnsname: P) -> Result> { + Ok(RadioBrowserAPI { + servers: vec![dnsname.as_ref().to_string()], + current: 0, + }) + } + + /// Create a new instance of a radiobrowser api client from + /// a dns srv record which may have multiple dns A/AAAA records. + pub async fn new_from_dns_srv>(srvname: P) -> Result> { + Ok(RadioBrowserAPI { + servers: RadioBrowserAPI::get_servers_from_dns_srv(srvname).await?, current: 0, }) } @@ -120,8 +138,13 @@ impl RadioBrowserAPI { post_api(self.get_current_server(), endpoint, mapjson).await } - pub async fn get_servers() -> Result, Box> { - trace!("get_servers()"); + pub async fn get_default_servers() -> Result, Box> { + trace!("get_default_servers()"); + RadioBrowserAPI::get_servers_from_dns_srv("_api._tcp.radio-browser.info").await + } + + async fn get_servers_from_dns_srv>(srvname: P) -> Result, Box> { + trace!("get_servers_from_dns_srv()"); let resolver = resolver( config::ResolverConfig::default(), config::ResolverOpts::default(), @@ -129,7 +152,7 @@ impl RadioBrowserAPI { .await?; let response = resolver .lookup( - "_api._tcp.radio-browser.info", + srvname.as_ref(), RecordType::SRV, ) .await?; diff --git a/src/bin/test.rs b/src/bin/test.rs index 0baf42d..70fa879 100644 --- a/src/bin/test.rs +++ b/src/bin/test.rs @@ -3,7 +3,7 @@ use std::error::Error; fn main() -> Result<(), Box> { let mut api = RadioBrowserAPI::new()?; - let servers = RadioBrowserAPI::get_servers()?; + let servers = RadioBrowserAPI::get_default_servers()?; println!("Servers: {:?}", servers); let status = api.get_server_status()?; println!("Status: {:#?}", status); diff --git a/src/blocking/api.rs b/src/blocking/api.rs index 4d54229..9340c96 100644 --- a/src/blocking/api.rs +++ b/src/blocking/api.rs @@ -25,6 +25,16 @@ impl RadioBrowserAPI { .map(|api| RadioBrowserAPI { api }) } + pub fn new_from_dns_a>(dnsname: P) -> Result> { + task::block_on(async { crate::RadioBrowserAPI::new_from_dns_a(dnsname).await }) + .map(|api| RadioBrowserAPI { api }) + } + + pub fn new_from_dns_srv>(srvname: P) -> Result> { + task::block_on(async { crate::RadioBrowserAPI::new_from_dns_srv(srvname).await }) + .map(|api| RadioBrowserAPI { api }) + } + pub fn get_server_status(&mut self) -> Result> { task::block_on(async { self.api.get_server_status().await }) } @@ -71,7 +81,7 @@ impl RadioBrowserAPI { task::block_on(async { self.api.send(endpoint, mapjson).await }) } - pub fn get_servers() -> Result, Box> { - task::block_on(async { crate::RadioBrowserAPI::get_servers().await }) + pub fn get_default_servers() -> Result, Box> { + task::block_on(async { crate::RadioBrowserAPI::get_default_servers().await }) } }