libminau 0.1.0

A library version of Minau, a music player built directly on top of Symphonia and CPAL.
Documentation
#![doc = "libminau - A flexible audio playback library"]
#![allow(unused)]

mod display_image;
mod display_info;
mod m3u;
mod play_url;

pub mod player;
pub mod error;

pub use player::{
    Player,
    LocalPlayer,
    StreamPlayer,
    PlaybackState,
};
pub use player::metadata::MetaData;
pub use error::{Error, Result};

pub use m3u::Playlist;


#[cfg(test)]
mod examples {
    use std::time::Duration;

    use async_compat::CompatExt;

    use super::*;

    #[test]
    fn local_playback() -> crate::Result<()> {
        let mut player = LocalPlayer::new("/home/konoha/Music/Music/Take Me There.mp3")?;
        
        // Get metadata
        let metadata = player.metadata();
        println!("Title: {:?}", metadata.title());
        println!("Artist: {:?}", metadata.artist());
        
        // Play
        player.play()?;
        player.set_volume(0.5)?;
        
        std::thread::sleep(std::time::Duration::from_secs(5));
        
        // Seek
        player.seek(std::time::Duration::from_secs(30))?;
        
        std::thread::sleep(std::time::Duration::from_secs(5));

        // Stop
        player.pause()?;
        
        Ok(())
    }

    async fn streaming_playback() -> crate::Result<()> {
        let player = StreamPlayer::new("https://kathy.torontocast.com:3330/", 0.8).await?;
        
        smol::block_on(async {
            smol::Timer::after(Duration::from_secs(10)).await;
        });
        
        player.pause();
        println!("Downloaded: {:.2} MB", player.downloaded_mb());
        
        Ok(())
    }

    #[test]
    fn playlist_usage() -> crate::Result<()> {
        let playlist = Playlist::from_file("/home/konoha/Music/MusicList/chill.m3u8")
            .unwrap();
        
        for entry in playlist.entries() {
            println!("Playing: {:?}", entry.title);
            if entry.path.starts_with("http://") || entry.path.starts_with("https://") {
                smol::block_on(async {
                    let mut player = Player::from_url(&entry.path, 1.0).compat().await.unwrap();
                    player.play().unwrap();
                    // player.wait_until_finished().await;
                    smol::Timer::after(Duration::from_secs(10)).await;
                });
                continue;
            } else {
                smol::block_on(async {
                    let mut player = Player::from_file(&entry.path).unwrap();
                    player.play().unwrap();
                    // player.wait_until_finished().await;
                    smol::Timer::after(Duration::from_secs(10)).await;
                });
                continue;
            }

        }
        
        Ok(())
    }

    fn unified_player() -> crate::Result<()> {
        // local file
        let mut player = Player::from_file("music.mp3")?;
        player.set_volume(0.7)?;

        player.play().unwrap();
        smol::block_on(player.wait_until_finished());
        
        // Streaming
        smol::block_on(async {
            let player = Player::from_url("https://example.com/stream.mp3", 0.7).await.expect("Failed to stream url music");
            player.pause().expect("Failed to stop music");
        });
        
        Ok(())
    }
}