79 lines
2.3 KiB
Rust
79 lines
2.3 KiB
Rust
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.");
|
|
}
|