aboutsummaryrefslogtreecommitdiff
path: root/i3pystatus
diff options
context:
space:
mode:
Diffstat (limited to 'i3pystatus')
-rw-r--r--i3pystatus/.config/i3pystatus/conf.py (renamed from i3pystatus/conf.py)46
-rwxr-xr-xi3pystatus/.config/i3pystatus/get_volume.sh3
-rw-r--r--i3pystatus/.config/i3pystatus_modules/now_playing.py162
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