summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorVasiliy Horbachenko <shadowprince47@gmail.com>2014-05-24 00:07:52 +0300
committerVasiliy Horbachenko <shadowprince47@gmail.com>2014-05-24 00:07:52 +0300
commitfbac7ee6d51f82756e3cd17a31f7d212f5f6dd3c (patch)
treeb227bdc7c6a597edd93927ff7b6ec5e0b3777ac9 /modules
parent61db2ac48f633db4d1b7c3ee82fa8baf06f3e82b (diff)
mpd module
Diffstat (limited to 'modules')
-rw-r--r--modules/battery-level.py4
-rw-r--r--modules/current-title.py5
-rw-r--r--modules/mpd.py112
3 files changed, 118 insertions, 3 deletions
diff --git a/modules/battery-level.py b/modules/battery-level.py
index 02b7e43..fb3b769 100644
--- a/modules/battery-level.py
+++ b/modules/battery-level.py
@@ -6,6 +6,10 @@ import math
"""
Module for displaying information about battery.
+
+@author shadowprince
+@version 1.0
+@license Eclipse Public License
"""
CACHE_TIME = 30 # time to update battery
diff --git a/modules/current-title.py b/modules/current-title.py
index e2f5aef..530908f 100644
--- a/modules/current-title.py
+++ b/modules/current-title.py
@@ -4,9 +4,8 @@ import time
"""
Py3status plugin - shows current window title.
-DEPENDENCIES:
- Depends on i3-py!
- pip install i3-py
+DEPENDENCIES: Depends on i3-py:
+ # pip install i3-py
If payload from server contains wierd utf-8 (for example one window have something bad in title) - plugin will give empty output UNTIL this window will be closed. I can't fix or workaround that in PLUGIN, problem is in i3-py library.
diff --git a/modules/mpd.py b/modules/mpd.py
new file mode 100644
index 0000000..e94872c
--- /dev/null
+++ b/modules/mpd.py
@@ -0,0 +1,112 @@
+from mpd import (MPDClient, CommandError)
+from socket import error as SocketError
+import time
+import re
+
+"""
+Mpd - module to show information from mpd to your's bar! Settings listed above.
+DEPENDENCIES: python-mpd2 (NOT python2-mpd2):
+ # pip install python-mpd2
+
+@author shadowprince
+@version 1.0
+@license Eclipse Public License
+"""
+
+# mpd settings
+HOST = "localhost"
+PORT = "6600"
+PASSWORD = None
+
+# time to update
+CACHED_TIME = 1
+
+# position
+POSITION = 1
+
+# if text length will be greater - it'll shrink it
+MAX_WIDTH = 120
+
+# hide any indicator, if
+HIDE_WHEN_PAUSED = False
+HIDE_WHEN_STOPPED = True
+
+# state characters (or strings). Actual of them replaces {state} placeholder in STRFORMAT
+STATE_CHARACTERS = {
+ "pause": "[pause]",
+ "play": "[play]",
+ "stop": "[stop]",
+}
+
+""" format of result string
+can contain:
+ {state} - current state from STATE_CHARACTERS
+ Track information:
+ {track}, {artist}, {title}, {time}, {album}, {pos}
+ In additional, information about next track also comes in, in analogue with current, but with next_ prefix,
+ like {next_title}
+"""
+STRFORMAT = "{state} №{pos}. {artist} - {title} [{time}] | {next_title}"
+
+class Py3status:
+ def __init__(self, *args, **kwargs):
+ self.text = ""
+ super(Py3status).__init__(*args, **kwargs)
+
+ def currentTrack(self, i3status_output_json, i3status_config):
+ try:
+ c = MPDClient()
+ c.connect(host=HOST, port=PORT)
+ if PASSWORD:
+ c.password(PASSWORD)
+
+ status = c.status()
+ song = int(status.get("song", 0))
+ next_song = int(status.get("nextsong", 0))
+
+ if (status["state"] == "pause" and HIDE_WHEN_PAUSED) or (status["state"] == "stop" and HIDE_WHEN_STOPPED):
+ text = ""
+ else:
+ try:
+ song = c.playlistinfo()[song]
+ song["time"] = "{0:.2f}".format(int(song.get("time", 1)) / 60)
+ except IndexError:
+ song = {}
+
+ try:
+ next_song = c.playlistinfo()[next_song]
+ except IndexError:
+ next_song = {}
+
+ format_args = song
+ format_args["state"] = STATE_CHARACTERS.get(status.get("state", None))
+ for k, v in next_song.items():
+ format_args["next_{}".format(k)] = v
+
+ text = STRFORMAT
+ for k, v in format_args.items():
+ text = text.replace("{" + k + "}", v)
+
+ for sub in re.findall(r"{\S+?}", text):
+ text = text.replace(sub, "")
+ except SocketError:
+ text = "Failed to connect to mpd!"
+ except CommandError:
+ text = "Failed to authenticate to mpd!"
+ c.disconnect()
+
+ if len(text) > MAX_WIDTH:
+ text = text[-MAX_WIDTH-3:] + "..."
+
+ if self.text != text:
+ transformed = True
+ self.text = text
+ else:
+ transformed = False
+
+ return (POSITION, {
+ 'transformed': transformed,
+ 'full_text': self.text,
+ 'name': 'scratchpad-count',
+ 'cached_until': time.time() + CACHED_TIME,
+ })