summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: 4cee4d14a10349ddc21651ebedd953031bae1c2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use crate::channels::Channel;
use channels::get_stream_url;
use inquire::{InquireError, Select};
use spinners::{Spinner, Spinners};
use tokio::sync::mpsc;

mod audio;
mod channels;

#[tokio::main]
async fn main() {
    let mut sp = Spinner::new(Spinners::Dots, "Loading SomaFM channels...".into());
    let channels = channels::get_channels().await;
    sp.stop_with_newline();

    let ans: Result<Channel, InquireError> =
        Select::new("Select channel from list:", channels).prompt();

    let (tx, mut rx) = mpsc::unbounded_channel();

    match ans {
        Ok(ch) => {
            let mut sp = Spinner::new(Spinners::Dots, "Fetching channel streams...".into());
            let playlist = ch.get_playlist();
            let url = get_stream_url(&playlist).await.unwrap();
            sp.stop_with_newline();

            sp = Spinner::new(Spinners::Arrow3, format!("Playing {}", ch.title));
            tokio::spawn(async move {
                while let Some(title) = rx.recv().await {
                    sp.stop_with_newline();
                    sp = Spinner::new(Spinners::Arrow3, title);
                }
            });
            audio::get_backend().play(&url, tx).await
        }
        Err(_e) => {
            println!("\nNo channel selected, exiting.");
        }
    }
}