From 9315ccc4c6898509b64eea87f4c41d57f19a0a96 Mon Sep 17 00:00:00 2001 From: Savely Krasovsky Date: Fri, 5 May 2023 21:36:13 +0300 Subject: [PATCH 1/6] feat: added dbus handler to update current player it allows to send script a signal to shift current player after playerctld shift command --- resources/custom_modules/mediaplayer.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/resources/custom_modules/mediaplayer.py b/resources/custom_modules/mediaplayer.py index 1630d97c8..6a6737ef0 100755 --- a/resources/custom_modules/mediaplayer.py +++ b/resources/custom_modules/mediaplayer.py @@ -5,8 +5,10 @@ import signal import gi import json +import dbus gi.require_version('Playerctl', '2.0') from gi.repository import Playerctl, GLib +from dbus.mainloop.glib import DBusGMainLoop logger = logging.getLogger(__name__) @@ -76,6 +78,17 @@ def signal_handler(sig, frame): sys.exit(0) +def dbus_signal_handler(*args, manager, **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) > 0: + current_player_name = new_manager.props.player_names[0].name + for player in manager.props.players: + if player.props.player_name == current_player_name: + on_metadata(player, player.props.metadata, manager) + + def parse_arguments(): parser = argparse.ArgumentParser() @@ -111,6 +124,14 @@ def main(): signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGPIPE, signal.SIG_DFL) + signal.signal(signal.SIGUSR1, lambda *args: shift_signal_handler(*args, manager)) + + # use dbus to shift player (e.g. after playerctld shift) + DBusGMainLoop(set_as_default=True) + bus = dbus.SystemBus() + bus.add_signal_receiver(lambda *args, **kwargs: dbus_signal_handler(*args, **kwargs, manager=manager), + signal_name='Shift', + dbus_interface='org.waybar.Media') for player in manager.props.player_names: if arguments.player is not None and arguments.player != player.name: From 8ce569b114f9f149fb21376c15689e49d1617433 Mon Sep 17 00:00:00 2001 From: Savely Krasovsky Date: Fri, 5 May 2023 22:05:43 +0300 Subject: [PATCH 2/6] feat: choose another player after first was vanished --- resources/custom_modules/mediaplayer.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/custom_modules/mediaplayer.py b/resources/custom_modules/mediaplayer.py index 6a6737ef0..390faaaac 100755 --- a/resources/custom_modules/mediaplayer.py +++ b/resources/custom_modules/mediaplayer.py @@ -57,6 +57,10 @@ def on_player_appeared(manager, player, selected_player=None): def on_player_vanished(manager, player): logger.info('Player has vanished') + if len(manager.props.players) > 0: + player = manager.props.players[0] + on_metadata(player, player.props.metadata, manager) + return sys.stdout.write('\n') sys.stdout.flush() From 9c161a8cbeddcb15a69ebbed0539028e3a31261d Mon Sep 17 00:00:00 2001 From: Savely Krasovsky Date: Fri, 5 May 2023 22:10:45 +0300 Subject: [PATCH 3/6] fix: shift only if there is more than one player --- resources/custom_modules/mediaplayer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/custom_modules/mediaplayer.py b/resources/custom_modules/mediaplayer.py index 390faaaac..5055f8068 100755 --- a/resources/custom_modules/mediaplayer.py +++ b/resources/custom_modules/mediaplayer.py @@ -86,7 +86,7 @@ def dbus_signal_handler(*args, manager, **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) > 0: + if len(new_manager.props.player_names) > 1: current_player_name = new_manager.props.player_names[0].name for player in manager.props.players: if player.props.player_name == current_player_name: From f5a9a4781a589a7c96eac2c0818a34fe145b9522 Mon Sep 17 00:00:00 2001 From: Savely Krasovsky Date: Fri, 5 May 2023 23:44:19 +0300 Subject: [PATCH 4/6] fix: use session bus instead of system --- resources/custom_modules/mediaplayer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/custom_modules/mediaplayer.py b/resources/custom_modules/mediaplayer.py index 5055f8068..41f6e0615 100755 --- a/resources/custom_modules/mediaplayer.py +++ b/resources/custom_modules/mediaplayer.py @@ -132,10 +132,10 @@ def main(): # use dbus to shift player (e.g. after playerctld shift) DBusGMainLoop(set_as_default=True) - bus = dbus.SystemBus() + bus = dbus.SessionBus() bus.add_signal_receiver(lambda *args, **kwargs: dbus_signal_handler(*args, **kwargs, manager=manager), signal_name='Shift', - dbus_interface='org.waybar.Media') + dbus_interface='org.waybar.Player') for player in manager.props.player_names: if arguments.player is not None and arguments.player != player.name: From 70901b149e39b30a38a3d36187cdcb57303ff499 Mon Sep 17 00:00:00 2001 From: Savely Krasovsky Date: Sat, 6 May 2023 00:35:34 +0300 Subject: [PATCH 5/6] feat: register well-known name --- resources/custom_modules/mediaplayer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/custom_modules/mediaplayer.py b/resources/custom_modules/mediaplayer.py index 41f6e0615..dd3228c66 100755 --- a/resources/custom_modules/mediaplayer.py +++ b/resources/custom_modules/mediaplayer.py @@ -6,6 +6,7 @@ import gi import json import dbus +import dbus.service gi.require_version('Playerctl', '2.0') from gi.repository import Playerctl, GLib from dbus.mainloop.glib import DBusGMainLoop @@ -131,11 +132,12 @@ def main(): signal.signal(signal.SIGUSR1, lambda *args: shift_signal_handler(*args, manager)) # use dbus to shift player (e.g. after playerctld shift) - DBusGMainLoop(set_as_default=True) - bus = dbus.SessionBus() + bus = dbus.SessionBus(mainloop=DBusGMainLoop()) bus.add_signal_receiver(lambda *args, **kwargs: dbus_signal_handler(*args, **kwargs, manager=manager), signal_name='Shift', dbus_interface='org.waybar.Player') + # register well-known bus name + bus.request_name('org.waybar.Player') for player in manager.props.player_names: if arguments.player is not None and arguments.player != player.name: From e1411059ab3dede8a02f3c0ac0e3b609d85f8c35 Mon Sep 17 00:00:00 2001 From: Savely Krasovsky Date: Sat, 6 May 2023 00:39:17 +0300 Subject: [PATCH 6/6] fix: remove old signal handler --- resources/custom_modules/mediaplayer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/custom_modules/mediaplayer.py b/resources/custom_modules/mediaplayer.py index dd3228c66..695750faa 100755 --- a/resources/custom_modules/mediaplayer.py +++ b/resources/custom_modules/mediaplayer.py @@ -129,7 +129,6 @@ def main(): signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGPIPE, signal.SIG_DFL) - signal.signal(signal.SIGUSR1, lambda *args: shift_signal_handler(*args, manager)) # use dbus to shift player (e.g. after playerctld shift) bus = dbus.SessionBus(mainloop=DBusGMainLoop())