Merge pull request #2157 from savely-krasovsky/mediaplayer-py-enhancement

feat: added dbus handler to update current player
This commit is contained in:
Alexis Rouillard
2026-07-04 01:14:56 +02:00
committed by GitHub
2 changed files with 24 additions and 0 deletions
+24
View File
@@ -10,10 +10,14 @@ import signal
import gi import gi
import json import json
import os import os
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
from typing import List from typing import List
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def signal_handler(sig, frame): def signal_handler(sig, frame):
logger.info("Received signal to stop, exiting") logger.info("Received signal to stop, exiting")
sys.stdout.write("\n") sys.stdout.write("\n")
@@ -37,8 +41,27 @@ class PlayerManager:
self.selected_player = selected_player self.selected_player = selected_player
self.excluded_player = excluded_player.split(',') if excluded_player else [] self.excluded_player = excluded_player.split(',') if excluded_player else []
# use dbus to shift player (e.g. after playerctld shift)
bus = dbus.SessionBus(mainloop=DBusGMainLoop())
bus.add_signal_receiver(
lambda *args, **kwargs: self.on_dbus_shift(*args, **kwargs),
signal_name="Shift",
dbus_interface="org.waybar.Player")
# register well-known bus name
bus.request_name("org.waybar.Player")
self.init_players() self.init_players()
def on_dbus_shift(self, *args, **kwargs):
# there is no implicit way to get current player,
# so we need to create a new manager to get the right order of players
new_manager = Playerctl.PlayerManager()
if len(new_manager.props.player_names) > 1:
current_player_name = new_manager.props.player_names[0].name
for player in self.get_players():
if player.props.player_name == current_player_name:
self.on_metadata_changed(player, player.props.metadata)
def init_players(self): def init_players(self):
for player in self.manager.props.player_names: for player in self.manager.props.player_names:
if player.name in self.excluded_player: if player.name in self.excluded_player:
@@ -154,6 +177,7 @@ class PlayerManager:
logger.info(f"Player {player.props.player_name} has vanished") logger.info(f"Player {player.props.player_name} has vanished")
self.show_most_important_player() self.show_most_important_player()
def parse_arguments(): def parse_arguments():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()