use axum::extract::State; use axum::{routing, routing::get, Router}; use axum_template::{engine::Engine, Key, RenderHtml}; use minijinja::{path_loader, Environment}; use state::{AppState, TemplateEngine}; use log::info; use serde::{Deserialize, Serialize}; use std::env; use std::{ net::SocketAddr, sync::{Arc, Mutex}, thread, }; use tokio::sync::mpsc; use dotenvy::dotenv; use vbplay::{example_handler, AudioThread, DeviceSelection, PlaybackAction, SoundDecoder}; mod handlers; mod server; mod soundclips; mod state; mod ui; mod vbplay; #[tokio::main] async fn main() { dotenv().ok(); let device_pattern = env::var("DEVICE_PATTERN").expect("Need a device pattern"); let folder = env::var("DIRECTORY").expect("Need a directory in env file."); let mut jinja = Environment::new(); jinja.set_loader(path_loader("templates")); let template_engine = Engine::from(jinja); let mut audio = vbplay::AudioHandler::new( DeviceSelection::FindByPattern(device_pattern), SoundDecoder::Detect, ); let event_handler = Box::new(example_handler::PressMouseForward::new()); audio.on_playback(event_handler); let audio = Arc::new(Mutex::new(audio)); let server_settings = Arc::new(Mutex::new(server::ServerSettings { port: "3000".to_string(), })); let should_run = Arc::new(Mutex::new(true)); let app_state = AppState { engine: template_engine, clips: soundclips::scan_directory_for_clips(&folder, &["mp3", "ogg", "wav", "flac"]) .expect("No Soundclips found."), player: audio.clone(), playback: None, settings: server_settings.clone(), should_run: should_run.clone(), }; let (ui_to_server_tx, ui_to_server_rx) = mpsc::channel(32); // Run the server in a separate thread let server_thread = thread::spawn(move || { let rt = tokio::runtime::Runtime::new().unwrap(); rt.block_on(async { server::run_server(app_state, ui_to_server_rx).await; }); }); // Run the UI on the main thread ui::run_ui(server_settings, should_run, ui_to_server_tx); // Wait for the server thread to finish server_thread.join().unwrap(); audio.lock().unwrap().exit(); eprintln!("Reached end of program."); }