# Copyright (C) 2022, ThanosApollo # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import dbus import dbus_next import subprocess from functools import partial from libqtile.widget import base class Spotify(base.ThreadPoolText): """A simple Spotify widget. Show the song and artist of now listening song and allow basic mouse control from the bar using spotify-control: - toggle pause (or play if stopped) on left click; - skip forward in playlist on scroll up; - skip backward in playlist on scroll down. """ defaults = [ ("play_color", "00ff00", "Text colour when playing."), ("noplay_color", "cecece", "Text colour when not playing."), ("update_interval", 0.5, "Update Time in seconds."), ] def __init__(self, **config): base.ThreadPoolText.__init__(self, "", **config) self.add_defaults(Spotify.defaults) self.status = "PLAY" self.local = None self.add_callbacks( { "Button1": partial(subprocess.Popen, ["spotify-control", "play-pause"]), "Button2": partial(subprocess.Popen, ["spotify-control", "previous"]), "Button3": partial(subprocess.Popen, ["spotify-control", "next"]), } ) def now_playing(self): """Return current song""" session_bus = dbus.SessionBus() bus_data = ("org.mpris.MediaPlayer2.spotify", "/org/mpris/MediaPlayer2") spotify_bus = session_bus.get_object(*bus_data) interface = dbus.Interface(spotify_bus, "org.freedesktop.DBus.Properties") metadata = interface.Get("org.mpris.MediaPlayer2.Player", "Metadata") data = { "artist" : next(iter(metadata.get("xesam:albumArtist"))), "song" : metadata.get("xesam:title") } song = data["song"] + " | " + data["artist"] self.layout.colour = self.play_color return song def poll(self): """Poll content for the text box.""" return self.now_playing()