Skip to content

Commit 19f9f75

Browse files
committed
feat(mpris): Retry with pid specific name on NameTaken error
1 parent 9dc14b3 commit 19f9f75

File tree

2 files changed

+70
-13
lines changed

2 files changed

+70
-13
lines changed

playback/src/player.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2163,7 +2163,51 @@ impl PlayerInternal {
21632163

21642164
PlayerCommand::SetSession(session) => self.session = session,
21652165

2166-
PlayerCommand::AddEventSender(sender) => self.event_senders.push(sender),
2166+
PlayerCommand::AddEventSender(sender) => {
2167+
// Send current player state to new event listener
2168+
match self.state {
2169+
PlayerState::Loading {
2170+
ref track_id,
2171+
play_request_id,
2172+
..
2173+
} => {
2174+
let _ = sender.send(PlayerEvent::Loading {
2175+
play_request_id,
2176+
track_id: track_id.clone(),
2177+
position_ms: 0, // TODO
2178+
});
2179+
}
2180+
PlayerState::Paused {
2181+
ref track_id,
2182+
play_request_id,
2183+
stream_position_ms,
2184+
..
2185+
} => {
2186+
let _ = sender.send(PlayerEvent::Paused {
2187+
play_request_id,
2188+
track_id: track_id.clone(),
2189+
position_ms: stream_position_ms,
2190+
});
2191+
}
2192+
PlayerState::Playing { ref audio_item, .. } => {
2193+
let audio_item = Box::new(audio_item.clone());
2194+
let _ = sender.send(PlayerEvent::TrackChanged { audio_item });
2195+
}
2196+
PlayerState::EndOfTrack {
2197+
play_request_id,
2198+
ref track_id,
2199+
..
2200+
} => {
2201+
let _ = sender.send(PlayerEvent::EndOfTrack {
2202+
play_request_id,
2203+
track_id: track_id.clone(),
2204+
});
2205+
}
2206+
_ => (),
2207+
}
2208+
2209+
self.event_senders.push(sender);
2210+
}
21672211

21682212
PlayerCommand::SetSinkEventCallback(callback) => self.sink_event_callback = callback,
21692213

src/mpris_event_handler.rs

Lines changed: 25 additions & 12 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,30 +838,43 @@ 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,
849-
// FIXME: obtain current values from Player
847+
// Values are updated upon reception of first player state, right after MprisTask event
848+
// handler registration
850849
repeat: LoopStatus::None,
851850
shuffle: false,
852851
playback_status: PlaybackStatus::Stopped,
853852
volume: 1.0,
854853
metadata: HashMap::new(),
855854
};
856855

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

866879
let mpris_task = MprisTask {
867880
player,

0 commit comments

Comments
 (0)