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 json
import os
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
from typing import List
logger = logging.getLogger(__name__)
def signal_handler(sig, frame):
logger.info("Received signal to stop, exiting")
sys.stdout.write("\n")
@@ -37,8 +41,27 @@ class PlayerManager:
self.selected_player = selected_player
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()
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):
for player in self.manager.props.player_names:
if player.name in self.excluded_player:
@@ -154,6 +177,7 @@ class PlayerManager:
logger.info(f"Player {player.props.player_name} has vanished")
self.show_most_important_player()
def parse_arguments():
parser = argparse.ArgumentParser()