diff --git a/apps/music-player/src/main.rs b/apps/music-player/src/main.rs index 479f211..b4a77f1 100644 --- a/apps/music-player/src/main.rs +++ b/apps/music-player/src/main.rs @@ -15,8 +15,8 @@ pub struct Metadata { pub track: TrackInfo, } -impl<'a> From<&MetadataMap<'a>> for Metadata { - fn from(map: &MetadataMap<'a>) -> Self { +impl<'a> From> for Metadata { + fn from(map: MetadataMap<'a>) -> Self { let album = AlbumInfo { title: map .get("xesam:album") @@ -46,22 +46,15 @@ impl<'a> From<&MetadataMap<'a>> for Metadata { } } -/*impl MetadataTracker { - pub fn new(magpie: &mut MagpieClient, metadata: &MetadataMap) -> Self { +impl Metadata { + pub fn new(magpie: &mut MagpieClient, metadata: MetadataMap) -> Self { let new: Self = metadata.into(); magpie.send_json_message(0, &InMsg::AlbumChanged(new.album.clone())); magpie.send_json_message(0, &InMsg::TrackChanged(new.track.clone())); - magpie.send_json_message( - 0, - &InMsg::ProgressChanged(ProgressChanged { - position: 0.0, - length: metadata.length().map(|l| l.as_secs_f32()), - }), - ); new } - pub fn update(&mut self, messenger: &mut MagpieClient, metadata: &MetadataMap) { + pub fn update(&mut self, messenger: &mut MagpieClient, metadata: MetadataMap) { let new: Self = metadata.into(); if self.album != new.album { @@ -70,18 +63,11 @@ impl<'a> From<&MetadataMap<'a>> for Metadata { if self.track != new.track { messenger.send_json_message(0, &InMsg::TrackChanged(new.track.clone())); - messenger.send_json_message( - 0, - &InMsg::ProgressChanged(ProgressChanged { - position: 0.0, - length: metadata.length().map(|l| l.as_secs_f32()), - }), - ); } *self = new; } -}*/ +} async fn player_main( player: &PlayerProxy<'_>, @@ -89,7 +75,9 @@ async fn player_main( ) -> Result<(), Box> { use futures_util::StreamExt; let mut playback_status = player.receive_playback_status_changed().await.fuse(); - let mut metadata = player.receive_metadata_changed().await.fuse(); + let mut metadata_tracker = player.receive_metadata_changed().await.fuse(); + + let mut metadata = Metadata::new(magpie, player.metadata().await?); loop { futures_util::select! { @@ -99,18 +87,26 @@ async fn player_main( None => break, }; - println!("Status: {}", status.get().await?); + let status = status.get().await?; + let status = match status.as_str() { + "Playing" => Some(PlaybackStatus::Playing), + "Paused" => Some(PlaybackStatus::Paused), + "Stopped" => Some(PlaybackStatus::Stopped), + _ => None, + }; + + if let Some(status) = status { + magpie.send_json_message(0, &InMsg::PlaybackStatusChanged(status)); + } } - metadata = metadata.next() => { - let metadata = match metadata { + new_metadata = metadata_tracker.next() => { + let new_metadata = match new_metadata { Some(v) => v, None => break, }; - let map = metadata.get().await?.into(); - let metadata = Metadata::from(&map); - - println!("Metadata: {:#?}", metadata); + let new_metadata = new_metadata.get().await?; + metadata.update(magpie, new_metadata); } }; }