Here is the code for now. It needs pylms downloaded and wiringpi2 to work. I made some changes to pylms player.py to allow for accented letters in the titles so I just load the code rather than importing it.
#####################################################################
# SqueezeLite LCD Display #
# Thomas W-P - http://thomas.w-p.me.uk #
# Needs to be run as sudo #
# #
# Known issues: #
# Code is a bit crap, but that's life. It just about works. #
# #
#####################################################################
import wiringpi2 as wp # to control display
import time, datetime # for delays and date
import fcntl, socket, struct # to get mac address
import commands # to get IP address
#import subprocess # for printing to console
import sys
sys.path.append('/home/pi/PyLMS/')
from pylms.server import Server # to talk to LMS server
from pylms.player import Player # to talk to LMS player
# variables/constants
loggedin = False # to wait for the server
scrollpos = 0 # for scrolling the title - needs to be remembered...
waitBeforeOffMinutes = 10 # time to wait before switching off in minutes
waitCount = 0 # counter for the suspend mode
elapsed = float(0) # to hold elapsed time
total = float(0) # to hold total time
scPort = 9090 # default LMS port for CLI
scUser = "" # CLI user
scPassword = "" # CLI password
whatToShow = 0 # 0 = Artist, 1 = Album, 2 = Position/Length
# to get the mac address
def getHwAddr(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', ifname[:15]))
return ''.join(['%02x:' % ord(char) for char in info[18:24]])[:-1]
# to scroll the title
def scrollTitle():
tracktitle = "" # string to hold track title
global scrollpos
try:
tracktitle = sl.get_track_title()
if (len(tracktitle) > 16):
tracktitle += " --- " + tracktitle[:16]
for x in range(0,7):
# exit if not in "Play" mode
if (sl.get_mode() != 'play'):
return
# we're at the start - pause
if (scrollpos == 0):
# scroll
wp.lcdPosition(lcd, 0, 0)
wp.lcdPuts(lcd,tracktitle[0:16])
time.sleep(3)
if (len(tracktitle) > 16+scrollpos):
scrollpos += 1
wp.lcdPosition(lcd, 0, 0)
wp.lcdPuts(lcd,tracktitle[scrollpos:16+scrollpos])
time.sleep(0.4)
elif (len(tracktitle) == 16+scrollpos): #we've got back to the start
scrollpos = 0
else: #standard title
for x in range(0,4):
if (sl.get_mode() != 'play'):
return
wp.lcdPosition(lcd, 0, 0)
wp.lcdPuts(lcd,(tracktitle + " "*16)[:16])
time.sleep(1)
except:
wp.lcdPosition(lcd, 0, 0)
#cmd = [ 'echo', tracktitle ]
#output = subprocess.Popen( cmd, stdout=subprocess.PIPE ).communicate()[0]
#print output
wp.lcdPuts(lcd,"(Title unknown)")
time.sleep(5)
# get the IP address
import commands
intf = 'eth0'
intf_ip = commands.getoutput("ip address show dev " + intf).split()
intf_ip = intf_ip[intf_ip.index('inet') + 1].split('/')[0]
# set up the display - 4 bit to save pins - apparently slower but marginal
# https://projects.drogon.net/raspberry-pi/wiringpi/lcd-library/
wp.wiringPiSetup();
lcd = wp.lcdInit (2, 16, 4, 11,10 , 0,1,2,3,0,0,0,0)
# connect to the squeezebox
sc = Server(hostname=intf_ip, port=scPort, username=scUser, password=scPassword)
# initialising
wp.lcdClear(lcd) # clear the lcd
wp.lcdPosition(lcd, 0, 0) # cursor to start of row
# keep trying to connect until there is a response
while loggedin != True:
try:
sc.connect()
loggedin = sc.logged_in
#wp.lcdPuts(lcd,str(loggedin))
except:
wp.lcdClear(lcd)
wp.lcdPosition(lcd, 0, 0)
wp.lcdPuts(lcd,"Music server"[:16])
wp.lcdPosition(lcd, 0, 1)
wp.lcdPuts(lcd," not ready :("[:16])
time.sleep(3)
# set up the player
sl = sc.get_player(getHwAddr("eth0")) # http://stackoverflow.com/questions/159137/getting-mac-address
# change the display
while True:
# show something
if (sl.get_mode() == 'play'):
waitCount = 0
try:
wp.lcdPosition(lcd, 0, 1)
# no switch in python!
if(whatToShow == 0):
wp.lcdPuts(lcd,(sl.get_track_artist() + " "*16)[:16])
elif(whatToShow == 1):
wp.lcdPuts(lcd,(sl.get_track_album() + " "*16)[:16])
elif(whatToShow == 2):
wp.lcdPosition(lcd, 0, 1)
elapsed = sl.get_time_elapsed()
total = sl.get_track_duration()
progress = int(9 * elapsed / total)#
wp.lcdPuts(lcd,">" + ">"*(progress+1)+"-"*(8-progress) + " " + str(datetime.timedelta(seconds=int(total)))[-5:])
whatToShow += 1
if (whatToShow == 3):
whatToShow = 0
except:
wp.lcdPuts(lcd," ~~~~ "[:16])
# title scrolling
scrollTitle()
# deal with pause/stop
if (sl.get_mode() == 'pause'):
wp.lcdPosition(lcd, 0, 0)
wp.lcdPuts(lcd,(sl.get_track_artist() + " "*16)[:16])
wp.lcdPosition(lcd, 0, 1)
wp.lcdPuts(lcd,(" PAUSED" + " "*16)[:16])
time.sleep(1)
waitCount += 1
if (waitCount >= (waitBeforeOffMinutes * 60)):
# send "OFF" message to player
sl.set_power_state(False)
if (sl.get_mode() == 'stop'):
waitCount = 0
wp.lcdPosition(lcd, 0, 1)
wp.lcdPuts(lcd," " + time.strftime("%H:%M", time.gmtime())[:16])
wp.lcdPosition(lcd, 0, 0)
wp.lcdPuts(lcd,(datetime.datetime.now().strftime("%A") + " " + datetime.datetime.now().strftime("%d")+ " " + datetime.datetime.now().strftime("%B")[:3] + " "*16)[:16])
time.sleep(1)