Skip to content

Commit 81b9249

Browse files
committed
feat(mpris): Retry with pid specific name on NameTaken error
1 parent 98cd75f commit 81b9249

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

src/mpris_event_handler.rs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{collections::HashMap, sync::Arc};
1+
use std::{collections::HashMap, process, sync::Arc};
22

33
use librespot_connect::Spirc;
44
use log::{debug, warn};
@@ -838,11 +838,9 @@ pub struct MprisEventHandler {
838838
}
839839

840840
impl MprisEventHandler {
841-
pub async fn spawn(player: Arc<Player>, name: &str) -> Result<MprisEventHandler, MprisError> {
842-
let (cmd_tx, cmd_rx) = mpsc::unbounded_channel();
843-
841+
fn connection_builder<'a>(identity: &str, name: &str) -> zbus::Result<connection::Builder<'a>> {
844842
let mpris_service = MprisService {
845-
identity: name.to_string(),
843+
identity: identity.to_string(),
846844
};
847845
let mpris_player_service = MprisPlayerService {
848846
spirc: None,
@@ -854,14 +852,28 @@ impl MprisEventHandler {
854852
metadata: HashMap::new(),
855853
};
856854

857-
let connection = connection::Builder::session()?
858-
// FIXME: retry with "org.mpris.MediaPlayer2.librespot.instance<pid>"
859-
// on error
860-
.name("org.mpris.MediaPlayer2.librespot")?
855+
connection::Builder::session()?
856+
.name(name.to_string())?
861857
.serve_at("/org/mpris/MediaPlayer2", mpris_service)?
862-
.serve_at("/org/mpris/MediaPlayer2", mpris_player_service)?
858+
.serve_at("/org/mpris/MediaPlayer2", mpris_player_service)
859+
}
860+
861+
pub async fn spawn(player: Arc<Player>, name: &str) -> Result<MprisEventHandler, MprisError> {
862+
let (cmd_tx, cmd_rx) = mpsc::unbounded_channel();
863+
864+
let connection = Self::connection_builder(name, "org.mpris.MediaPlayer2.librespot")?
863865
.build()
864-
.await?;
866+
.await;
867+
let connection = match connection {
868+
Err(zbus::Error::NameTaken) => {
869+
let pid_name =
870+
format!("org.mpris.MediaPlayer2.librespot.instance{}", process::id());
871+
log::warn!("MPRIS: zbus name taken, trying with pid specific name: {pid_name}");
872+
873+
Self::connection_builder(name, &pid_name)?.build().await
874+
}
875+
_ => connection,
876+
}?;
865877

866878
let mpris_task = MprisTask {
867879
player,

0 commit comments

Comments
 (0)