Music player sends ProgressChanged events on track change

This commit is contained in:
mars 2022-11-15 21:41:13 -07:00
parent 7f7a88cb15
commit e5f9985bb9
2 changed files with 23 additions and 8 deletions

View File

@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize};
pub use serde;
pub use serde_json;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
pub enum PlaybackStatus {
/// A track is currently playing.
Playing,
@ -18,7 +18,7 @@ pub enum PlaybackStatus {
Stopped,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
pub enum LoopStatus {
/// The playback will stop when there are no more tracks to play.
None,

View File

@ -4,6 +4,7 @@
use canary_music_player::*;
use canary_magpie::client::MagpieClient;
use canary_magpie::protocol::{CreatePanel, MagpieServerMsg};
use canary_music_player::*;
use mpris::PlayerFinder;
pub struct MetadataTracker {
@ -11,8 +12,8 @@ pub struct MetadataTracker {
pub track: TrackInfo,
}
impl From<mpris::Metadata> for MetadataTracker {
fn from(metadata: mpris::Metadata) -> Self {
impl From<&mpris::Metadata> for MetadataTracker {
fn from(metadata: &mpris::Metadata) -> Self {
let album = AlbumInfo {
title: metadata.album_name().map(ToString::to_string),
artists: metadata
@ -39,14 +40,21 @@ impl From<mpris::Metadata> for MetadataTracker {
}
impl MetadataTracker {
pub fn new(magpie: &mut MagpieClient, metadata: mpris::Metadata) -> Self {
pub fn new(magpie: &mut MagpieClient, metadata: &mpris::Metadata) -> 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: mpris::Metadata) {
pub fn update(&mut self, messenger: &mut MagpieClient, metadata: &mpris::Metadata) {
let new: Self = metadata.into();
if self.album != new.album {
@ -55,6 +63,13 @@ impl MetadataTracker {
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;
@ -113,7 +128,7 @@ fn main() {
magpie.send_json_message(0, &InMsg::Connected);
let metadata = player.get_metadata().unwrap();
let mut metadata_tracker = MetadataTracker::new(&mut magpie, metadata);
let mut metadata_tracker = MetadataTracker::new(&mut magpie, &metadata);
let mut events = match player.events() {
Ok(events) => events,
@ -153,7 +168,7 @@ fn main() {
volume: volume as f32,
}),
PlayerShutDown => None,
TrackChanged(metadata) => {
TrackChanged(ref metadata) => {
metadata_tracker.update(&mut magpie, metadata);
None
}