Merge pull request #2157 from savely-krasovsky/mediaplayer-py-enhancement
feat: added dbus handler to update current player
This commit is contained in:
Binary file not shown.
@@ -10,10 +10,14 @@ import signal
|
|||||||
import gi
|
import gi
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import dbus
|
||||||
|
import dbus.service
|
||||||
|
from dbus.mainloop.glib import DBusGMainLoop
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def signal_handler(sig, frame):
|
def signal_handler(sig, frame):
|
||||||
logger.info("Received signal to stop, exiting")
|
logger.info("Received signal to stop, exiting")
|
||||||
sys.stdout.write("\n")
|
sys.stdout.write("\n")
|
||||||
@@ -37,8 +41,27 @@ class PlayerManager:
|
|||||||
self.selected_player = selected_player
|
self.selected_player = selected_player
|
||||||
self.excluded_player = excluded_player.split(',') if excluded_player else []
|
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()
|
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):
|
def init_players(self):
|
||||||
for player in self.manager.props.player_names:
|
for player in self.manager.props.player_names:
|
||||||
if player.name in self.excluded_player:
|
if player.name in self.excluded_player:
|
||||||
@@ -154,6 +177,7 @@ class PlayerManager:
|
|||||||
logger.info(f"Player {player.props.player_name} has vanished")
|
logger.info(f"Player {player.props.player_name} has vanished")
|
||||||
self.show_most_important_player()
|
self.show_most_important_player()
|
||||||
|
|
||||||
|
|
||||||
def parse_arguments():
|
def parse_arguments():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user