diff --git a/src/rust/mpris/src/server.rs b/src/rust/mpris/src/server.rs index 36b3bdb1d0fb7db7173b5023e51003b576f082c4..c424e78106378159aa3e985bd8b8f6f2f8f3be01 100644 --- a/src/rust/mpris/src/server.rs +++ b/src/rust/mpris/src/server.rs @@ -5,13 +5,12 @@ use commons::log; use smallstring::SmallString; use zbus::{dbus_interface, Connection, ConnectionBuilder, SignalContext as ZSignalCtx}; -pub struct Server { - connexion: Connection, -} +pub struct Server(Connection); pub struct ServerBuilder { identity: SmallString, desktop_entry: Option<SmallString>, + is_unique: bool, } impl Server { @@ -19,6 +18,7 @@ impl Server { ServerBuilder { identity: identity.as_ref().into(), desktop_entry: None, + is_unique: false, } } } @@ -29,23 +29,34 @@ impl ServerBuilder { self } + pub fn unique(mut self) -> Self { + self.is_unique = true; + self + } + /// Try to build the DBus server. pub async fn try_build(self) -> zbus::Result<Server> { - let desktop_entry = self.desktop_entry.unwrap_or_else(|| self.identity.clone()); - let main = Main { - identity: self.identity, - desktop_entry, - }; - let player = Player {}; - let track_list = TrackList {}; - let connexion = ConnectionBuilder::session()? - .name("org.mpris.MediaPlayer2.mpris")? - .serve_at("/org/mpris/MediaPlayer2", main)? - .serve_at("/org/mpris/MediaPlayer2", player)? - .serve_at("/org/mpris/MediaPlayer2", track_list)? - .build() - .await?; - Ok(Server { connexion }) + Ok(Server( + ConnectionBuilder::session()? + .name(format!( + "org.mpris.MediaPlayer2.{}{}", + self.identity, + self.is_unique + .then_some(format!("-{}", std::process::id())) + .unwrap_or_default() + ))? + .serve_at( + "/org/mpris/MediaPlayer2", + Main { + desktop_entry: self.desktop_entry.unwrap_or_else(|| self.identity.clone()), + identity: self.identity, + }, + )? + .serve_at("/org/mpris/MediaPlayer2", Player {})? + .serve_at("/org/mpris/MediaPlayer2", TrackList {})? + .build() + .await?, + )) } }