#!/usr/bin/env pythonw # dependencies # aeve: undefined.org/python # Twisted: twistedmatrix.com # Quotient: divmod.org (As of 0.7 you'll need CVS; any release after that is probably ok) from time import time as now from random import choice import aeve import unicodedata from nevow import renderer from nevow import tags from twisted.python import plugin plugin.getPlugIns('adapterRegistration') from twisted.web import server from twisted.internet import reactor itunes = aeve.talkto('iTunes') ichat = aeve.talkto('iChat') characters = ('QUARTER NOTE', 'EIGHTH NOTE', 'BEAMED EIGHTH NOTES', 'BEAMED SIXTEENTH NOTES') class TunesStatus(renderer.Renderer): def __init__(self): renderer.Renderer.__init__(self) self.updateStatus() def render(self, request): self.startTime = now() request.setHeader("Content-type", 'text/html; charset=UTF-8') if self.refreshAt is None: self.updateStatus() if self.refreshAt is not None: request.setHeader( 'Refresh', self.refreshAt - now() ) return renderer.Renderer.render(self, request) def getChild(self, name, request): return self def updateStatus(self): msg = unicodedata.lookup(choice(characters)) state = itunes.player_state if state == 'stopped' or state == 'paused': msg = 'Nothing playing' delay = None else: msg += ' ' + itunes.current_track.name artist = itunes.current_track.artist if artist: msg += ' - ' + artist delay = itunes.current_track.finish - itunes.player_position + 2 ichat.status_message = msg self.currentlyPlaying = msg if delay is not None: self.refreshAt = now() + delay + 2 reactor.callLater(delay, self.updateStatus) else: self.refreshAt = None def render_currentlyPlaying(self, context, data): return self.currentlyPlaying.encode('utf8') def render_timer(self, context, data): return "This page render took ", now() - self.startTime, " seconds." document = tags.html[ tags.head[tags.title["iTunes: Currently playing"]], tags.body[ tags.h3["iTunes: Currently playing"], tags.p[ render_currentlyPlaying ], render_timer ] ] import sys from twisted.python import log log.startLogging(sys.stdout, 0) site = server.Site(TunesStatus()) reactor.listenTCP(8123, site) reactor.run()