From 4a4c5b9174cf0182d4eb755f5d97ca432e5960ca Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Fri, 31 May 2024 14:59:25 +0200 Subject: Add multiple backend support --- src/audio/mod.rs | 25 +++++++++++++++++++++++++ src/audio/mpv.rs | 13 +++++++++++++ src/audio/rodio.rs | 9 +++++++++ src/main.rs | 10 ++++------ src/mpv.rs | 0 5 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 src/audio/mod.rs create mode 100644 src/audio/mpv.rs create mode 100644 src/audio/rodio.rs create mode 100644 src/mpv.rs (limited to 'src') diff --git a/src/audio/mod.rs b/src/audio/mod.rs new file mode 100644 index 0000000..7fca1a7 --- /dev/null +++ b/src/audio/mod.rs @@ -0,0 +1,25 @@ +mod mpv; +mod rodio; + +pub trait AudioBackend { + fn play(&self, url: &str); +} + +#[allow(dead_code)] +pub enum AudioBackends { + Mpv(mpv::Mpv), + Rodio(rodio::Rodio), +} + +pub fn get_backend() -> AudioBackends { + AudioBackends::Mpv(mpv::Mpv {}) +} + +impl AudioBackend for AudioBackends { + fn play(&self, url: &str) { + match self { + AudioBackends::Mpv(m) => m.play(url), + AudioBackends::Rodio(r) => r.play(url), + } + } +} diff --git a/src/audio/mpv.rs b/src/audio/mpv.rs new file mode 100644 index 0000000..dddb6b2 --- /dev/null +++ b/src/audio/mpv.rs @@ -0,0 +1,13 @@ +use super::AudioBackend; +use std::process::Command; + +pub struct Mpv {} + +impl AudioBackend for Mpv { + fn play(&self, url: &str) { + Command::new("mpv") + .args([url]) + .output() + .expect("Failed to start mpv, make sure it is installed."); + } +} diff --git a/src/audio/rodio.rs b/src/audio/rodio.rs new file mode 100644 index 0000000..04883dd --- /dev/null +++ b/src/audio/rodio.rs @@ -0,0 +1,9 @@ +use super::AudioBackend; + +pub struct Rodio {} + +impl AudioBackend for Rodio { + fn play(&self, _url: &str) { + todo!() + } +} diff --git a/src/main.rs b/src/main.rs index aa9f938..e18b909 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,9 @@ use crate::channels::Channel; +use audio::AudioBackend; use inquire::{InquireError, Select}; use spinners::{Spinner, Spinners}; -use std::process::Command; +mod audio; mod channels; fn main() { @@ -15,12 +16,9 @@ fn main() { match ans { Ok(ch) => { - let _sp = Spinner::new(Spinners::Arrow3, format!("Playing {}", ch)); + let _sp = Spinner::new(Spinners::Arrow3, format!("Playing {}", ch.title)); let url = format!("https://api.somafm.com/{}.pls", ch.id); - Command::new("mpv") - .args([url]) - .output() - .expect("Failed to start mpv, make sure it is installed."); + audio::get_backend().play(&url); } Err(_e) => { println!("\nNo channel selected, exiting."); diff --git a/src/mpv.rs b/src/mpv.rs new file mode 100644 index 0000000..e69de29 -- cgit v1.3.1