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 { }