Add support for nowplaying-tf, which provides better format strings

This is added with the tf_format config, which will override format if
it is set. This makes the call "deadbeef --nowplaying-tf <tf_format>"
and displays the output directly. This output should now also support
unicode, regardless of Python version.

There is also the tf_format_if_stopped, a boolean config that
configures whether or not the tf_format output should be displayed
even if deadbeef isn't playing anything.
This commit is contained in:
WORD559 2019-09-23 15:12:23 +01:00
parent ef7cbd5c2e
commit b7b0faf613

View file

@ -1,9 +1,10 @@
# pylint: disable=C0111,R0903
"""Displays the current song being played in DeaDBeeF and
provides some media control bindings.
Left click toggles pause, scroll up skips the current song,
scroll down returns to the previous song.
"""Displays the current song being played in DeaDBeeF and provides
some media control bindings.
Left click toggles pause, scroll up skips the current song, scroll
down returns to the previous song.
Requires the following library:
* subprocess
Parameters:
@ -11,12 +12,27 @@ Parameters:
Available values are: {artist}, {title}, {album}, {length},
{trackno}, {year}, {comment},
{copyright}, {time}
This is deprecated, but much simpler.
* deadbeef.tf_format: A foobar2000 title formatting-style format string.
These can be much more sophisticated than the standard
format strings. This is off by default, but specifying
any tf_format will enable it. If both deadbeef.format
and deadbeef.tf_format are specified, deadbeef.tf_format
takes priority.
* deadbeef.tf_format_if_stopped: Controls whether or not the tf_format format
string should be displayed even if no song is paused or
playing. This could be useful if you want to implement
your own stop strings with the built in logic. Any non-
null value will enable this (by default the module will
hide itself when the player is stopped).
* deadbeef.previous: Change binding for previous song (default is left click)
* deadbeef.next: Change binding for next song (default is right click)
* deadbeef.pause: Change binding for toggling pause (default is middle click)
Available options for deadbeef.previous, deadbeef.next and deadbeef.pause are:
LEFT_CLICK, RIGHT_CLICK, MIDDLE_CLICK, SCROLL_UP, SCROLL_DOWN
"""
import sys
import bumblebee.input
import bumblebee.output
@ -43,11 +59,14 @@ class Module(bumblebee.engine.Module):
self._song = ""
self._format = self.parameter("format", "{artist} - {title}")
self._tf_format = self.parameter("tf_format", "")
self._show_tf_when_stopped = bool(self.parameter("tf_format_if_stopped", ""))
prev_button = self.parameter("previous", "LEFT_CLICK")
next_button = self.parameter("next", "RIGHT_CLICK")
pause_button = self.parameter("pause", "MIDDLE_CLICK")
self.now_playing = ["deadbeef", "--nowplaying", "%a;%t;%b;%l;%n;%y;%c;%r;%e"]
self.now_playing_tf = ["deadbeef", "--nowplaying-tf", ""]
cmd = "deadbeef "
engine.input.register_callback(self, button=buttons[prev_button],
@ -59,15 +78,34 @@ class Module(bumblebee.engine.Module):
@scrollable
def deadbeef(self, widget):
return str(self._song)
return self.string_song
def hidden(self):
return str(self._song) == ""
return self.string_song == ""
def update(self, widgets):
try:
deadbeef = subprocess.Popen(self.now_playing,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
data = deadbeef.communicate()[0]
if self._tf_format == "": # no tf format set, use the old style
return self.update_standard(widgets)
return self.update_tf(widgets)
except Exception:
self._song = "error"
def update_tf(self, widgets):
if not self._show_tf_when_stopped:
## check if the player is paused or playing
self.now_playing_tf[-1] = "%isplaying%%ispaused%"
data = read_process(self.now_playing_tf)
if data == "":
self._song = ""
return
## perform the actual query -- these can be much more sophisticated
self.now_playing_tf[-1] = self._tf_format
data = read_process(self.now_playing_tf)
self._song = data
def update_standard(self, widgets):
data = read_process(self.now_playing)
if data == "nothing":
self._song = ""
else:
@ -81,7 +119,19 @@ class Module(bumblebee.engine.Module):
comment=data[6],
copyright=data[7],
time=data[8])
except Exception:
self._song = ""
@property
def string_song(self):
"""\
Returns the current song as a string, either as a unicode() (Python <
3) or a regular str() (Python >= 3)
"""
if sys.version_info.major < 3:
return unicode(self._song)
return str(self._song)
def read_process(command):
proc = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
return proc.stdout.read()
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4