diff --git a/resources/custom_modules/__pycache__/mediaplayer.cpython-314.pyc b/resources/custom_modules/__pycache__/mediaplayer.cpython-314.pyc new file mode 100644 index 00000000..c185ad3d Binary files /dev/null and b/resources/custom_modules/__pycache__/mediaplayer.cpython-314.pyc differ diff --git a/resources/custom_modules/mediaplayer.py b/resources/custom_modules/mediaplayer.py index 4de1edf8..dfa1fdc4 100755 --- a/resources/custom_modules/mediaplayer.py +++ b/resources/custom_modules/mediaplayer.py @@ -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()