feat: added dbus handler to update current player

it allows to send script a signal to shift current player after playerctld shift command
This commit is contained in:
Savely Krasovsky
2023-05-05 21:36:13 +03:00
committed by GitHub
parent 919ad0a8bb
commit 9315ccc4c6
+21
View File
@@ -5,8 +5,10 @@ import sys
import signal import signal
import gi import gi
import json import json
import dbus
gi.require_version('Playerctl', '2.0') gi.require_version('Playerctl', '2.0')
from gi.repository import Playerctl, GLib from gi.repository import Playerctl, GLib
from dbus.mainloop.glib import DBusGMainLoop
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -76,6 +78,17 @@ def signal_handler(sig, frame):
sys.exit(0) 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(): def parse_arguments():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
@@ -111,6 +124,14 @@ def main():
signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGPIPE, signal.SIG_DFL) 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: for player in manager.props.player_names:
if arguments.player is not None and arguments.player != player.name: if arguments.player is not None and arguments.player != player.name: