1- use std:: { collections:: HashMap , sync:: Arc } ;
1+ use std:: { collections:: HashMap , process , sync:: Arc } ;
22
33use librespot_connect:: Spirc ;
44use log:: { debug, warn} ;
@@ -838,11 +838,9 @@ pub struct MprisEventHandler {
838838}
839839
840840impl 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