Merge pull request #663 from LtPeriwinkle/spotify-buttons-module

Spotify buttons module
This commit is contained in:
tobi-wan-kenobi 2020-06-25 19:56:21 +02:00 committed by GitHub
commit 54f6035e14
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,24 +1,3 @@
# pylint: disable=C0111,R0903
"""Displays the current song being played
Requires the following library:
* python-dbus
Parameters:
* spotify.format: Format string (defaults to '{artist} - {title}')
Available values are: {album}, {title}, {artist}, {trackNumber}, {playbackStatus}
* spotify.previous: Change binding for previous song (default is left click)
* spotify.next: Change binding for next song (default is right click)
* spotify.pause: Change binding for toggling pause (default is middle click)
Available options for spotify.previous, spotify.next and spotify.pause are:
LEFT_CLICK, RIGHT_CLICK, MIDDLE_CLICK, SCROLL_UP, SCROLL_DOWN
contributed by `yvesh <https://github.com/yvesh>`_ - many thanks!
"""
import sys import sys
import dbus import dbus
@ -26,62 +5,98 @@ import core.module
import core.widget import core.widget
import core.input import core.input
import core.decorators import core.decorators
import util.format
"""Displays the current song being played and allows pausing, skipping ahead, and skipping back.
Requires the following library:
* python-dbus
Parameters:
* spotify.format: Format string (defaults to '{artist} - {title}')
Available values are: {album}, {title}, {artist}, {trackNumber}
* spotify.layout: Comma-separated list to change order of widgets (defaults to song, previous, pause, next)
Widget names are: spotify.song, spotify.prev, spotify.pause, spotify.next
"""
class Module(core.module.Module): class Module(core.module.Module):
def __init__(self, config, theme): def __init__(self, config, theme):
super().__init__(config, theme, core.widget.Widget(self.spotify)) super().__init__(config, theme, [])
buttons = { self.__layout = self.parameter(
"LEFT_CLICK": core.input.LEFT_MOUSE, "layout",
"RIGHT_CLICK": core.input.RIGHT_MOUSE, util.format.aslist("spotify.song,spotify.prev,spotify.pause,spotify.next"),
"MIDDLE_CLICK": core.input.MIDDLE_MOUSE, )
"SCROLL_UP": core.input.WHEEL_UP,
"SCROLL_DOWN": core.input.WHEEL_DOWN,
}
self.__song = "" self.__song = ""
self.__pause = ""
self.__format = self.parameter("format", "{artist} - {title}") self.__format = self.parameter("format", "{artist} - {title}")
prev_button = self.parameter("previous", "LEFT_CLICK")
next_button = self.parameter("next", "RIGHT_CLICK")
pause_button = self.parameter("pause", "MIDDLE_CLICK")
cmd = "dbus-send --session --type=method_call --dest=org.mpris.MediaPlayer2.spotify \ self.__cmd = "dbus-send --session --type=method_call --dest=org.mpris.MediaPlayer2.spotify \
/org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player." /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player."
core.input.register(self, button=buttons[prev_button], cmd=cmd + "Previous")
core.input.register(self, button=buttons[next_button], cmd=cmd + "Next")
core.input.register(self, button=buttons[pause_button], cmd=cmd + "PlayPause")
@core.decorators.scrollable
def spotify(self, widget):
return self.string_song
def hidden(self): def hidden(self):
return self.string_song == "" return self.string_song == ""
def update(self): def __get_song(self):
try: bus = dbus.SessionBus()
bus = dbus.SessionBus() spotify = bus.get_object(
spotify = bus.get_object( "org.mpris.MediaPlayer2.spotify", "/org/mpris/MediaPlayer2"
"org.mpris.MediaPlayer2.spotify", "/org/mpris/MediaPlayer2" )
) spotify_iface = dbus.Interface(spotify, "org.freedesktop.DBus.Properties")
spotify_iface = dbus.Interface(spotify, "org.freedesktop.DBus.Properties") props = spotify_iface.Get("org.mpris.MediaPlayer2.Player", "Metadata")
props = spotify_iface.Get("org.mpris.MediaPlayer2.Player", "Metadata") playback_status = str(
playback_status = str( spotify_iface.Get("org.mpris.MediaPlayer2.Player", "PlaybackStatus")
spotify_iface.Get("org.mpris.MediaPlayer2.Player", "PlaybackStatus") )
) if playback_status == "Playing":
self.__pause = "\u258D\u258D"
else:
self.__pause = "\u25B6"
self.__song = self.__format.format( self.__song = self.__format.format(
album=str(props.get("xesam:album")), album=str(props.get("xesam:album")),
title=str(props.get("xesam:title")), title=str(props.get("xesam:title")),
artist=",".join(props.get("xesam:artist")), artist=",".join(props.get("xesam:artist")),
trackNumber=str(props.get("xesam:trackNumber")), trackNumber=str(props.get("xesam:trackNumber")),
playbackStatus="\u25B6"
if playback_status == "Playing"
else "\u258D\u258D"
if playback_status == "Paused"
else "",
) )
def update(self):
try:
self.clear_widgets()
self.__get_song()
widget_map = {}
for widget_name in self.__layout:
widget = self.add_widget(name=widget_name)
if widget_name == "spotify.prev":
widget_map[widget] = {
"button": core.input.LEFT_MOUSE,
"cmd": self.__cmd + "Previous",
}
widget.full_text("\u258F\u25C0")
elif widget_name == "spotify.pause":
widget_map[widget] = {
"button": core.input.LEFT_MOUSE,
"cmd": self.__cmd + "PlayPause",
}
widget.full_text(self.__pause)
elif widget_name == "spotify.next":
widget_map[widget] = {
"button": core.input.LEFT_MOUSE,
"cmd": self.__cmd + "Next",
}
widget.full_text("\u25B6\u2595")
elif widget_name == "spotify.song":
widget.full_text(self.__song)
else:
raise KeyError(
"The spotify module does not have a {widget_name!r} widget".format(
widget_name=widget_name
)
)
for widget, callback_options in widget_map.items():
core.input.register(widget, **callback_options)
except Exception: except Exception:
self.__song = "" self.__song = ""
@ -90,6 +105,3 @@ class Module(core.module.Module):
if sys.version_info.major < 3: if sys.version_info.major < 3:
return unicode(self.__song) return unicode(self.__song)
return str(self.__song) return str(self.__song)
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4