diff options
Diffstat (limited to '')
-rw-r--r-- | i3pystatus/.config/i3pystatus/conf.py (renamed from i3pystatus/conf.py) | 46 | ||||
-rwxr-xr-x | i3pystatus/.config/i3pystatus/get_volume.sh | 3 | ||||
-rw-r--r-- | i3pystatus/.config/i3pystatus_modules/now_playing.py | 162 |
3 files changed, 198 insertions, 13 deletions
diff --git a/i3pystatus/conf.py b/i3pystatus/.config/i3pystatus/conf.py index 6f29414..9202272 100644 --- a/i3pystatus/conf.py +++ b/i3pystatus/.config/i3pystatus/conf.py @@ -4,7 +4,7 @@ from i3pystatus import Status status = Status(logfile='/home/neodarz/i3pystatus.log') status.register("text", - text=" ░▒▓█",) + text=" :: ",) status.register("keyboard_locks", format="{caps} {num}", @@ -13,18 +13,18 @@ status.register("keyboard_locks", num_off="",) status.register("text", - text=" ░▒▓█▓▒░ ", + text=" :: ", hints = {"separator": False, "separator_block_width": 0},) # Displays clock like this: # Tue 30 Jul 11:59:46 PM KW31 # ^-- calendar week status.register("clock", - format=" %a %-d %b %X", + format="%a %-d %b :: %X", hints = {"separator": False, "separator_block_width": 0},) status.register("text", - text=" ░▒▓█▓▒░ ", + text=" :: ", hints = {"separator": False, "separator_block_width": 0},) @@ -74,16 +74,16 @@ status.register("text", # Note: the network module requires PyPI package netifaces status.register("network", dynamic_color=True, - start_color="#138491", - color_down="#138491", - end_color="#138491", + start_color="#420034", + color_down="#420034", + end_color="#420034", interface="enp3s0", - format_up="<span color=\"#138491\"> {v4cidr}</span>", - format_down="<span color=\"#138491\"></span>", + format_up="<span color=\"#420034\"> {v4cidr}</span>", + format_down="<span color=\"#420034\"></span>", hints = {"markup": "pango", "separator": False, "separator_block_width": 0},) status.register("text", - text=" ░▒▓█▓▒░ ", + text=" :: ", hints = {"separator": False, "separator_block_width": 0},) # Note: requires both netifaces and basiciw (for essid and quality) @@ -97,13 +97,23 @@ status.register("text", # 42/128G [86G] status.register("disk", path="/", - format=" {avail}G", + format="[ / ] {avail}G", hints = {"separator": False, "separator_block_width": 0},) status.register("text", - text=" ░▒▓█▓▒░ ", + text=" :: ", hints = {"separator": False, "separator_block_width": 0},) +status.register("disk", + path="/home", + format="[ /home ] {avail}G", + hints = {"separator": False, "separator_block_width": 0},) + +status.register("text", + text=" :: ", + hints = {"separator": False, "separator_block_width": 0},) + + # Shows pulseaudio default sink volume # # Note: requires libpulseaudio from PyPI @@ -112,7 +122,17 @@ status.register("pulseaudio", hints = {"separator": False, "separator_block_width": 0},) status.register("text", - text=" █▓▒░ ", + text=" :: ", + hints = {"separator": False, "separator_block_width": 0},) + + +status.register("shell", + command="sh ~/.config/i3pystatus/get_volume.sh", + interval=1, + hints = {"separator": False, "separator_block_width": 0},) + +status.register("text", + text=" :: ", hints = {"separator": False, "separator_block_width": 0},) #status.register("backlight", diff --git a/i3pystatus/.config/i3pystatus/get_volume.sh b/i3pystatus/.config/i3pystatus/get_volume.sh new file mode 100755 index 0000000..e0372f2 --- /dev/null +++ b/i3pystatus/.config/i3pystatus/get_volume.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +echo $(if [[ $(echo $(pacmd list | grep "active port") | cut -d" " -f3 | cut -d"<" -f2 | cut -d">" -f1) == "analog-output-lineout" ]]; then echo "Headphones"; elif [[ $(echo $(pacmd list | grep "active port") | cut -d" " -f3 | cut -d"<" -f2 | cut -d">" -f1) == "analog-output-headphones" ]]; then echo "Line Out"; fi) diff --git a/i3pystatus/.config/i3pystatus_modules/now_playing.py b/i3pystatus/.config/i3pystatus_modules/now_playing.py new file mode 100644 index 0000000..0be2825 --- /dev/null +++ b/i3pystatus/.config/i3pystatus_modules/now_playing.py @@ -0,0 +1,162 @@ + +import functools +from os.path import basename + +import dbus + +from i3pystatus import IntervalModule, formatp +from i3pystatus.core.util import TimeWrapper + + +class NoPlayerException(Exception): + pass + + +class NowPlaying(IntervalModule): + """ + Shows currently playing track information, supports most media players + + * Requires python-dbus available from every distros' package manager. + + Left click on the module play/pauses, right click goes to the next track. + + .. rubric:: Available formatters (uses :ref:`formatp`) + + * `{title}` — (the title of the current song) + * `{album}` — (the album of the current song, can be an empty string (e.g. for online streams)) + * `{artist}` — (can be empty, too) + * `{filename}` — (file name with out extension and path; empty unless title is empty) + * `{song_elapsed}` — (position in the currently playing song, uses :ref:`TimeWrapper`, default is `%m:%S`) + * `{song_length}` — (length of the current song, same as song_elapsed) + * `{status}` — (play, pause, stop mapped through the `status` dictionary) + * `{volume}` — (volume) + """ + + interval = 1 + + settings = ( + ("player", "Player name. If not set, compatible players will be \ + detected automatically."), + ("status", "Dictionary mapping pause, play and stop to output text"), + ("format", "formatp string"), + ("color", "Text color"), + ("format_no_player", "Text to show if no player is detected"), + ("color_no_player", "Text color when no player is detected"), + ("hide_no_player", "Hide output if no player is detected"), + ) + + hide_no_player = True + format_no_player = "No Player" + color_no_player = "#ffffff" + + format = "{title} {status}" + color = "#ffffff" + status = { + "pause": "▷", + "play": "▶", + "stop": "◾", + } + statusmap = { + "Playing": "playd", + "Paused": "pause", + "Stopped": "stop", + } + + on_leftclick = "playpause" + on_rightclick = "next_song" + + player = None + old_player = None + + def find_player(self): + players = [a for a in dbus.SessionBus().get_object("org.freedesktop.DBus", "/org/freedesktop/DBus").ListNames() if a.startswith("org.mpris.MediaPlayer2.")] + if self.old_player in players: + return self.old_player + if not players: + raise NoPlayerException() + self.old_player = players[0] + return players[0] + + def get_player(self): + if self.player: + player = "org.mpris.MediaPlayer2." + self.player + try: + return dbus.SessionBus().get_object(player, "/org/mpris/MediaPlayer2") + except dbus.exceptions.DBusException: + raise NoPlayerException() + else: + player = self.find_player() + return dbus.SessionBus().get_object(player, "/org/mpris/MediaPlayer2") + + def run(self): + try: + player = self.get_player() + properties = dbus.Interface(player, "org.freedesktop.DBus.Properties") + get_prop = functools.partial(properties.Get, "org.mpris.MediaPlayer2.Player") + currentsong = get_prop("Metadata") + + current_status = get_prop("PlaybackStatus") + fdict = { + "status": self.status[self.statusmap[current_status]], + "len": 0, # TODO: Use optional(!) TrackList interface for this to gain 100 % mpd<->now_playing compat + "pos": 0, + "volume": int(get_prop("Volume") * 100), + + "title": currentsong.get("xesam:title", ""), + "album": currentsong.get("xesam:album", ""), + "artist": ", ".join(currentsong.get("xesam:artist", "")), + "song_length": TimeWrapper((currentsong.get("mpris:length") or 0) / 1000 ** 2), + "song_elapsed": TimeWrapper((get_prop("Position") or 0) / 1000 ** 2), + "filename": "", + } + + if not fdict["title"]: + fdict["filename"] = '.'.join( + basename((currentsong.get("xesam:url") or "")).split('.')[:-1]) + + if current_status in ["Stopped", "Paused"]: + self.output = { + "full_text": self.status["play"], + "color": self.color, + } + else: + self.output = { + "full_text": formatp(self.format, **fdict).strip(), + "color": self.color, + } + + except NoPlayerException: + if self.hide_no_player: + self.output = None + else: + self.output = { + "full_text": self.format_no_player, + "color": self.color_no_player, + } + return + + except dbus.exceptions.DBusException as e: + if self.hide_no_player: + self.output = None + else: + self.output = { + "full_text": "DBus error: " + e.get_dbus_message(), + "color": "#ff0000", + } + return + + def playpause(self): + try: + dbus.Interface(self.get_player(), "org.mpris.MediaPlayer2.Player").PlayPause() + except NoPlayerException: + return + except dbus.exceptions.DBusException: + return + + def next_song(self): + try: + dbus.Interface(self.get_player(), "org.mpris.MediaPlayer2.Player").Next() + except NoPlayerException: + return + except dbus.exceptions.DBusException: + return |