Disentangle conflicting proto versions

We diverged in working on the proto definition, which should now be
resolved.
This commit is contained in:
Hans Mündelein 2023-05-22 11:02:42 +02:00
parent 19f19cba2d
commit b5f722f1cb
Signed by: hans
GPG Key ID: BA7B55E984CE74F4
6 changed files with 107 additions and 145 deletions

View File

@ -1,5 +1,4 @@
fn main() -> Result<(), Box<dyn std::error::Error>> { fn main() -> Result<(), Box<dyn std::error::Error>> {
tonic_build::compile_protos("crabidy/v1/crabidy.proto")?; tonic_build::compile_protos("crabidy/v1/crabidy.proto")?;
tonic_build::compile_protos("crabidy/proto/crabidy.proto")?;
Ok(()) Ok(())
} }

View File

@ -57,3 +57,95 @@ message GetTrackRequest {
message GetTrackResponse { message GetTrackResponse {
Track track = 1; Track track = 1;
} }
service Queue {
rpc QueueTrack (QueueTrackRequest) returns (EmptyResponse);
rpc QueueLibraryNode (QueueNodeRequest) returns (EmptyResponse);
rpc ReplaceWithTrack (QueueTrackRequest) returns (EmptyResponse);
rpc ReplaceWithNode (QueueNodeRequest) returns (EmptyResponse);
rpc AppendTrack (QueueTrackRequest) returns (EmptyResponse);
rpc AppendNode (QueueNodeRequest) returns (EmptyResponse);
rpc RemoveTracks (RemoveTracksRequest) returns (EmptyResponse);
rpc SetCurrentTrack (SetCurrentTrackRequest) returns (EmptyResponse);
rpc GetQueueUpdates (QueueUpdatesRequest) returns (stream QueueUpdateResponse);
rpc GetQueue(EmptyRequest) returns (CurrentQueue);
rpc SaveQueue (QueueSaveRequest) returns (EmptyResponse);
}
message CurrentQueue {
uint64 timestamp =1;
uint32 current = 2;
repeated Track tracks = 3;
}
message QueuePositionChange {
uint64 timestamp = 1;
uint32 new_position = 2;
}
message QueueTrackRequest {
string uuid = 1;
}
message QueueNodeRequest {
string uuid = 1;
}
message RemoveTracksRequest {
repeated uint32 positions = 1;
}
message SetCurrentTrackRequest {
uint32 position = 1;
}
message QueueUpdatesRequest {
uint64 timestamp =2;
}
message QueueUpdateResponse {
oneof QueueUpdateResult{
CurrentQueue full = 1;
QueuePositionChange position_change = 2;
}
}
message QueueSaveRequest {
string name = 1;
// inside the configured path of crabidy
string path = 2;
}
service Playback {
rpc TogglePlay (EmptyRequest) returns (EmptyResponse);
rpc Stop (EmptyRequest) returns (EmptyResponse);
rpc GetActiveTrack (EmptyRequest) returns (ActiveTrack);
rpc GetTrackUpdates (ActiveTrackFilter) returns (stream ActiveTrack);
}
enum TrackPlayState {
TRACK_PLAY_STATE_STOPPED = 0;
TRACK_PLAY_STATE_LOADING = 1;
TRACK_PLAY_STATE_PLAYING = 2;
TRACK_PLAY_STATE_PAUSED = 3;
}
message ActiveTrackFilter {
// defines how many of the update messages should be skipped
// before they are sent back via GetTrackUpdates
uint32 updates_skipped = 1;
repeated string type_whitelist = 2;
repeated string type_blacklist = 3;
}
message ActiveTrack {
optional Track track = 1;
TrackPlayState play_state = 2;
uint32 completion = 3;
}
message EmptyRequest { }
message EmptyResponse { }

View File

@ -1,128 +0,0 @@
syntax = "proto3";
package crabidy;
service Library {
rpc GetLibraryNode (LibraryNodeRequest) returns (LibraryNodeResponse);
}
// To signal whether it's loading data (for frontend only probably)
enum LibraryNodeState {
LIBRARY_NODE_STATE_UNSPECIFIED = 0;
LIBRARY_NODE_STATE_PENDING = 1;
LIBRARY_NODE_STATE_DONE = 2;
}
message Track {
// Including provider
string uuid = 1;
string artist = 2;
string title = 3;
}
message LibraryNodeRequest {
string uuid = 1;
}
message LibraryNodeResponse {
// Including provider
string uuid = 1;
string name = 2;
repeated string children = 3;
optional string parent = 4;
LibraryNodeState state = 5;
repeated Track tracks = 6;
bool is_queable = 7;
}
service Queue {
rpc QueueTrack (QueueTrackRequest) returns (EmptyResponse);
rpc QueueLibraryNode (QueueNodeRequest) returns (EmptyResponse);
rpc ReplaceWithTrack (QueueTrackRequest) returns (EmptyResponse);
rpc ReplaceWithNode (QueueNodeRequest) returns (EmptyResponse);
rpc AppendTrack (QueueTrackRequest) returns (EmptyResponse);
rpc AppendNode (QueueNodeRequest) returns (EmptyResponse);
rpc RemoveTracks (RemoveTracksRequest) returns (EmptyResponse);
rpc SetCurrentTrack (SetCurrentTrackRequest) returns (EmptyResponse);
rpc GetQueueUpdates (QueueUpdatesRequest) returns (stream QueueUpdateResponse);
rpc GetQueue(EmptyRequest) returns (CurrentQueue);
rpc SaveQueue (QueueSaveRequest) returns (EmptyResponse);
}
message CurrentQueue {
uint64 timestamp =1;
uint32 current = 2;
repeated Track tracks = 3;
}
message QueuePositionChange {
uint64 timestamp = 1;
uint32 new_position = 2;
}
message QueueTrackRequest {
string uuid = 1;
}
message QueueNodeRequest {
string uuid = 1;
}
message RemoveTracksRequest {
repeated uint32 positions = 1;
}
message SetCurrentTrackRequest {
uint32 position = 1;
}
message QueueUpdatesRequest {
uint64 timestamp =2;
}
message QueueUpdateResponse {
oneof QueueUpdateResult{
CurrentQueue full = 1;
QueuePositionChange position_change = 2;
}
}
message QueueSaveRequest {
string name = 1;
// inside the configured path of crabidy
string path = 2;
}
service Playback {
rpc TogglePlay (EmptyRequest) returns (EmptyResponse);
rpc Stop (EmptyRequest) returns (EmptyResponse);
rpc GetActiveTrack (EmptyRequest) returns (ActiveTrack);
rpc GetTrackUpdates (ActiveTrackFilter) returns (stream ActiveTrack);
}
enum TrackPlayState {
TRACK_PLAY_STATE_STOPPED = 0;
TRACK_PLAY_STATE_LOADING = 1;
TRACK_PLAY_STATE_PLAYING = 2;
TRACK_PLAY_STATE_PAUSED = 3;
}
message ActiveTrackFilter {
// defines how many of the update messages should be skipped
// before they are sent back via GetTrackUpdates
uint32 updates_skipped = 1;
repeated string type_whitelist = 2;
repeated string type_blacklist = 3;
}
message ActiveTrack {
optional Track track = 1;
TrackPlayState play_state = 2;
uint32 completion = 3;
}
message EmptyRequest { }
message EmptyResponse { }

View File

@ -2,8 +2,6 @@ pub mod proto;
use async_trait::async_trait; use async_trait::async_trait;
#[async_trait] #[async_trait]
pub trait ProviderClient: std::fmt::Debug + Send + Sync { pub trait ProviderClient: std::fmt::Debug + Send + Sync {
async fn init(raw_toml_settings: &str) -> Result<Self, ProviderError> async fn init(raw_toml_settings: &str) -> Result<Self, ProviderError>
@ -11,11 +9,11 @@ pub trait ProviderClient: std::fmt::Debug + Send + Sync {
Self: Sized; Self: Sized;
fn settings(&self) -> String; fn settings(&self) -> String;
async fn get_urls_for_track(&self, track_uuid: &str) -> Result<Vec<String>, ProviderError>; async fn get_urls_for_track(&self, track_uuid: &str) -> Result<Vec<String>, ProviderError>;
fn get_library_root(&self) -> proto::crabidy::LibraryNodeResponse; fn get_library_root(&self) -> proto::crabidy::LibraryNode;
async fn get_library_node( async fn get_library_node(
&self, &self,
list_uuid: &str, list_uuid: &str,
) -> Result<proto::crabidy::LibraryNodeResponse, ProviderError>; ) -> Result<proto::crabidy::LibraryNode, ProviderError>;
} }
#[derive(Clone, Debug, Hash)] #[derive(Clone, Debug, Hash)]
@ -27,7 +25,7 @@ pub enum ProviderError {
Other, Other,
} }
impl proto::crabidy::LibraryNodeResponse { impl proto::crabidy::LibraryNode {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
uuid: "/".to_string(), uuid: "/".to_string(),

View File

@ -53,10 +53,10 @@ impl crabidy_core::ProviderClient for Client {
Ok(manifest.urls) Ok(manifest.urls)
} }
fn get_library_root(&self) -> crabidy_core::proto::crabidy::LibraryNodeResponse { fn get_library_root(&self) -> crabidy_core::proto::crabidy::LibraryNode {
let global_root = crabidy_core::proto::crabidy::LibraryNodeResponse::new(); let global_root = crabidy_core::proto::crabidy::LibraryNode::new();
let children = vec!["userplaylists".to_string()]; let children = vec!["userplaylists".to_string()];
crabidy_core::proto::crabidy::LibraryNodeResponse { crabidy_core::proto::crabidy::LibraryNode {
uuid: "tidal".to_string(), uuid: "tidal".to_string(),
name: "tidal".to_string(), name: "tidal".to_string(),
parent: Some(format!("{}", global_root.uuid)), parent: Some(format!("{}", global_root.uuid)),
@ -70,16 +70,15 @@ impl crabidy_core::ProviderClient for Client {
async fn get_library_node( async fn get_library_node(
&self, &self,
uuid: &str, uuid: &str,
) -> Result<crabidy_core::proto::crabidy::LibraryNodeResponse, crabidy_core::ProviderError> ) -> Result<crabidy_core::proto::crabidy::LibraryNode, crabidy_core::ProviderError> {
{
let Some(user_id) = self.settings.login.user_id.clone() else { let Some(user_id) = self.settings.login.user_id.clone() else {
return Err(crabidy_core::ProviderError::UnknownUser) return Err(crabidy_core::ProviderError::UnknownUser)
}; };
let (module, uuid) = split_uuid(uuid); let (module, uuid) = split_uuid(uuid);
let node = match module.as_str() { let node = match module.as_str() {
"userplaylists" => { "userplaylists" => {
let global_root = crabidy_core::proto::crabidy::LibraryNodeResponse::new(); let global_root = crabidy_core::proto::crabidy::LibraryNode::new();
let mut node = crabidy_core::proto::crabidy::LibraryNodeResponse { let mut node = crabidy_core::proto::crabidy::LibraryNode {
uuid: "userplaylists".to_string(), uuid: "userplaylists".to_string(),
name: "playlists".to_string(), name: "playlists".to_string(),
parent: Some(format!("{}", global_root.uuid)), parent: Some(format!("{}", global_root.uuid)),
@ -97,7 +96,7 @@ impl crabidy_core::ProviderClient for Client {
node node
} }
"playlist" => { "playlist" => {
let mut node: crabidy_core::proto::crabidy::LibraryNodeResponse = let mut node: crabidy_core::proto::crabidy::LibraryNode =
self.get_playlist(&uuid).await?.into(); self.get_playlist(&uuid).await?.into();
let tracks: Vec<crabidy_core::proto::crabidy::Track> = self let tracks: Vec<crabidy_core::proto::crabidy::Track> = self
.get_playlist_tracks(&uuid) .get_playlist_tracks(&uuid)

View File

@ -188,6 +188,7 @@ impl From<Track> for crabidy_core::proto::crabidy::Track {
uuid: track.id.to_string(), uuid: track.id.to_string(),
title: track.title, title: track.title,
artist: track.artist.name, artist: track.artist.name,
duration: Some(track.duration as u32),
} }
} }
} }
@ -198,6 +199,7 @@ impl From<&Track> for crabidy_core::proto::crabidy::Track {
uuid: track.id.to_string(), uuid: track.id.to_string(),
title: track.title.clone(), title: track.title.clone(),
artist: track.artist.name.clone(), artist: track.artist.name.clone(),
duration: Some(track.duration as u32),
} }
} }
} }
@ -298,7 +300,7 @@ pub struct PlaylistAndFavorite {
pub playlist: Playlist, pub playlist: Playlist,
} }
impl From<PlaylistAndFavorite> for crabidy_core::proto::crabidy::LibraryNodeResponse { impl From<PlaylistAndFavorite> for crabidy_core::proto::crabidy::LibraryNode {
fn from(a: PlaylistAndFavorite) -> Self { fn from(a: PlaylistAndFavorite) -> Self {
a.playlist.into() a.playlist.into()
} }
@ -327,9 +329,9 @@ pub struct Playlist {
pub last_item_added_at: Option<String>, pub last_item_added_at: Option<String>,
} }
impl From<Playlist> for crabidy_core::proto::crabidy::LibraryNodeResponse { impl From<Playlist> for crabidy_core::proto::crabidy::LibraryNode {
fn from(a: Playlist) -> Self { fn from(a: Playlist) -> Self {
crabidy_core::proto::crabidy::LibraryNodeResponse { crabidy_core::proto::crabidy::LibraryNode {
name: a.title, name: a.title,
uuid: format!("playlist:{}", a.uuid), uuid: format!("playlist:{}", a.uuid),
tracks: Vec::new(), tracks: Vec::new(),