diff options
-rwxr-xr-x | mpris_to_text.py | 68 |
1 files changed, 24 insertions, 44 deletions
diff --git a/mpris_to_text.py b/mpris_to_text.py index c5d65d8..2f75350 100755 --- a/mpris_to_text.py +++ b/mpris_to_text.py | |||
@@ -6,16 +6,10 @@ import threading | |||
6 | import argparse | 6 | import argparse |
7 | import signal | 7 | import signal |
8 | 8 | ||
9 | import dbus | ||
10 | import dbus.mainloop.glib | ||
11 | from gi.repository import GLib | 9 | from gi.repository import GLib |
12 | 10 | from pydbus import SessionBus | |
13 | from blessed import Terminal | 11 | from blessed import Terminal |
14 | 12 | ||
15 | |||
16 | dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) | ||
17 | |||
18 | |||
19 | class MetaWriter: | 13 | class MetaWriter: |
20 | filename = "" | 14 | filename = "" |
21 | output_format = "" | 15 | output_format = "" |
@@ -65,7 +59,8 @@ class PlayerSelector(threading.Thread): | |||
65 | def __init__(self, meta_writer, menu=None): | 59 | def __init__(self, meta_writer, menu=None): |
66 | super().__init__() | 60 | super().__init__() |
67 | 61 | ||
68 | self.bus = dbus.SessionBus() | 62 | self.bus = SessionBus() |
63 | self.loop = GLib.MainLoop() | ||
69 | self.meta_writer = meta_writer | 64 | self.meta_writer = meta_writer |
70 | self.menu = menu | 65 | self.menu = menu |
71 | 66 | ||
@@ -76,26 +71,21 @@ class PlayerSelector(threading.Thread): | |||
76 | self.players = {} | 71 | self.players = {} |
77 | self.players_indexes = [] | 72 | self.players_indexes = [] |
78 | 73 | ||
79 | bus_path = self.bus.get_object( | 74 | bus_ctrl = self.bus.get(".DBus") |
80 | "org.freedesktop.DBus", "/org/freedesktop/DBus") | ||
81 | bus_proxy = dbus.Interface(bus_path, "org.freedesktop.DBus") | ||
82 | 75 | ||
83 | for service in bus_proxy.ListNames(): | 76 | for service in bus_ctrl.ListNames(): |
84 | if self.service_regex.match(service): | 77 | if self.service_regex.match(service): |
85 | split_service = service.split(".") | 78 | split_service = service.split(".") |
86 | name_start_index = len( | 79 | name_start_index = len( |
87 | split_service[0]) + len(split_service[1]) + len(split_service[2]) + 3 | 80 | split_service[0]) + len(split_service[1]) + len(split_service[2]) + 3 |
88 | 81 | ||
89 | player_path = self.bus.get_object( | 82 | player = self.bus.get(service, "/org/mpris/MediaPlayer2") |
90 | service, "/org/mpris/MediaPlayer2") | 83 | player_name = "" |
91 | player_props = dbus.Interface( | 84 | |
92 | player_path, "org.freedesktop.DBus.Properties") | ||
93 | player_name = service[name_start_index:] | ||
94 | try: | 85 | try: |
95 | player_name = player_props.Get( | 86 | player_name = player.Identity |
96 | "org.mpris.MediaPlayer2.Player", "Identity") | ||
97 | except dbus.exceptions.DBusException: | 87 | except dbus.exceptions.DBusException: |
98 | pass | 88 | player_name = service[name_start_index:] |
99 | 89 | ||
100 | self.players[service] = player_name | 90 | self.players[service] = player_name |
101 | self.players_indexes.append(service) | 91 | self.players_indexes.append(service) |
@@ -115,38 +105,28 @@ class PlayerSelector(threading.Thread): | |||
115 | self.active_player = "" | 105 | self.active_player = "" |
116 | 106 | ||
117 | if self.signal_receiver is not None: | 107 | if self.signal_receiver is not None: |
118 | self.signal_receiver.remove() | 108 | self.signal_receiver.disconnect() |
119 | 109 | ||
120 | if self.active_player != "": | 110 | if self.active_player != "": |
121 | self.signal_receiver = self.bus.add_signal_receiver( | 111 | player = self.bus.get(self.active_player, "/org/mpris/MediaPlayer2") |
122 | handler_function=self.playing_song_changed, | ||
123 | bus_name=self.active_player, | ||
124 | dbus_interface="org.freedesktop.DBus.Properties", | ||
125 | signal_name="PropertiesChanged", | ||
126 | path="/org/mpris/MediaPlayer2" | ||
127 | ) | ||
128 | 112 | ||
129 | player_path = self.bus.get_object( | 113 | self.signal_receiver = self.bus.subscribe( |
130 | self.active_player, "/org/mpris/MediaPlayer2") | 114 | sender=self.active_player, |
131 | player_props = dbus.Interface( | 115 | object="/org/mpris/MediaPlayer2", |
132 | player_path, "org.freedesktop.DBus.Properties") | 116 | signal="PropertiesChanged", |
117 | signal_fired=self.playing_song_changed | ||
118 | ) | ||
133 | 119 | ||
134 | self.meta_writer.write_meta(player_props.Get( | 120 | self.meta_writer.write_meta(player.Metadata) |
135 | "org.mpris.MediaPlayer2.Player", "Metadata")) | ||
136 | else: | 121 | else: |
137 | self.meta_writer.write("") | 122 | self.meta_writer.write("") |
138 | 123 | ||
139 | def run(self): | 124 | def run(self): |
140 | bus_path = self.bus.get_object( | 125 | bus_ctrl = self.bus.get(".DBus") |
141 | "org.freedesktop.DBus", "/org/freedesktop/DBus") | 126 | bus_ctrl.NameOwnerChanged.connect(self.dbus_name_owner_changed) |
142 | bus_proxy = dbus.Interface(bus_path, "org.freedesktop.DBus") | ||
143 | bus_proxy.connect_to_signal( | ||
144 | "NameOwnerChanged", self.dbus_name_owner_changed) | ||
145 | 127 | ||
146 | self.get_players() | 128 | self.get_players() |
147 | self.menu.refresh() | 129 | self.menu.refresh() |
148 | |||
149 | self.loop = GLib.MainLoop() | ||
150 | self.loop.run() | 130 | self.loop.run() |
151 | 131 | ||
152 | def quit(self): | 132 | def quit(self): |
@@ -157,9 +137,9 @@ class PlayerSelector(threading.Thread): | |||
157 | self.get_players() | 137 | self.get_players() |
158 | self.menu.refresh() | 138 | self.menu.refresh() |
159 | 139 | ||
160 | def playing_song_changed(self, player, changed_properties, invalidated_properties): | 140 | def playing_song_changed(self, sender, object, iface, signal, params): |
161 | if "Metadata" in changed_properties: | 141 | if "Metadata" in params[1]: |
162 | self.meta_writer.write_meta(changed_properties["Metadata"]) | 142 | self.meta_writer.write_meta(params[1]["Metadata"]) |
163 | self.menu.refresh() | 143 | self.menu.refresh() |
164 | 144 | ||
165 | 145 | ||