MPRIS: Got everything necessary working. (I think.)

This commit is contained in:
The Wobbler 2025-04-18 19:35:13 +02:00
parent f23530628c
commit 1f149a25a3
10 changed files with 333 additions and 58 deletions

View file

@ -1,11 +1,11 @@
#!/usr/bin/python3
from jeepney import DBusAddress, Message, MessageType, HeaderFields, new_error, new_signal
from jeepney import Message, MessageType, HeaderFields, new_error, new_method_return
SERVICE_NAME = "org.mpris.MediaPlayer2.wobuzz"
OBJECT_PATH = "/org/mpris/MediaPlayer2"
PROPERTIES_INTERFACE = "org.freedesktop.DBus.Properties"
INTROSPECTION_INTERFACE = "org.freedesktop.DBus.Introspectable"
MPRIS_ROOT_INTERFACE = "org.mpris.MediaPlayer2"
MPRIS_PLAYER_INTERFACE = "org.mpris.MediaPlayer2.Player"
@ -46,18 +46,9 @@ class DBusInterface:
self.server = server
self.interface = interface
def __setattr__(self, key: str, value) -> None:
super().__setattr__(key, value)
if not key[0].isupper() and not callable(value) and hasattr(self, key.title()):
getter = getattr(self, key.title())
if callable(getter):
if hasattr(self.server, "bus"):
self.server.properties_interface.properties_changed(self.interface)
def handle_message(self, msg: Message):
return_msg = None
post_action = None # function that gets called after return_msg was set
match msg.header.message_type:
case MessageType.method_call:
@ -67,7 +58,17 @@ class DBusInterface:
method = getattr(self, msg.header.fields[HeaderFields.member])
if callable(method):
return_msg = method(msg)
method_data = method(msg)
if isinstance(method_data, tuple):
post_action, return_msg = method_data
else:
if callable(method_data):
post_action = method_data
else:
return_msg = method_data
else:
return_msg = new_error(msg, *DBusErrors.unknownMethod(method_name))
@ -75,8 +76,13 @@ class DBusInterface:
else:
return_msg = new_error(msg, *DBusErrors.unknownMethod(method_name))
if return_msg is not None:
self.server.bus.send_message(return_msg)
if return_msg is None:
return_msg = new_method_return(msg)
self.server.bus.send_message(return_msg)
if not post_action is None:
post_action()
def get(self, msg: Message):
prop_name: str = msg.body[1]
@ -85,7 +91,13 @@ class DBusInterface:
prop = getattr(self, prop_name)
if callable(prop):
return prop()
prop_value = prop(msg)
signature = prop_value[0]
value = prop_value[1]
return_msg = new_method_return(msg, "v", (prop_value,))
return return_msg
return new_error(msg, *DBusErrors.unknownProperty(prop_name))