Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
from PyQt6.QtCore import QObject, QTimer, pyqtSlot as Slot from PyQt6.QtDBus import QDBusConnection, QDBusInterface, QDBusMessage, QDBusVariant, QDBusReply class MPRISMonitor(QObject): def __init__(self): super().__init__() self.updateTimer: QTimer = QTimer() self.updateTimer.timeout.connect(self.updatePosition) self.session = QDBusConnection.sessionBus() self.playerList: list[str] = self.getPlayers() self.playerInterface: QDBusInterface | None = None self.connectedService: str = "" if len(self.playerList) > 0: self.playerInterface = MPRISMonitor.getPlayerInterface(self.playerList[0]) self.session.connect( self.connectedService, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "PropertiesChanged", self.handlePropertiesChanged ) self.metadata: dict = {} self.state: str = "" self.position: int = 0 self.updateTimer.start(5000) def getPlayers(self) -> list[str]: """Return a list of all active MPRIS player service names.""" reply = self.session.interface().registeredServiceNames() mediaPlayers: list[str] = [] for s in str(reply.value()).split("\', \'"): if s.startswith("org.mpris.MediaPlayer2."): mediaPlayers.append(s) return mediaPlayers @staticmethod def getPlayerInterface(serviceName: str): """Get a DBus interface for a given player.""" return QDBusInterface( serviceName, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", QDBusConnection.sessionBus() ) def getMetadata(self): msg: QDBusMessage = self.playerInterface.call("Get", "org.mpris.MediaPlayer2.Player", "Metadata") if msg.arguments(): self.metadata = msg.arguments()[0].variant() return self.metadata def getState(self): msg = self.playerInterface.call("Get", "org.mpris.MediaPlayer2.Player", "PlaybackStatus") if msg.arguments(): return msg.arguments()[0].variant() return None def getPosition(self): if self.playerInterface is None: return 0 msg = self.playerInterface.call("Get", "org.mpris.MediaPlayer2.Player", "Position") if type(msg.arguments()[0]) is int: return msg.arguments()[0] / 1000000 # µs → s print(type(msg.arguments())) return 0 @Slot(QDBusMessage) def handlePropertiesChanged(self, msg: QDBusMessage): args = msg.arguments() if len(args) < 2: return changed = args[1] # dict of changed properties if not isinstance(changed, dict): return if "Metadata" in changed: cMetadata = changed["Metadata"] if cMetadata != self.metadata: self.metadata = cMetadata if "PlaybackStatus" in changed: cState = changed["PlaybackStatus"] if cState != self.state: print(f"▶️ Playback state: {cState}") self.state = cState print("Change detected! TBI") def updatePosition(self): pos = self.getPosition() if abs(pos - self.position) > 2: print(f"⏱️ Position: {pos:.1f}s") self.position = pos
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)