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:
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user