diff --git a/resources/custom_modules/mediaplayer.py b/resources/custom_modules/mediaplayer.py index 1630d97c8..695750faa 100755 --- a/resources/custom_modules/mediaplayer.py +++ b/resources/custom_modules/mediaplayer.py @@ -5,8 +5,11 @@ import signal 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 logger = logging.getLogger(__name__) @@ -55,6 +58,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() @@ -76,6 +83,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) > 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: + on_metadata(player, player.props.metadata, manager) + + def parse_arguments(): parser = argparse.ArgumentParser() @@ -112,6 +130,14 @@ def main(): signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGPIPE, signal.SIG_DFL) + # use dbus to shift player (e.g. after playerctld shift) + 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: logger.debug('{player} is not the filtered player, skipping it'