Skip to content

Commit a2750d6

Browse files
committed
fix(player): enable remove_track_at and play_track_at for remote player
fix(client): solve error with remote_track
1 parent 5f61342 commit a2750d6

File tree

11 files changed

+120
-29
lines changed

11 files changed

+120
-29
lines changed

addons/src/airplay.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@ impl Player for Airplay {
100100
todo!()
101101
}
102102

103+
async fn play_track_at(&mut self, position: u32) -> Result<(), Error> {
104+
todo!()
105+
}
106+
107+
async fn remove_track_at(&mut self, position: u32) -> Result<(), Error> {
108+
todo!()
109+
}
110+
103111
fn device_type(&self) -> String {
104112
String::from(AIRPLAY_DEVICE)
105113
}

addons/src/chromecast.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,15 @@ impl<'a> Player for Chromecast<'a> {
515515
async fn get_current_tracklist(&mut self) -> Result<(Vec<Track>, Vec<Track>), Error> {
516516
todo!()
517517
}
518-
518+
519+
async fn play_track_at(&mut self, position: u32) -> Result<(), Error> {
520+
todo!()
521+
}
522+
523+
async fn remove_track_at(&mut self, position: u32) -> Result<(), Error> {
524+
todo!()
525+
}
526+
519527
fn device_type(&self) -> String {
520528
String::from(CHROMECAST_DEVICE)
521529
}

addons/src/dlna.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,14 @@ impl Player for Dlna {
350350
todo!()
351351
}
352352

353+
async fn play_track_at(&mut self, position: u32) -> Result<(), Error> {
354+
todo!()
355+
}
356+
357+
async fn remove_track_at(&mut self, position: u32) -> Result<(), Error> {
358+
todo!()
359+
}
360+
353361
fn device_type(&self) -> String {
354362
String::from(UPNP_DLNA_DEVICE)
355363
}

addons/src/kodi.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,14 @@ impl Player for Kodi {
162162
todo!()
163163
}
164164

165+
async fn play_track_at(&mut self, position: u32) -> Result<(), Error> {
166+
todo!()
167+
}
168+
169+
async fn remove_track_at(&mut self, position: u32) -> Result<(), Error> {
170+
todo!()
171+
}
172+
165173
fn device_type(&self) -> String {
166174
String::from(XBMC_DEVICE)
167175
}

addons/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ pub trait Player {
6060
async fn load(&mut self, track: Track) -> Result<(), Error>;
6161
async fn get_current_playback(&mut self) -> Result<Playback, Error>;
6262
async fn get_current_tracklist(&mut self) -> Result<(Vec<Track>, Vec<Track>), Error>;
63+
async fn play_track_at(&mut self, position: u32) -> Result<(), Error>;
64+
async fn remove_track_at(&mut self, position: u32) -> Result<(), Error>;
6365
fn device_type(&self) -> String;
6466
fn disconnect(&mut self) -> Result<(), Error>;
6567
}

addons/src/local.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,26 @@ impl Player for Local {
246246
))
247247
}
248248

249+
async fn play_track_at(&mut self, position: u32) -> Result<(), Error> {
250+
self.client
251+
.as_mut()
252+
.unwrap()
253+
.tracklist
254+
.play_track_at(position as usize)
255+
.await?;
256+
Ok(())
257+
}
258+
259+
async fn remove_track_at(&mut self, position: u32) -> Result<(), Error> {
260+
self.client
261+
.as_mut()
262+
.unwrap()
263+
.tracklist
264+
.remove_track_at(position as usize)
265+
.await?;
266+
Ok(())
267+
}
268+
249269
fn device_type(&self) -> String {
250270
String::from(MUSIC_PLAYER_DEVICE)
251271
}

client/src/tracklist.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use music_player_server::api::{
44
music::v1alpha1::{
55
tracklist_service_client::TracklistServiceClient, AddTrackRequest, AddTracksRequest,
66
ClearTracklistRequest, GetTracklistTracksRequest, LoadTracksRequest, PlayNextRequest,
7-
PlayTrackAtRequest, RemoveTrackRequest,
7+
PlayTrackAtRequest, RemoveTrackAtRequest,
88
},
99
};
1010
use music_player_types::types;
@@ -64,10 +64,10 @@ impl TracklistClient {
6464
}
6565

6666
pub async fn remove(&mut self, id: &str) -> Result<(), Error> {
67-
let request = tonic::Request::new(RemoveTrackRequest {
67+
let request = tonic::Request::new(RemoveTrackAtRequest {
6868
..Default::default()
6969
});
70-
self.client.remove_track(request).await?;
70+
self.client.remove_track_at(request).await?;
7171
Ok(())
7272
}
7373

graphql/src/schema/tracklist.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,14 @@ impl TracklistMutation {
187187
}
188188

189189
async fn clear_tracklist(&self, ctx: &Context<'_>) -> Result<bool, Error> {
190+
let current_device = ctx.data::<Arc<Mutex<CurrentReceiverDevice>>>().unwrap();
191+
let mut device = current_device.lock().await;
192+
193+
if device.client.is_some() {
194+
let receiver = device.client.as_mut().unwrap();
195+
return Ok(true);
196+
}
197+
190198
let player_cmd = ctx
191199
.data::<Arc<StdMutex<UnboundedSender<PlayerCommand>>>>()
192200
.unwrap();
@@ -208,6 +216,15 @@ impl TracklistMutation {
208216

209217
async fn remove_track(&self, ctx: &Context<'_>, position: u32) -> Result<bool, Error> {
210218
let state = ctx.data::<Arc<StdMutex<TracklistState>>>().unwrap();
219+
let current_device = ctx.data::<Arc<Mutex<CurrentReceiverDevice>>>().unwrap();
220+
let mut device = current_device.lock().await;
221+
222+
if device.client.is_some() {
223+
let receiver = device.client.as_mut().unwrap();
224+
receiver.remove_track_at(position).await?;
225+
return Ok(true);
226+
}
227+
211228
let player_cmd = ctx
212229
.data::<Arc<std::sync::Mutex<UnboundedSender<PlayerCommand>>>>()
213230
.unwrap();
@@ -230,6 +247,15 @@ impl TracklistMutation {
230247
}
231248

232249
async fn play_track_at(&self, ctx: &Context<'_>, position: u32) -> Result<bool, Error> {
250+
let current_device = ctx.data::<Arc<Mutex<CurrentReceiverDevice>>>().unwrap();
251+
let mut device = current_device.lock().await;
252+
253+
if device.client.is_some() {
254+
let receiver = device.client.as_mut().unwrap();
255+
receiver.play_track_at(position).await?;
256+
return Ok(true);
257+
}
258+
233259
let player_cmd = ctx
234260
.data::<Arc<StdMutex<UnboundedSender<PlayerCommand>>>>()
235261
.unwrap();

server/proto/music/v1alpha1/tracklist.proto

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ message GetNextTrackResponse { metadata.v1alpha1.Track track = 1; }
3737

3838
message GetPreviousTrackResponse { metadata.v1alpha1.Track track = 1; }
3939

40-
message RemoveTrackRequest {}
40+
message RemoveTrackAtRequest {
41+
uint32 position = 1;
42+
}
4143

42-
message RemoveTrackResponse {}
44+
message RemoveTrackAtResponse {}
4345

4446
message SetRepeatRequest {}
4547

@@ -87,7 +89,7 @@ service TracklistService {
8789
rpc GetNextTrack(GetNextTrackRequest) returns (GetNextTrackResponse) {}
8890
rpc GetPreviousTrack(GetPreviousTrackRequest)
8991
returns (GetPreviousTrackResponse) {}
90-
rpc RemoveTrack(RemoveTrackRequest) returns (RemoveTrackResponse) {}
92+
rpc RemoveTrackAt(RemoveTrackAtRequest) returns (RemoveTrackAtResponse) {}
9193
rpc Shuffle(ShuffleRequest) returns (ShuffleResponse) {}
9294
rpc SetRepeat(SetRepeatRequest) returns (SetRepeatResponse) {}
9395
rpc GetTracklistTracks(GetTracklistTracksRequest)

server/src/api/music.v1alpha1.rs

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4125,10 +4125,13 @@ pub struct GetPreviousTrackResponse {
41254125
}
41264126
#[allow(clippy::derive_partial_eq_without_eq)]
41274127
#[derive(Clone, PartialEq, ::prost::Message)]
4128-
pub struct RemoveTrackRequest {}
4128+
pub struct RemoveTrackAtRequest {
4129+
#[prost(uint32, tag = "1")]
4130+
pub position: u32,
4131+
}
41294132
#[allow(clippy::derive_partial_eq_without_eq)]
41304133
#[derive(Clone, PartialEq, ::prost::Message)]
4131-
pub struct RemoveTrackResponse {}
4134+
pub struct RemoveTrackAtResponse {}
41324135
#[allow(clippy::derive_partial_eq_without_eq)]
41334136
#[derive(Clone, PartialEq, ::prost::Message)]
41344137
pub struct SetRepeatRequest {}
@@ -4446,10 +4449,10 @@ pub mod tracklist_service_client {
44464449
);
44474450
self.inner.unary(request.into_request(), path, codec).await
44484451
}
4449-
pub async fn remove_track(
4452+
pub async fn remove_track_at(
44504453
&mut self,
4451-
request: impl tonic::IntoRequest<super::RemoveTrackRequest>,
4452-
) -> Result<tonic::Response<super::RemoveTrackResponse>, tonic::Status> {
4454+
request: impl tonic::IntoRequest<super::RemoveTrackAtRequest>,
4455+
) -> Result<tonic::Response<super::RemoveTrackAtResponse>, tonic::Status> {
44534456
self.inner
44544457
.ready()
44554458
.await
@@ -4461,7 +4464,7 @@ pub mod tracklist_service_client {
44614464
})?;
44624465
let codec = tonic::codec::ProstCodec::default();
44634466
let path = http::uri::PathAndQuery::from_static(
4464-
"/music.v1alpha1.TracklistService/RemoveTrack",
4467+
"/music.v1alpha1.TracklistService/RemoveTrackAt",
44654468
);
44664469
self.inner.unary(request.into_request(), path, codec).await
44674470
}
@@ -4609,10 +4612,10 @@ pub mod tracklist_service_server {
46094612
&self,
46104613
request: tonic::Request<super::GetPreviousTrackRequest>,
46114614
) -> Result<tonic::Response<super::GetPreviousTrackResponse>, tonic::Status>;
4612-
async fn remove_track(
4615+
async fn remove_track_at(
46134616
&self,
4614-
request: tonic::Request<super::RemoveTrackRequest>,
4615-
) -> Result<tonic::Response<super::RemoveTrackResponse>, tonic::Status>;
4617+
request: tonic::Request<super::RemoveTrackAtRequest>,
4618+
) -> Result<tonic::Response<super::RemoveTrackAtResponse>, tonic::Status>;
46164619
async fn shuffle(
46174620
&self,
46184621
request: tonic::Request<super::ShuffleRequest>,
@@ -5081,25 +5084,25 @@ pub mod tracklist_service_server {
50815084
};
50825085
Box::pin(fut)
50835086
}
5084-
"/music.v1alpha1.TracklistService/RemoveTrack" => {
5087+
"/music.v1alpha1.TracklistService/RemoveTrackAt" => {
50855088
#[allow(non_camel_case_types)]
5086-
struct RemoveTrackSvc<T: TracklistService>(pub Arc<T>);
5089+
struct RemoveTrackAtSvc<T: TracklistService>(pub Arc<T>);
50875090
impl<
50885091
T: TracklistService,
5089-
> tonic::server::UnaryService<super::RemoveTrackRequest>
5090-
for RemoveTrackSvc<T> {
5091-
type Response = super::RemoveTrackResponse;
5092+
> tonic::server::UnaryService<super::RemoveTrackAtRequest>
5093+
for RemoveTrackAtSvc<T> {
5094+
type Response = super::RemoveTrackAtResponse;
50925095
type Future = BoxFuture<
50935096
tonic::Response<Self::Response>,
50945097
tonic::Status,
50955098
>;
50965099
fn call(
50975100
&mut self,
5098-
request: tonic::Request<super::RemoveTrackRequest>,
5101+
request: tonic::Request<super::RemoveTrackAtRequest>,
50995102
) -> Self::Future {
51005103
let inner = self.0.clone();
51015104
let fut = async move {
5102-
(*inner).remove_track(request).await
5105+
(*inner).remove_track_at(request).await
51035106
};
51045107
Box::pin(fut)
51055108
}
@@ -5109,7 +5112,7 @@ pub mod tracklist_service_server {
51095112
let inner = self.inner.clone();
51105113
let fut = async move {
51115114
let inner = inner.0;
5112-
let method = RemoveTrackSvc(inner);
5115+
let method = RemoveTrackAtSvc(inner);
51135116
let codec = tonic::codec::ProstCodec::default();
51145117
let mut grpc = tonic::server::Grpc::new(codec)
51155118
.apply_compression_config(

0 commit comments

Comments
 (0)