feat: basic music backend
This commit is contained in:
66
src/player.rs
Normal file
66
src/player.rs
Normal file
@@ -0,0 +1,66 @@
|
||||
use r2d2::Pool;
|
||||
use r2d2_sqlite::SqliteConnectionManager;
|
||||
|
||||
use crate::{
|
||||
database::tracks::get_track_full_path, proto::{player_server::Player, PlayTrackRequest, PlayTrackResponse}, state::GrooveState
|
||||
};
|
||||
|
||||
pub struct PlayerService {
|
||||
state: GrooveState,
|
||||
pool: Pool<SqliteConnectionManager>,
|
||||
}
|
||||
|
||||
impl PlayerService {
|
||||
pub fn new(state: GrooveState, pool: Pool<SqliteConnectionManager>) -> Self {
|
||||
Self { state, pool }
|
||||
}
|
||||
}
|
||||
|
||||
#[tonic::async_trait]
|
||||
impl Player for PlayerService {
|
||||
async fn play_track(
|
||||
&self,
|
||||
request: tonic::Request<PlayTrackRequest>,
|
||||
) -> Result<tonic::Response<PlayTrackResponse>, tonic::Status> {
|
||||
let Ok(db) = self.pool.get() else {
|
||||
return Err(tonic::Status::internal(""));
|
||||
};
|
||||
|
||||
let input = request.get_ref();
|
||||
|
||||
let Ok(track_path) = get_track_full_path(&db, input.hash.as_str()) else {
|
||||
return Err(tonic::Status::not_found(""));
|
||||
};
|
||||
|
||||
let mut state = self.state.write().await;
|
||||
|
||||
let _ = state.player.play_song(track_path);
|
||||
|
||||
let response = PlayTrackResponse {
|
||||
};
|
||||
|
||||
Ok(tonic::Response::new(response))
|
||||
}
|
||||
|
||||
async fn resume_track(
|
||||
&self,
|
||||
_request: tonic::Request<()>,
|
||||
) -> Result<tonic::Response<()>, tonic::Status> {
|
||||
let mut state = self.state.write().await;
|
||||
|
||||
state.player.resume();
|
||||
|
||||
Ok(tonic::Response::new(()))
|
||||
}
|
||||
|
||||
async fn pause_track(
|
||||
&self,
|
||||
_request: tonic::Request<()>,
|
||||
) -> Result<tonic::Response<()>, tonic::Status> {
|
||||
let mut state = self.state.write().await;
|
||||
|
||||
state.player.pause();
|
||||
|
||||
Ok(tonic::Response::new(()))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user