Implement init on the server
This commit is contained in:
parent
d1bd0adf4f
commit
4fbeccdde1
|
|
@ -35,7 +35,7 @@ message InitResponse {
|
||||||
Queue queue = 1;
|
Queue queue = 1;
|
||||||
QueueTrack queue_track = 2;
|
QueueTrack queue_track = 2;
|
||||||
PlayState play_state = 3;
|
PlayState play_state = 3;
|
||||||
uint32 volume = 4;
|
float volume = 4;
|
||||||
bool mute = 5;
|
bool mute = 5;
|
||||||
TrackPosition position = 6;
|
TrackPosition position = 6;
|
||||||
}
|
}
|
||||||
|
|
@ -92,7 +92,7 @@ message GetUpdateStreamResponse {
|
||||||
Queue queue = 1;
|
Queue queue = 1;
|
||||||
QueueTrack queue_track = 2;
|
QueueTrack queue_track = 2;
|
||||||
PlayState play_state = 3;
|
PlayState play_state = 3;
|
||||||
uint32 volume = 4;
|
float volume = 4;
|
||||||
bool mute = 5;
|
bool mute = 5;
|
||||||
TrackPosition position = 6;
|
TrackPosition position = 6;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ pub enum QueueError {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Queue {
|
impl Queue {
|
||||||
pub fn current(&mut self) -> Option<Track> {
|
pub fn current(&self) -> Option<Track> {
|
||||||
if self.current_position < self.tracks.len() as u32 {
|
if self.current_position < self.tracks.len() as u32 {
|
||||||
Some(self.tracks[self.current_position as usize].clone())
|
Some(self.tracks[self.current_position as usize].clone())
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ use crabidy_core::proto::crabidy::{
|
||||||
RestartTrackRequest, RestartTrackResponse, SaveQueueRequest, SaveQueueResponse,
|
RestartTrackRequest, RestartTrackResponse, SaveQueueRequest, SaveQueueResponse,
|
||||||
SetCurrentRequest, SetCurrentResponse, StopRequest, StopResponse, ToggleMuteRequest,
|
SetCurrentRequest, SetCurrentResponse, StopRequest, StopResponse, ToggleMuteRequest,
|
||||||
ToggleMuteResponse, TogglePlayRequest, TogglePlayResponse, ToggleShuffleRequest,
|
ToggleMuteResponse, TogglePlayRequest, TogglePlayResponse, ToggleShuffleRequest,
|
||||||
ToggleShuffleResponse, Track,
|
ToggleShuffleResponse, Track, TrackPosition,
|
||||||
};
|
};
|
||||||
use crabidy_core::{ProviderClient, ProviderError};
|
use crabidy_core::{ProviderClient, ProviderError};
|
||||||
use futures::TryStreamExt;
|
use futures::TryStreamExt;
|
||||||
|
|
@ -149,24 +149,14 @@ impl ProviderOrchestrator {
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl ProviderClient for ProviderOrchestrator {
|
impl ProviderClient for ProviderOrchestrator {
|
||||||
async fn init(_s: &str) -> Result<Self, ProviderError> {
|
async fn init(_s: &str) -> Result<Self, ProviderError> {
|
||||||
let state = Mutex::new(PlayState::Stopped);
|
|
||||||
let queue = Mutex::new(Queue {
|
|
||||||
timestamp: 0,
|
|
||||||
current_position: 0,
|
|
||||||
tracks: Vec::new(),
|
|
||||||
});
|
|
||||||
let raw_toml_settings = fs::read_to_string("/tmp/tidaldy.toml").unwrap_or("".to_owned());
|
let raw_toml_settings = fs::read_to_string("/tmp/tidaldy.toml").unwrap_or("".to_owned());
|
||||||
let tidal_client = Arc::new(tidaldy::Client::init(&raw_toml_settings).await.unwrap());
|
let tidal_client = Arc::new(tidaldy::Client::init(&raw_toml_settings).await.unwrap());
|
||||||
let new_toml_config = tidal_client.settings();
|
let new_toml_config = tidal_client.settings();
|
||||||
fs::write("/tmp/tidaldy.toml", new_toml_config).unwrap();
|
fs::write("/tmp/tidaldy.toml", new_toml_config).unwrap();
|
||||||
// let known_tracks = HashMap::new();
|
|
||||||
// let known_nodes = HashMap::new();
|
|
||||||
let (provider_tx, provider_rx) = flume::bounded(100);
|
let (provider_tx, provider_rx) = flume::bounded(100);
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
provider_rx,
|
provider_rx,
|
||||||
provider_tx,
|
provider_tx,
|
||||||
// known_tracks,
|
|
||||||
// known_nodes,
|
|
||||||
tidal_client,
|
tidal_client,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -200,6 +190,9 @@ impl ProviderClient for ProviderOrchestrator {
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum PlaybackMessage {
|
enum PlaybackMessage {
|
||||||
|
Init {
|
||||||
|
result_tx: flume::Sender<InitResponse>,
|
||||||
|
},
|
||||||
Replace {
|
Replace {
|
||||||
uuids: Vec<String>,
|
uuids: Vec<String>,
|
||||||
},
|
},
|
||||||
|
|
@ -237,6 +230,13 @@ enum PlaybackMessage {
|
||||||
StateChanged {
|
StateChanged {
|
||||||
state: GstPlaystate,
|
state: GstPlaystate,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
MuteChanged {
|
||||||
|
muted: bool,
|
||||||
|
},
|
||||||
|
PostitionChanged {
|
||||||
|
position: u32,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -280,6 +280,43 @@ impl Playback {
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
while let Ok(message) = self.playback_rx.recv_async().await {
|
while let Ok(message) = self.playback_rx.recv_async().await {
|
||||||
match message {
|
match message {
|
||||||
|
PlaybackMessage::Init { result_tx } => {
|
||||||
|
let response = {
|
||||||
|
let queue = self.queue.lock().unwrap();
|
||||||
|
let queue_track = QueueTrack {
|
||||||
|
queue_position: queue.current_position,
|
||||||
|
track: queue.current(),
|
||||||
|
};
|
||||||
|
let position = TrackPosition {
|
||||||
|
duration: self
|
||||||
|
.play
|
||||||
|
.duration()
|
||||||
|
.and_then(|t| Some(t.mseconds() as u32))
|
||||||
|
.unwrap_or(0),
|
||||||
|
position: self
|
||||||
|
.play
|
||||||
|
.position()
|
||||||
|
.and_then(|t| Some(t.mseconds() as u32))
|
||||||
|
.unwrap_or(0),
|
||||||
|
};
|
||||||
|
let play_state = match *self.state.lock().unwrap() {
|
||||||
|
GstPlaystate::Playing => PlayState::Playing,
|
||||||
|
GstPlaystate::Paused => PlayState::Paused,
|
||||||
|
GstPlaystate::Stopped => PlayState::Stopped,
|
||||||
|
GstPlaystate::Buffering => PlayState::Loading,
|
||||||
|
_ => PlayState::Unspecified,
|
||||||
|
};
|
||||||
|
InitResponse {
|
||||||
|
queue: Some(queue.clone()),
|
||||||
|
queue_track: Some(queue_track),
|
||||||
|
play_state: play_state as i32,
|
||||||
|
volume: self.play.volume() as f32,
|
||||||
|
mute: self.play.is_muted(),
|
||||||
|
position: Some(position),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
result_tx.send(response).unwrap();
|
||||||
|
}
|
||||||
PlaybackMessage::Replace { uuids } => {
|
PlaybackMessage::Replace { uuids } => {
|
||||||
println!("Replace {:?}", uuids);
|
println!("Replace {:?}", uuids);
|
||||||
let mut all_tracks = Vec::new();
|
let mut all_tracks = Vec::new();
|
||||||
|
|
@ -510,6 +547,12 @@ impl Playback {
|
||||||
println!("{:?}", err)
|
println!("{:?}", err)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
PlaybackMessage::MuteChanged { muted } => {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
PlaybackMessage::PostitionChanged { position } => {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -644,7 +687,23 @@ impl CrabidyService for RpcService {
|
||||||
Pin<Box<dyn tokio_stream::Stream<Item = Result<GetUpdateStreamResponse, Status>> + Send>>;
|
Pin<Box<dyn tokio_stream::Stream<Item = Result<GetUpdateStreamResponse, Status>> + Send>>;
|
||||||
|
|
||||||
async fn init(&self, request: Request<InitRequest>) -> Result<Response<InitResponse>, Status> {
|
async fn init(&self, request: Request<InitRequest>) -> Result<Response<InitResponse>, Status> {
|
||||||
todo!()
|
let playback_tx = self.playback_tx.clone();
|
||||||
|
let (result_tx, result_rx) = flume::bounded(1);
|
||||||
|
let Ok(response) = playback_tx
|
||||||
|
.send_async(PlaybackMessage::Init { result_tx })
|
||||||
|
.await
|
||||||
|
else {
|
||||||
|
return Err(Status::internal("Sending init failed internally"));
|
||||||
|
|
||||||
|
};
|
||||||
|
let Ok(response) = result_rx
|
||||||
|
.recv_async()
|
||||||
|
.await
|
||||||
|
else {
|
||||||
|
return Err(Status::internal("Init failed internally"));
|
||||||
|
|
||||||
|
};
|
||||||
|
Ok(Response::new(response))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_library_node(
|
async fn get_library_node(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue