2025-04-16 16:57:01 +02:00
|
|
|
#!/usr/bin/python3
|
|
|
|
|
|
|
|
from .utils import *
|
|
|
|
|
|
|
|
|
|
|
|
class MPRISPlayer(DBusInterface):
|
|
|
|
def __init__(self, server, interface):
|
|
|
|
super().__init__(server, interface)
|
|
|
|
|
2025-04-18 19:35:13 +02:00
|
|
|
self.playback_status = "Stopped"
|
|
|
|
self.loop_status = "None"
|
|
|
|
self.shuffle = False
|
2025-04-16 16:57:01 +02:00
|
|
|
self.metadata = {
|
2025-04-18 19:35:13 +02:00
|
|
|
"mpris:trackid": ("o", "/org/bla/gubber"), # random junk, no functionality
|
|
|
|
"mpris:length": ("x", 0),
|
2025-04-19 13:36:11 +02:00
|
|
|
"mpris:artUrl": ("s", "file://" + self.server.app.utils.wobuzz_location + "/icon.svg"),
|
2025-04-16 16:57:01 +02:00
|
|
|
}
|
2025-04-18 19:35:13 +02:00
|
|
|
self.volume = 1.0
|
2025-04-16 16:57:01 +02:00
|
|
|
|
|
|
|
def get_all(self):
|
|
|
|
body = ({
|
2025-04-18 19:35:13 +02:00
|
|
|
"PlaybackStatus": ("s", self.playback_status),
|
|
|
|
"LoopStatus": ("s", self.loop_status),
|
|
|
|
"Rate": ("d", 1.0),
|
|
|
|
"Shuffle": ("b", self.shuffle),
|
|
|
|
"Metadata": ("a{sv}", self.metadata),
|
|
|
|
"Volume": ("d", self.volume),
|
|
|
|
"Position": ("x", self.server.app.player.get_progress() * 1000), # milliseconds to microseconds
|
|
|
|
"MinimumRate": ("d", 1.0),
|
|
|
|
"MaximumRate": ("d", 1.0),
|
|
|
|
"CanGoNext": ("b", True),
|
|
|
|
"CanGoPrevious": ("b", True),
|
2025-04-16 16:57:01 +02:00
|
|
|
"CanPlay": ("b", True),
|
2025-04-18 19:35:13 +02:00
|
|
|
"CanPause": ("b", True),
|
|
|
|
"CanSeek": ("b", True),
|
|
|
|
"CanControl": ("b", True)
|
2025-04-16 16:57:01 +02:00
|
|
|
},)
|
|
|
|
|
|
|
|
return body
|
|
|
|
|
2025-04-18 19:35:13 +02:00
|
|
|
# ======== Methods ========
|
|
|
|
|
|
|
|
def Next(self, msg: Message):
|
|
|
|
self.server.app.player.next_track()
|
|
|
|
|
|
|
|
def Previous(self, msg: Message):
|
|
|
|
self.server.app.player.previous_track()
|
|
|
|
|
|
|
|
def Pause(self, msg: Message):
|
|
|
|
return lambda: self.server.app.player.toggle_playing()
|
2025-04-16 16:57:01 +02:00
|
|
|
|
|
|
|
def PlayPause(self, msg: Message):
|
2025-04-18 19:35:13 +02:00
|
|
|
return lambda: self.server.app.player.toggle_playing()
|
|
|
|
|
|
|
|
def Stop(self, msg: Message):
|
|
|
|
self.server.app.player.stop()
|
|
|
|
|
|
|
|
def Play(self, msg: Message):
|
|
|
|
return lambda: self.server.app.player.toggle_playing()
|
|
|
|
|
|
|
|
def Seek(self, msg: Message):
|
|
|
|
seek_forward = msg.body[0] // 1000 # microseconds to milliseconds
|
|
|
|
new_position = self.server.app.player.get_progress() + seek_forward
|
|
|
|
self.server.app.player.seek(new_position)
|
|
|
|
|
|
|
|
def SetPosition(self, msg: Message):
|
|
|
|
trackid = msg.body[0]
|
|
|
|
position = msg.body[1] // 1000 # microseconds to milliseconds
|
|
|
|
|
|
|
|
self.server.app.player.seek(position)
|
|
|
|
|
|
|
|
def OpenUri(self, msg: Message):
|
|
|
|
pass
|
|
|
|
|
|
|
|
# ======== Properties ========
|
|
|
|
|
|
|
|
def PlaybackStatus(self, msg: Message):
|
|
|
|
return "s", self.playback_status
|
|
|
|
|
|
|
|
def LoopStatus(self, msg: Message):
|
|
|
|
return "s", self.loop_status
|
|
|
|
|
|
|
|
def Rate(self, msg: Message):
|
|
|
|
return "d", 1.0
|
|
|
|
|
|
|
|
def Shuffle(self, msg: Message):
|
|
|
|
return "b", self.shuffle
|
2025-04-16 16:57:01 +02:00
|
|
|
|
|
|
|
def Metadata(self, msg: Message):
|
2025-04-18 19:35:13 +02:00
|
|
|
return "a{sv}", self.metadata
|
|
|
|
|
|
|
|
def Volume(self, msg: Message):
|
|
|
|
return "d", self.volume
|
|
|
|
|
|
|
|
def Position(self, msg: Message):
|
|
|
|
return "x", self.server.app.player.get_progress() * 1000 # milliseconds to microseconds
|
|
|
|
|
|
|
|
def MinimumRate(self, msg: Message):
|
|
|
|
return "d", 1.0
|
|
|
|
|
|
|
|
def MaximumRate(self, msg: Message):
|
|
|
|
return "d", 1.0
|
|
|
|
|
|
|
|
def CanGoNext(self, msg: Message):
|
|
|
|
return "b", True
|
|
|
|
|
|
|
|
def CanGoPrevious(self, msg: Message):
|
|
|
|
return "b", True
|
|
|
|
|
|
|
|
def CanPlay(self, msg: Message):
|
|
|
|
return "b", True
|
|
|
|
|
|
|
|
def CanPause(self, msg: Message):
|
|
|
|
return "b", True
|
|
|
|
|
|
|
|
def CanSeek(self, msg: Message):
|
|
|
|
return "b", True
|
|
|
|
|
|
|
|
def CanControl(self, msg: Message):
|
|
|
|
return "b", True
|
|
|
|
|
2025-04-16 16:57:01 +02:00
|
|
|
|