From 075a13c8a5509dfaa8cc5aa814ea1673ec2e0d82 Mon Sep 17 00:00:00 2001 From: Tsiry Sandratraina Date: Sat, 25 Jan 2025 10:21:01 +0300 Subject: [PATCH] feat(radiobrowser): use a provider for searching radio stations --- src/main.rs | 6 ++++-- src/play.rs | 14 +++++++++++++- src/search.rs | 39 +++++++++++++++++++++------------------ src/types.rs | 2 +- 4 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index ef74566..75c9255 100644 --- a/src/main.rs +++ b/src/main.rs @@ -67,11 +67,13 @@ async fn main() -> Result<(), Error> { match matches.subcommand() { Some(("search", args)) => { let query = args.value_of("query").unwrap(); - search::exec(query).await?; + let provider = matches.value_of("provider").unwrap(); + search::exec(query, provider).await?; } Some(("play", args)) => { let station = args.value_of("station").unwrap(); - play::exec(station).await?; + let provider = matches.value_of("provider").unwrap(); + play::exec(station, provider).await?; } Some(("browse", args)) => { let category = args.value_of("category"); diff --git a/src/play.rs b/src/play.rs index 05e36ab..223d9c9 100644 --- a/src/play.rs +++ b/src/play.rs @@ -9,10 +9,22 @@ use crate::{ cfg::{SourceOptions, UiOptions}, decoder::Mp3Decoder, extract::{extract_stream_url, get_currently_playing}, + provider::{radiobrowser::Radiobrowser, tunein::Tunein, Provider}, tui, }; -pub async fn exec(name_or_id: &str) -> Result<(), Error> { +pub async fn exec(name_or_id: &str, provider: &str) -> Result<(), Error> { + let provider: Box = match provider { + "tunein" => Box::new(Tunein::new()), + "radiobrowser" => Box::new(Radiobrowser::new().await), + _ => { + return Err(anyhow::anyhow!(format!( + "Unsupported provider '{}'", + provider + ))) + } + }; + let client = TuneInClient::new(); let results = client .get_station(name_or_id) diff --git a/src/search.rs b/src/search.rs index 2f7d7aa..5a58870 100644 --- a/src/search.rs +++ b/src/search.rs @@ -1,34 +1,37 @@ use anyhow::Error; use owo_colors::OwoColorize; -use tunein::TuneInClient; -pub async fn exec(query: &str) -> Result<(), Error> { - let client = TuneInClient::new(); - let results = client - .search(query) - .await - .map_err(|e| Error::msg(e.to_string()))?; +use crate::provider::{radiobrowser::Radiobrowser, tunein::Tunein, Provider}; + +pub async fn exec(query: &str, provider: &str) -> Result<(), Error> { + let provider: Box = match provider { + "tunein" => Box::new(Tunein::new()), + "radiobrowser" => Box::new(Radiobrowser::new().await), + _ => { + return Err(anyhow::anyhow!(format!( + "Unsupported provider '{}'", + provider + ))) + } + }; + let results = provider.search(query.to_string()).await?; let query = format!("\"{}\"", query); println!("Results for {}:", query.bright_green()); - let results = results - .into_iter() - .filter(|r| Some("audio".to_string()) == r.r#type) - .collect::>(); - if results.is_empty() { println!("No results found"); return Ok(()); } for result in results { - if Some("audio".to_string()) == result.r#type { - println!( + match result.playing { + Some(playing) => println!( "{} | {} | id: {}", - result.text.magenta(), - result.subtext.unwrap_or_default(), - result.guide_id.unwrap() - ); + result.name.magenta(), + playing, + result.id + ), + None => println!("{} | id: {}", result.name.magenta(), result.id), } } Ok(()) diff --git a/src/types.rs b/src/types.rs index d592d4d..ad0a661 100644 --- a/src/types.rs +++ b/src/types.rs @@ -36,7 +36,7 @@ impl From for Station { .unwrap_or_default(), codec: Default::default(), stream_url: Default::default(), - playing: None, + playing: result.subtext, } } } -- 2.51.2