Updated 'now_playing' module:

- Added custom format and color, when no player is running.
- Make a difference between DBus error and no players found.
- Exdended try-cath for DBus errors.
- Changed player method calls according to docs [1] since my player did not recognize them.

[1] http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#interfaces-and-methods
This commit is contained in:
Lukáš Mandák 2015-01-18 18:24:35 +01:00
parent efcf8c8610
commit 9b2591018c

View File

@ -8,39 +8,49 @@ from i3pystatus import IntervalModule, formatp
from i3pystatus.core.util import TimeWrapper from i3pystatus.core.util import TimeWrapper
class NoPlayerException(Exception):
pass
class NowPlaying(IntervalModule): class NowPlaying(IntervalModule):
""" """
Shows currently playing track information, supports most media players 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.
Available formatters (uses :ref:`formatp`) Available formatters (uses :ref:`formatp`)
* `{title}` (the title of the current song) * `{title}` (the title of the current song)
* `{album}` (the album of the current song, can be an empty string (e.g. for online streams)) * `{album}` (the album of the current song, can be an empty string (e.g. for online streams))
* `{artist}` (can be empty, too) * `{artist}` (can be empty, too)
* `{filename}` (file name with out extension and path; empty unless title is empty) * `{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_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) * `{song_length}` (length of the current song, same as song_elapsed)
* `{status}` (play, pause, stop mapped through the `status` dictionary) * `{status}` (play, pause, stop mapped through the `status` dictionary)
* `{volume}` (Volume) * `{volume}` (volume)
Left click on the module play/pauses, right click goes to the next track.
Requires python-dbus available from every distros' package manager.
""" """
interval = 1 interval = 1
settings = ( settings = (
("player", "Player name"), ("player", "Player name. If not set, compatible players will be \
detected automatically."),
("status", "Dictionary mapping pause, play and stop to output text"), ("status", "Dictionary mapping pause, play and stop to output text"),
("color", "Text color"),
("format", "formatp string"), ("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", "Hide output if no player is detected"),
) )
hide_no_player = True hide_no_player = True
player = None format_no_player = "No Player"
color_no_player = "#ffffff"
format = "{title} {status}" format = "{title} {status}"
color = "#ffffff"
status = { status = {
"pause": "", "pause": "",
"play": "", "play": "",
@ -51,18 +61,19 @@ class NowPlaying(IntervalModule):
"Paused": "pause", "Paused": "pause",
"Stopped": "stop", "Stopped": "stop",
} }
color = "#FFFFFF"
old_player = None
on_leftclick = "playpause" on_leftclick = "playpause"
on_rightclick = "next_song" on_rightclick = "next_song"
player = None
old_player = None
def find_player(self): 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.")] 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: if self.old_player in players:
return self.old_player return self.old_player
if not players: if not players:
raise dbus.exceptions.DBusException() raise NoPlayerException()
self.old_player = players[0] self.old_player = players[0]
return players[0] return players[0]
@ -76,16 +87,6 @@ class NowPlaying(IntervalModule):
def run(self): def run(self):
try: try:
player = self.get_player() player = self.get_player()
except dbus.exceptions.DBusException:
if self.hide_no_player:
self.output = None
else:
self.output = {
"full_text": "now_playing: d-bus error",
"color": "#ff0000",
}
return
properties = dbus.Interface(player, "org.freedesktop.DBus.Properties") properties = dbus.Interface(player, "org.freedesktop.DBus.Properties")
get_prop = functools.partial(properties.Get, "org.mpris.MediaPlayer2.Player") get_prop = functools.partial(properties.Get, "org.mpris.MediaPlayer2.Player")
currentsong = get_prop("Metadata") currentsong = get_prop("Metadata")
@ -113,8 +114,28 @@ class NowPlaying(IntervalModule):
"color": self.color, "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,
}
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): def playpause(self):
self.get_player().PlayPause() dbus.Interface(self.get_player(), "org.mpris.MediaPlayer2.Player").PlayPause()
def next_song(self): def next_song(self):
self.get_player().Next() dbus.Interface(self.get_player(), "org.mpris.MediaPlayer2.Player").Next()