summaryrefslogtreecommitdiff
path: root/.config/polybar/spotify_status.py
diff options
context:
space:
mode:
Diffstat (limited to '.config/polybar/spotify_status.py')
-rw-r--r--.config/polybar/spotify_status.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/.config/polybar/spotify_status.py b/.config/polybar/spotify_status.py
new file mode 100644
index 00000000..ff948f95
--- /dev/null
+++ b/.config/polybar/spotify_status.py
@@ -0,0 +1,141 @@
+#!/usr/bin/env python
+
+import sys
+import dbus
+import argparse
+
+parser = argparse.ArgumentParser()
+parser.add_argument(
+ '-t',
+ '--trunclen',
+ type=int,
+ metavar='trunclen'
+)
+parser.add_argument(
+ '-f',
+ '--format',
+ type=str,
+ metavar='custom format',
+ dest='custom_format'
+)
+parser.add_argument(
+ '-p',
+ '--playpause',
+ type=str,
+ metavar='play-pause indicator',
+ dest='play_pause'
+)
+parser.add_argument(
+ '--font',
+ type=str,
+ metavar='the index of the font to use for the main label',
+ dest='font'
+)
+parser.add_argument(
+ '--playpause-font',
+ type=str,
+ metavar='the index of the font to use to display the playpause indicator',
+ dest='play_pause_font'
+)
+parser.add_argument(
+ '-q',
+ '--quiet',
+ action='store_true',
+ help="if set, don't show any output when the current song is paused",
+ dest='quiet',
+)
+
+args = parser.parse_args()
+
+
+def fix_string(string):
+ # corrects encoding for the python version used
+ if sys.version_info.major == 3:
+ return string
+ else:
+ return string.encode('utf-8')
+
+
+def truncate(name, trunclen):
+ if len(name) > trunclen:
+ name = name[:trunclen]
+ name += '...'
+ if ('(' in name) and (')' not in name):
+ name += ')'
+ return name
+
+
+
+# Default parameters
+output = fix_string(u'{play_pause} {artist}: {song}')
+trunclen = 35
+play_pause = fix_string(u'\u25B6,\u23F8') # first character is play, second is paused
+
+label_with_font = '%{{T{font}}}{label}%{{T-}}'
+font = args.font
+play_pause_font = args.play_pause_font
+
+quiet = args.quiet
+
+# parameters can be overwritten by args
+if args.trunclen is not None:
+ trunclen = args.trunclen
+if args.custom_format is not None:
+ output = args.custom_format
+if args.play_pause is not None:
+ play_pause = args.play_pause
+
+try:
+ session_bus = dbus.SessionBus()
+ spotify_bus = session_bus.get_object(
+ 'org.mpris.MediaPlayer2.spotify',
+ '/org/mpris/MediaPlayer2'
+ )
+
+ spotify_properties = dbus.Interface(
+ spotify_bus,
+ 'org.freedesktop.DBus.Properties'
+ )
+
+ metadata = spotify_properties.Get('org.mpris.MediaPlayer2.Player', 'Metadata')
+ status = spotify_properties.Get('org.mpris.MediaPlayer2.Player', 'PlaybackStatus')
+
+ # Handle play/pause label
+
+ play_pause = play_pause.split(',')
+
+ if status == 'Playing':
+ play_pause = play_pause[0]
+ elif status == 'Paused':
+ play_pause = play_pause[1]
+ else:
+ play_pause = str()
+
+ if play_pause_font:
+ play_pause = label_with_font.format(font=play_pause_font, label=play_pause)
+
+ # Handle main label
+
+ artist = fix_string(metadata['xesam:artist'][0]) if metadata['xesam:artist'] else ''
+ song = fix_string(metadata['xesam:title']) if metadata['xesam:title'] else ''
+ album = fix_string(metadata['xesam:album']) if metadata['xesam:album'] else ''
+
+ if (quiet and status == 'Paused') or (not artist and not song and not album):
+ print('')
+ else:
+ if font:
+ artist = label_with_font.format(font=font, label=artist)
+ song = label_with_font.format(font=font, label=song)
+ album = label_with_font.format(font=font, label=album)
+
+ # Add 4 to trunclen to account for status symbol, spaces, and other padding characters
+ print(truncate(output.format(artist=artist,
+ song=song,
+ play_pause=play_pause,
+ album=album), trunclen + 4))
+
+except Exception as e:
+ if isinstance(e, dbus.exceptions.DBusException):
+ print('')
+ else:
+ print(e)