#!/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()
