diff options
| author | Yuval Adam <_@yuv.al> | 2024-05-31 15:12:23 +0200 |
|---|---|---|
| committer | Yuval Adam <_@yuv.al> | 2024-05-31 15:12:23 +0200 |
| commit | 948c1f212cab5d56e82e47fd8ff10f20ecbf847f (patch) | |
| tree | ab51c037c623c64422f4de2fd0a99120770c8ca0 /src | |
| parent | 4a4c5b9174cf0182d4eb755f5d97ca432e5960ca (diff) | |
Initial attempt doesn't work
Diffstat (limited to 'src')
| -rw-r--r-- | src/audio/mod.rs | 15 | ||||
| -rw-r--r-- | src/audio/mpv.rs | 5 | ||||
| -rw-r--r-- | src/audio/rodio.rs | 23 | ||||
| -rw-r--r-- | src/channels.rs | 4 | ||||
| -rw-r--r-- | src/main.rs | 8 |
5 files changed, 33 insertions, 22 deletions
diff --git a/src/audio/mod.rs b/src/audio/mod.rs index 7fca1a7..5aae19a 100644 --- a/src/audio/mod.rs +++ b/src/audio/mod.rs @@ -1,10 +1,6 @@ mod mpv; mod rodio; -pub trait AudioBackend { - fn play(&self, url: &str); -} - #[allow(dead_code)] pub enum AudioBackends { Mpv(mpv::Mpv), @@ -12,14 +8,15 @@ pub enum AudioBackends { } pub fn get_backend() -> AudioBackends { - AudioBackends::Mpv(mpv::Mpv {}) + // AudioBackends::Mpv(mpv::Mpv {}) + AudioBackends::Rodio(rodio::Rodio {}) } -impl AudioBackend for AudioBackends { - fn play(&self, url: &str) { +impl AudioBackends { + pub async fn play(&self, url: &str) { match self { - AudioBackends::Mpv(m) => m.play(url), - AudioBackends::Rodio(r) => r.play(url), + AudioBackends::Mpv(m) => m.play(url).await, + AudioBackends::Rodio(r) => r.play(url).await, } } } diff --git a/src/audio/mpv.rs b/src/audio/mpv.rs index dddb6b2..fde2711 100644 --- a/src/audio/mpv.rs +++ b/src/audio/mpv.rs @@ -1,10 +1,9 @@ -use super::AudioBackend; use std::process::Command; pub struct Mpv {} -impl AudioBackend for Mpv { - fn play(&self, url: &str) { +impl Mpv { + pub async fn play(&self, url: &str) { Command::new("mpv") .args([url]) .output() diff --git a/src/audio/rodio.rs b/src/audio/rodio.rs index 04883dd..8262b82 100644 --- a/src/audio/rodio.rs +++ b/src/audio/rodio.rs @@ -1,9 +1,24 @@ -use super::AudioBackend; +use rodio::{Decoder, OutputStream, Sink}; +use stream_download::{storage::temp::TempStorageProvider, Settings, StreamDownload}; pub struct Rodio {} -impl AudioBackend for Rodio { - fn play(&self, _url: &str) { - todo!() +impl Rodio { + pub async fn play(&self, url: &str) { + let reader = StreamDownload::new_http( + url.parse().unwrap(), + TempStorageProvider::new(), + Settings::default(), + ) + .await + .unwrap(); + + let _res = tokio::task::spawn_blocking(move || { + let (_stream, handle) = OutputStream::try_default().unwrap(); + let sink = Sink::try_new(&handle).unwrap(); + sink.append(Decoder::new(reader).unwrap()); + sink.sleep_until_end(); + }) + .await; } } diff --git a/src/channels.rs b/src/channels.rs index b89169f..fdb8844 100644 --- a/src/channels.rs +++ b/src/channels.rs @@ -20,9 +20,9 @@ pub struct Channels { pub channels: Vec<Channel>, } -pub fn get_channels() -> Vec<Channel> { +pub async fn get_channels() -> Vec<Channel> { let url = "https://api.somafm.com/channels.json"; - let res = reqwest::blocking::get(url).unwrap().text().unwrap(); + let res = reqwest::get(url).await.unwrap().text().await.unwrap(); let channels: Channels = serde_json::from_str(&res).unwrap(); channels.channels } diff --git a/src/main.rs b/src/main.rs index e18b909..e7aaaa1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,14 @@ use crate::channels::Channel; -use audio::AudioBackend; use inquire::{InquireError, Select}; use spinners::{Spinner, Spinners}; mod audio; mod channels; -fn main() { +#[tokio::main] +async fn main() { let mut sp = Spinner::new(Spinners::Dots, "Loading SomaFM channels...".into()); - let channels = channels::get_channels(); + let channels = channels::get_channels().await; sp.stop_with_newline(); let ans: Result<Channel, InquireError> = @@ -18,7 +18,7 @@ fn main() { Ok(ch) => { let _sp = Spinner::new(Spinners::Arrow3, format!("Playing {}", ch.title)); let url = format!("https://api.somafm.com/{}.pls", ch.id); - audio::get_backend().play(&url); + audio::get_backend().play(&url).await } Err(_e) => { println!("\nNo channel selected, exiting."); |
