diff --git a/i3pystatus/cmus.py b/i3pystatus/cmus.py index b25adca..c3b8490 100644 --- a/i3pystatus/cmus.py +++ b/i3pystatus/cmus.py @@ -5,18 +5,42 @@ from i3pystatus.core.util import TimeWrapper import subprocess +def _extract_artist_title(input): + for sep in ('-', ' - '): + split = input.split(sep) + if len(split) == 2: + return split[0], split[1] + # fallback + return (input.split('-') + [''] * 2)[:2] + + class Cmus(IntervalModule): """ - gets the status and current song info using cmus-remote + Gets the status and current song info using cmus-remote + + .. rubric:: Available formatters + + * `{status}` — current status icon (paused/playing/stopped) + * `{song_elapsed}` — song elapsed time (mm:ss format) + * `{song_length}` — total song duration (mm:ss format) + * `{artist}` — artist + * `{title}` — title + * `{album}` — album + * `{tracknumber}` — tracknumber + * `{file}` — file or url name + * `{stream}` — song name from stream + * `{bitrate}` — bitrate """ settings = ( - 'format', - 'color' + ('format', 'format string, available formatters: status, song_elapsed, ' + 'song_length, artist, title, album, tracknumber, file, ' + 'stream, bitrate'), + 'color', ) color = "#909090" - format = "{status} {song_elapsed}/{song_length} {artist}-{title}" + format = "{status} {song_elapsed}/{song_length} {artist} - {title}" status_text = '' interval = 1 status = { @@ -34,8 +58,8 @@ class Cmus(IntervalModule): def _query_cmus(self): status_dict = {} status, error = self._cmus_command('query') - status = status.decode('utf-8').split('\n') if status != b'cmus-remote: cmus is not running\n': + status = status.decode('utf-8').split('\n') for item in status: split_item = item.split(' ') if split_item[0] in ['tag', 'set']: @@ -48,6 +72,12 @@ class Cmus(IntervalModule): def run(self): status = self._query_cmus() + if not status: + self.output = { + "full_text": 'Not running', + "color": self.color + } + return fdict = { 'file': status.get('file', ''), 'status': self.status[status["status"]], @@ -62,14 +92,16 @@ class Cmus(IntervalModule): } if fdict['stream']: - fdict['artist'], fdict['title'] = ( - fdict['stream'].split('-') + [''] * 2)[:2] + fdict['artist'], fdict[ + 'title'] = _extract_artist_title(fdict['stream']) elif not fdict['title']: _, filename = os.path.split(fdict['file']) filebase, _ = os.path.splitext(filename) - fdict['artist'], fdict['title'] = ( - filebase.split('-') + [''] * 2)[:2] + fdict['artist'], fdict['title'] = _extract_artist_title(filebase) + + fdict['title'] = fdict['title'].strip() + fdict['artist'] = fdict['artist'].strip() self.output = { "full_text": formatp(self.format, **fdict), diff --git a/i3pystatus/pomodoro.py b/i3pystatus/pomodoro.py index 0eb5a7c..1d4317c 100644 --- a/i3pystatus/pomodoro.py +++ b/i3pystatus/pomodoro.py @@ -24,9 +24,11 @@ class Pomodoro(IntervalModule): 'Path to sound file to play as alarm. Played by "aplay" utility'), ('pomodoro_duration', 'Working (pomodoro) interval duration in seconds'), - ('break_duration', 'Short break duration in secods'), - ('long_break_duration', 'Long break duration in secods'), + ('break_duration', 'Short break duration in seconds'), + ('long_break_duration', 'Long break duration in seconds'), ('short_break_count', 'Short break count before first long break'), + ('format', 'format string, available formatters: current_pomodoro, ' + 'total_pomodoro, time') ) color_stopped = '#2ECCFA' @@ -34,6 +36,7 @@ class Pomodoro(IntervalModule): color_break = '#37FF00' interval = 1 short_break_count = 3 + format = '☯ {current_pomodoro}/{total_pomodoro} {time}' pomodoro_duration = 25 * 60 break_duration = 5 * 60 @@ -56,8 +59,8 @@ class Pomodoro(IntervalModule): else: self.time = datetime.now() + \ timedelta(seconds=self.break_duration) + self.breaks += 1 text = 'Go for a break!' - self.breaks += 1 else: self.state = 'running' self.time = datetime.now() + \ @@ -70,17 +73,27 @@ class Pomodoro(IntervalModule): text = '{:02}:{:02}'.format(int(min), int(sec)) color = self.color_running if self.state == 'running' else self.color_break else: - text = 'Stopped' - color = self.color_stopped + self.output = { + 'full_text': 'Stopped', + 'color': self.color_stopped + } + return + + sdict = { + 'time': text, + 'current_pomodoro': self.breaks, + 'total_pomodoro': self.short_break_count + 1, + } self.output = { - 'full_text': text, + 'full_text': self.format.format(**sdict), 'color': color } def on_leftclick(self): self.state = 'running' self.time = datetime.now() + timedelta(seconds=self.pomodoro_duration) + self.breaks = 0 def on_rightclick(self): self.state = 'stopped'