1
- use std:: { collections:: HashMap , sync:: Arc } ;
1
+ use std:: { collections:: HashMap , process , sync:: Arc } ;
2
2
3
3
use librespot_connect:: Spirc ;
4
4
use log:: { debug, warn} ;
@@ -838,11 +838,9 @@ pub struct MprisEventHandler {
838
838
}
839
839
840
840
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 > > {
844
842
let mpris_service = MprisService {
845
- identity : name . to_string ( ) ,
843
+ identity : identity . to_string ( ) ,
846
844
} ;
847
845
let mpris_player_service = MprisPlayerService {
848
846
spirc : None ,
@@ -854,14 +852,28 @@ impl MprisEventHandler {
854
852
metadata : HashMap :: new ( ) ,
855
853
} ;
856
854
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 ( ) ) ?
861
857
. 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" ) ?
863
865
. 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
+ } ?;
865
877
866
878
let mpris_task = MprisTask {
867
879
player,
0 commit comments