feat: basic music backend

This commit is contained in:
2024-11-24 00:10:56 +01:00
commit 51a57ebd40
23 changed files with 4091 additions and 0 deletions

71
src/main.rs Normal file
View File

@@ -0,0 +1,71 @@
use covers::create_cover_server;
use database::{establish_connection, initialize_database};
use library::LibraryService;
use music::player::AudioPlayer;
use player::PlayerService;
use proto::library_server::LibraryServer;
use proto::player_server::PlayerServer;
use proto::settings_server::SettingsServer;
use rodio::{OutputStream, Sink};
use state::{GrooveState, GrooveStateData};
use tokio::sync::RwLock;
use tonic::transport::Server;
pub mod checksum;
pub mod covers;
pub mod database;
pub mod library;
pub mod music;
pub mod player;
pub mod settings;
pub mod state;
use settings::SettingsService;
pub mod proto {
tonic::include_proto!("settings");
tonic::include_proto!("library");
tonic::include_proto!("player");
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let pool = &mut establish_connection();
let connection = pool.get().unwrap();
initialize_database(&connection).expect("Error initializing database");
let address = "[::1]:39993".parse()?;
let (_stream, stream_handle) =
OutputStream::try_default().expect("Error getting audio output stream");
let sink = Sink::try_new(&stream_handle).expect("Error getting audio sink");
let player = AudioPlayer::new(sink);
let state = GrooveState::new(RwLock::new(GrooveStateData::new(player)));
let settings = SettingsService::new(state.clone(), pool.clone());
let library = LibraryService::new(state.clone(), pool.clone());
let player_service = PlayerService::new(state, pool.clone());
let cover_server_handle = tokio::spawn(async move {
create_cover_server()
.await
.expect("Error creating cover server");
});
Server::builder()
.accept_http1(true)
.layer(tower_http::cors::CorsLayer::permissive())
.add_service(tonic_web::enable(SettingsServer::new(settings)))
.add_service(tonic_web::enable(LibraryServer::new(library)))
.add_service(tonic_web::enable(PlayerServer::new(player_service)))
.serve(address)
.await?;
let _ = cover_server_handle.await;
Ok(())
}