#!/usr/bin/python3 from .utils import * class MPRISPlayer(DBusInterface): def __init__(self, server, interface): super().__init__(server, interface) self.playback_status = "Stopped" self.loop_status = "None" self.shuffle = False self.metadata = { "mpris:trackid": ("o", "/org/bla/gubber"), # random junk, no functionality "mpris:length": ("x", 0), "mpris:artUrl": ("s", "file://" + self.server.app.utils.wobuzz_location + "/icon.svg"), } self.volume = 1.0 def get_all(self): body = ({ "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), "CanPlay": ("b", True), "CanPause": ("b", True), "CanSeek": ("b", True), "CanControl": ("b", True) },) return body # ======== 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() def PlayPause(self, msg: Message): 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 def Metadata(self, msg: Message): 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