Fix MPRIS player

This commit is contained in:
Elias Projahn 2025-03-23 07:59:38 +01:00
parent 8950b04ed2
commit a70b7b5453

View file

@ -47,7 +47,7 @@ mod imp {
pub play: OnceCell<gstreamer_play::Play>, pub play: OnceCell<gstreamer_play::Play>,
pub play_signal_adapter: OnceCell<gstreamer_play::PlaySignalAdapter>, pub play_signal_adapter: OnceCell<gstreamer_play::PlaySignalAdapter>,
pub mpris: OnceCell<mpris_server::Player>, pub mpris_player: OnceCell<mpris_server::Player>,
} }
impl Player { impl Player {
@ -87,7 +87,7 @@ mod imp {
let item_clone = item.clone(); let item_clone = item.clone();
glib::spawn_future_local(async move { glib::spawn_future_local(async move {
obj.imp() obj.imp()
.mpris .mpris_player
.get() .get()
.unwrap() .unwrap()
.set_metadata( .set_metadata(
@ -142,7 +142,15 @@ mod imp {
let obj = self.obj().clone(); let obj = self.obj().clone();
glib::spawn_future_local(async move { glib::spawn_future_local(async move {
obj.init_mpris().await; match obj.init_mpris().await {
Ok(task) => {
// Run the MPRIS server
task.await;
}
Err(err) => {
log::error!("Failed to initialize MPRIS server: {err:?}");
}
}
}); });
let play = gstreamer_play::Play::new(None::<gstreamer_play::PlayVideoRenderer>); let play = gstreamer_play::Play::new(None::<gstreamer_play::PlayVideoRenderer>);
@ -354,7 +362,7 @@ impl Player {
let obj = self.clone(); let obj = self.clone();
glib::spawn_future_local(async move { glib::spawn_future_local(async move {
obj.imp() obj.imp()
.mpris .mpris_player
.get() .get()
.unwrap() .unwrap()
.set_playback_status(mpris_server::PlaybackStatus::Playing) .set_playback_status(mpris_server::PlaybackStatus::Playing)
@ -371,7 +379,7 @@ impl Player {
let obj = self.clone(); let obj = self.clone();
glib::spawn_future_local(async move { glib::spawn_future_local(async move {
obj.imp() obj.imp()
.mpris .mpris_player
.get() .get()
.unwrap() .unwrap()
.set_playback_status(mpris_server::PlaybackStatus::Paused) .set_playback_status(mpris_server::PlaybackStatus::Paused)
@ -414,8 +422,8 @@ impl Player {
} }
} }
async fn init_mpris(&self) { async fn init_mpris(&self) -> Result<mpris_server::LocalServerRunTask> {
let mpris = mpris_server::Player::builder(config::APP_ID) let mpris_player = mpris_server::Player::builder(config::APP_ID)
.desktop_entry(config::APP_ID) .desktop_entry(config::APP_ID)
.can_raise(true) .can_raise(true)
.can_play(true) .can_play(true)
@ -423,51 +431,52 @@ impl Player {
.can_go_previous(true) .can_go_previous(true)
.can_go_next(true) .can_go_next(true)
.build() .build()
.await .await?;
.unwrap();
let obj = self.clone(); mpris_player.connect_raise(clone!(
#[weak(rename_to = obj)]
mpris.connect_raise(clone!( self,
#[weak]
obj,
move |_| obj.emit_by_name::<()>("raise", &[]) move |_| obj.emit_by_name::<()>("raise", &[])
)); ));
mpris.connect_play(clone!( mpris_player.connect_play(clone!(
#[weak] #[weak(rename_to = obj)]
obj, self,
move |_| obj.play() move |_| obj.play()
)); ));
mpris.connect_pause(clone!( mpris_player.connect_pause(clone!(
#[weak] #[weak(rename_to = obj)]
obj, self,
move |_| obj.pause() move |_| obj.pause()
)); ));
mpris.connect_play_pause(clone!( mpris_player.connect_play_pause(clone!(
#[weak] #[weak(rename_to = obj)]
obj, self,
move |_| obj.play_pause() move |_| obj.play_pause()
)); ));
mpris.connect_previous(clone!( mpris_player.connect_previous(clone!(
#[weak] #[weak(rename_to = obj)]
obj, self,
move |_| obj.previous() move |_| obj.previous()
)); ));
mpris.connect_next(clone!( mpris_player.connect_next(clone!(
#[weak] #[weak(rename_to = obj)]
obj, self,
move |_| obj.next() move |_| obj.next()
)); ));
let task = mpris_player.run();
self.imp() self.imp()
.mpris .mpris_player
.set(mpris) .set(mpris_player)
.expect("mpris should not be set"); .map_err(|_| anyhow!("Player already initialized"))?;
Ok(task)
} }
/// Generate new playlist items based on `program` and return the index of the first newly /// Generate new playlist items based on `program` and return the index of the first newly