diff --git a/src/mpris_player.rs b/src/mpris_player.rs index 2fd0ae99..45d69b38 100644 --- a/src/mpris_player.rs +++ b/src/mpris_player.rs @@ -136,7 +136,7 @@ impl MprisPlayer { obj.inner().player.set(player); glib::MainContext::default().spawn_local(clone!(@strong obj => async move { - if stream.next().await.is_some() { + while stream.next().await.is_some() { obj.update(); } })); @@ -166,6 +166,7 @@ impl MprisPlayer { drop(image_uri); let pixbuf = async { + // TODO: Security? let file = gio::File::for_uri(&arturl?); let stream = file.read_async_future(glib::PRIORITY_DEFAULT).await.ok()?; gdk_pixbuf::Pixbuf::from_stream_async_future(&stream) @@ -180,10 +181,8 @@ impl MprisPlayer { fn update(&self) { let player = &self.inner().player; - - // XXX status let (status, metadata) = match (player.cached_playback_status(), player.cached_metadata()) { - (Ok(Some(status)), Ok(Some(metadata))) => (status, Metadata(metadata)), + (Ok(Some(status)), Ok(Some(metadata))) => (status, metadata), _ => return, }; @@ -215,7 +214,15 @@ impl MprisPlayer { } } -struct Metadata(HashMap); +pub struct Metadata(HashMap); + +impl TryFrom for Metadata { + type Error = zbus::Error; + + fn try_from(value: OwnedValue) -> zbus::Result { + Ok(Self(value.try_into()?)) + } +} impl Metadata { fn lookup<'a, T: TryFrom>(&self, key: &str) -> Option { @@ -245,7 +252,7 @@ impl Metadata { )] trait Player { #[dbus_proxy(property)] - fn metadata(&self) -> zbus::Result>; + fn metadata(&self) -> zbus::Result; #[dbus_proxy(property)] fn playback_status(&self) -> zbus::Result;