Discussion:
[SCRIPT] Display song info in desktop environment
Travis Poppe
2011-06-25 00:10:29 UTC
Permalink
Hi all,

Over the past few nights, I've hacked together a python script for cmus
that displays the song/artist/album being played within a user's desktop
environment (GNOME/Unity at least). This is accomplished via
'notify-send' and cmus's status_display_program feature.

This is useful when you have a large collection with unknown songs.

A screenshot is available:

Loading Image...

Hopefully didn't re-invent the wheel; here's the current version.
---
#! /usr/bin/env python
#
# cmus_desktop_notify.py: display song cmus is playing using notify-send.
# Copyright (C) 2011 Travis Poppe <***@lickwid.net>
#
# Version 2011.06.24
# http://tlp.lickwid.net/cmus_desktop_notify.py

# Usage: Run script for instructions.

# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

# TODO:
#
# * Offer some configuration
# * Clean up status_data() (first iteration problem)
# * Clean up notification when some data is missing
# * Attempt to use filename when title is unavailable
# * Make work with python 3/test/etc

import sys
import time
import subprocess

def print_usage():
"""Display usage info and exit."""

print ' ##############################################################################'
print ' # cmus_desktop_notify.py: display song cmus is playing using notify-send. #'
print ' # Copyright (C) 2011 Travis Poppe <***@lickwid.net> #'
print ' # #'
print ' # Version: 2011.06.24 #'
print ' # #'
print ' # Tested on Ubuntu 11.04 with Unity window manager. #'
print ' # Requirements: libnotify-bin (notify-send); probably python 2.x. #'
print ' ##############################################################################'
print ' # Usage: #'
print ' # 1. Copy cmus_desktop_notify.py to ~/.cmus/ and make executable. #'
print ' # 2. Create ~/.cmus/status_display_program.sh with these contents #'
print ' # and make executable (remove spaces and border): #'
print ' # #'
print ' # #!/bin/sh #'
print ' # ~/.cmus/cmus_desktop_notify.py "$*" & #'
print ' # #'
print ' # 3. Set the status_display_program variable in cmus (with YOUR homedir!) #'
print ' # #'
print ' # :set status_display_program=/home/user/.cmus/status_display_program.sh #'
print ' # #'
print ' # 4. Enjoy desktop notifications from cmus! Be sure to :save. #'
print ' ##############################################################################'
sys.exit(2)

def status_data(item):
"""Return the requested cmus status data."""

# We loop through cmus status data and use each of its known data
# types as 'delimiters', collecting data until we reach one,
# inserting it into the dictionary -- rinse and repeat.

# cmus helper script provides our data as argv[1].
cmus_data = sys.argv[1]

# Split the data into an easily-parsed list.
cmus_data = cmus_data.split()

# Our temporary collector list.
collector = []

# Dictionary that will contain our parsed-out data.
cmus_info = {'status':"",
'file':"",
'artist':"",
'album':"",
'discnumber':"",
'tracknumber':"",
'title':"",
'date':"",
'duration':""}

# Loop through cmus data and write it to our dictionary.
last_found = "status"
for value in cmus_data:
collector.append(value)
# Check to see if cmus value matches dictionary key.
for key in cmus_info:
# If a match has been found, record the data.
if key == value:
collector.pop()
cmus_info[last_found] = " ".join(collector)
collector = []
last_found = key

# Return whatever data main() requests.
return cmus_info[item]

def display_song():
"""Display the song data using notify-send."""

# We only display a notification if something is playing.
if status_data("status") == "playing":

# Check to see if title data exists before trying to display it.
# Display "Unknown" otherwise.
if status_data("title") != "":
notify_summary = status_data("title")
else:
notify_summary = "Unknown"

# Check to see if album data exists before trying to
# display it. Prevents "Artist, " if it's blank.
if status_data("album") != "":
notify_body = status_data("artist") + ', ' + \
status_data("album")
else:
notify_body = status_data("artist")

# Create our temporary file if it doesn't exist yet.
open("/tmp/cmus_desktop_last_track", "a").write("4")

# Check to see when we got our last track from cmus.
last_notice = open("/tmp/cmus_desktop_last_track", "r").read()

# Write time stamp for current track from cmus.
last_notice_time = str(time.time())
open("/tmp/cmus_desktop_last_track", "w").write(last_notice_time)

# Calculate seconds between track changes.
track_change_duration = round(time.time() - float(last_notice))

# Display current track notification only if 3 seconds have
# elapsed since last track was chosen.
if track_change_duration > 3:
# Execute notify-send with our default song data.
subprocess.call('notify-send -u low -t 500 "' + \
notify_summary + '" "by ' + \
notify_body + ' "', shell=True)

def main():
try:
# See if script is being called by cmus before proceeding.
if sys.argv[1].startswith("status"):
display_song()
except:
print_usage()

if __name__ == "__main__":
main()
---

Best regards,
--
Travis Poppe
IRC: tlp on irc.freenode.net
Gregory Petrosyan
2011-06-27 09:20:10 UTC
Permalink
Post by Travis Poppe
Hi all,
Over the past few nights, I've hacked together a python script for cmus
that displays the song/artist/album being played within a user's desktop
environment (GNOME/Unity at least). This is accomplished via
'notify-send' and cmus's status_display_program feature.
This is useful when you have a large collection with unknown songs.
http://tlp.lickwid.net/cmus_desktop_notify.py.txt.jpg
Hopefully didn't re-invent the wheel; here's the current version.
Thanks a lot — very useful script, I know there are many people (me
included) running cmus on Ubuntu! If you don't mind, I've uploaded it
to cmus' wiki: http://cmus.sourceforge.net/wiki/doku.php?id=status_display_programs

                Gregory
Jason Woofenden
2011-06-27 12:11:11 UTC
Permalink
Post by Gregory Petrosyan
Post by Travis Poppe
Hi all,
Over the past few nights, I've hacked together a python script for cmus
that displays the song/artist/album being played within a user's desktop
environment (GNOME/Unity at least). This is accomplished via
'notify-send' and cmus's status_display_program feature.
This is useful when you have a large collection with unknown songs.
http://tlp.lickwid.net/cmus_desktop_notify.py.txt.jpg
Hopefully didn't re-invent the wheel; here's the current version.
Thanks a lot — very useful script, I know there are many people (me
included) running cmus on Ubuntu! If you don't mind, I've uploaded it
to cmus' wiki: http://cmus.sourceforge.net/wiki/doku.php?id=status_display_programs
Very cool.

Travis: can you add proper shell escaping to the summary and body
before you pass them to the shell? Some of us have shell symbols in
our metadata. Sometimes even on purpose:

http://www.jamendo.com/fr/album/5220

Thanks! - Jason
Travis Poppe
2011-06-28 17:06:14 UTC
Permalink
Post by Jason Woofenden
Travis: can you add proper shell escaping to the summary and body
before you pass them to the shell? Some of us have shell symbols in
Good idea. I'll have to see how that's done in python when I get a
chance -- I'm not sure off the top of my head.
Post by Jason Woofenden
http://www.jamendo.com/fr/album/5220
Oh, You could also add "-i sound" to the notify-send args. For me that
adds a couple musical notes to the popup.
Added that. Pretty cool! Thanks for the suggestion.

Best regards,
--
Travis Poppe
IRC: tlp on irc.freenode.net
Jason Woofenden
2011-06-27 12:23:12 UTC
Permalink
Oh, You could also add "-i sound" to the notify-send args. For me
that adds a couple musical notes to the popup.

- Jason
Travis Poppe
2011-06-28 17:07:09 UTC
Permalink
Post by Travis Poppe
Hi all,
Over the past few nights, I've hacked together a python script for
cmus that displays the song/artist/album being played within a
user's desktop environment (GNOME/Unity at least). This is
accomplished via 'notify-send' and cmus's status_display_program
feature.
This is useful when you have a large collection with unknown songs.
http://tlp.lickwid.net/cmus_desktop_notify.py.txt.jpg
Hopefully didn't re-invent the wheel; here's the current version.
Thanks a lot — very useful script, I know there are many people (me
included) running cmus on Ubuntu! If you don't mind, I've uploaded it
to cmus' wiki: http://cmus.sourceforge.net/wiki/doku.php?id=status_display_programs
No problem. It will likely undergo some improvements in the coming
days/weeks; is it simple for me to register to keep it up-to-date?

Best regards,
--
Travis Poppe
IRC: tlp on irc.freenode.net
Gregory Petrosyan
2011-06-28 17:09:16 UTC
Permalink
Post by Travis Poppe
Post by Gregory Petrosyan
Post by Travis Poppe
Hi all,
Over the past few nights, I've hacked together a python script for
cmus that displays the song/artist/album being played within a
user's desktop environment (GNOME/Unity at least). This is
accomplished via 'notify-send' and cmus's status_display_program
feature.
This is useful when you have a large collection with unknown songs.
http://tlp.lickwid.net/cmus_desktop_notify.py.txt.jpg
Hopefully didn't re-invent the wheel; here's the current version.
Thanks a lot — very useful script, I know there are many people (me
included) running cmus on Ubuntu! If you don't mind, I've uploaded it
to cmus' wiki: http://cmus.sourceforge.net/wiki/doku.php?id=status_display_programs
No problem. It will likely undergo some improvements in the coming
days/weeks; is it simple for me to register to keep it up-to-date?
It is a public wiki, sure — just press the "edit" button on any page :-)

                Gregory

Loading...