summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2024-05-31 15:12:23 +0200
committerYuval Adam <_@yuv.al>2024-05-31 15:12:23 +0200
commit948c1f212cab5d56e82e47fd8ff10f20ecbf847f (patch)
treeab51c037c623c64422f4de2fd0a99120770c8ca0 /src
parent4a4c5b9174cf0182d4eb755f5d97ca432e5960ca (diff)
Initial attempt doesn't work
Diffstat (limited to 'src')
-rw-r--r--src/audio/mod.rs15
-rw-r--r--src/audio/mpv.rs5
-rw-r--r--src/audio/rodio.rs23
-rw-r--r--src/channels.rs4
-rw-r--r--src/main.rs8
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.");