pastabowl

dbusd

Nov 5th, 2025
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.47 KB | Source Code | 0 0
  1. from PyQt6.QtCore import QObject, QTimer, pyqtSlot as Slot
  2. from PyQt6.QtDBus import QDBusConnection, QDBusInterface, QDBusMessage, QDBusVariant, QDBusReply
  3.  
  4.  
  5. class MPRISMonitor(QObject):
  6.     def __init__(self):
  7.         super().__init__()
  8.  
  9.         self.updateTimer: QTimer = QTimer()
  10.         self.updateTimer.timeout.connect(self.updatePosition)
  11.  
  12.         self.session = QDBusConnection.sessionBus()
  13.         self.playerList: list[str] = self.getPlayers()
  14.  
  15.         self.playerInterface: QDBusInterface | None = None
  16.         self.connectedService: str = ""
  17.         if len(self.playerList) > 0:
  18.             self.playerInterface = MPRISMonitor.getPlayerInterface(self.playerList[0])
  19.  
  20.             self.session.connect(
  21.                 self.connectedService,
  22.                 "/org/mpris/MediaPlayer2",
  23.                 "org.freedesktop.DBus.Properties",
  24.                 "PropertiesChanged",
  25.                 self.handlePropertiesChanged
  26.             )
  27.  
  28.         self.metadata: dict = {}
  29.         self.state: str = ""
  30.         self.position: int = 0
  31.  
  32.         self.updateTimer.start(5000)
  33.  
  34.     def getPlayers(self) -> list[str]:
  35.         """Return a list of all active MPRIS player service names."""
  36.         reply = self.session.interface().registeredServiceNames()
  37.         mediaPlayers: list[str] = []
  38.         for s in str(reply.value()).split("\', \'"):
  39.             if s.startswith("org.mpris.MediaPlayer2."):
  40.                 mediaPlayers.append(s)
  41.         return mediaPlayers
  42.  
  43.     @staticmethod
  44.     def getPlayerInterface(serviceName: str):
  45.         """Get a DBus interface for a given player."""
  46.         return QDBusInterface(
  47.             serviceName,
  48.             "/org/mpris/MediaPlayer2",
  49.             "org.freedesktop.DBus.Properties",
  50.             QDBusConnection.sessionBus()
  51.         )
  52.  
  53.     def getMetadata(self):
  54.         msg: QDBusMessage = self.playerInterface.call("Get", "org.mpris.MediaPlayer2.Player", "Metadata")
  55.         if msg.arguments():
  56.             self.metadata = msg.arguments()[0].variant()
  57.  
  58.         return self.metadata
  59.  
  60.     def getState(self):
  61.         msg = self.playerInterface.call("Get", "org.mpris.MediaPlayer2.Player", "PlaybackStatus")
  62.         if msg.arguments():
  63.             return msg.arguments()[0].variant()
  64.         return None
  65.  
  66.     def getPosition(self):
  67.         if self.playerInterface is None: return 0
  68.         msg = self.playerInterface.call("Get", "org.mpris.MediaPlayer2.Player", "Position")
  69.         if type(msg.arguments()[0]) is int:
  70.             return msg.arguments()[0] / 1000000  # µs → s
  71.         print(type(msg.arguments()))
  72.         return 0
  73.  
  74.     @Slot(QDBusMessage)
  75.     def handlePropertiesChanged(self, msg: QDBusMessage):
  76.         args = msg.arguments()
  77.         if len(args) < 2:
  78.             return
  79.         changed = args[1]  # dict of changed properties
  80.         if not isinstance(changed, dict):
  81.             return
  82.  
  83.         if "Metadata" in changed:
  84.             cMetadata = changed["Metadata"]
  85.             if cMetadata != self.metadata:
  86.                 self.metadata = cMetadata
  87.  
  88.         if "PlaybackStatus" in changed:
  89.             cState = changed["PlaybackStatus"]
  90.             if cState != self.state:
  91.                 print(f"▶️  Playback state: {cState}")
  92.                 self.state = cState
  93.  
  94.         print("Change detected! TBI")
  95.  
  96.     def updatePosition(self):
  97.         pos = self.getPosition()
  98.         if abs(pos - self.position) > 2:
  99.             print(f"⏱️  Position: {pos:.1f}s")
  100.             self.position = pos
Advertisement
Add Comment
Please, Sign In to add comment