#!bin/python """ plays back effect notes from the timeline """ from run_local import log from twisted.internet import reactor # from greplin.scales.cyclonehandler import StatsHandler from rdfdb.syncedgraph import SyncedGraph from light9 import networking, showconfig # from greplin import scales import optparse, sys, logging import cyclone.web from rdflib import URIRef from light9.effect.sequencer import Sequencer, Updates from light9.collector.collector_client import sendToCollector from light9 import clientsession class App(object): def __init__(self, show, session): self.show = show self.session = session self.graph = SyncedGraph(networking.rdfdb.url, "effectSequencer") self.graph.initiallySynced.addCallback(self.launch) # self.stats = scales.collection( # '/', # scales.PmfStat('sendLevels', recalcPeriod=1), # scales.PmfStat('getMusic', recalcPeriod=1), # scales.PmfStat('evals', recalcPeriod=1), # scales.PmfStat('sendOutput', recalcPeriod=1), # scales.IntStat('errors'), # ) def launch(self, *args): self.seq = Sequencer( self.graph, lambda settings: sendToCollector( 'effectSequencer', self.session, settings, # This seems to be safe here (and lets us get from # 20fpx to 40fpx), even though it leads to big stalls # if I use it on KC. useZmq=True)) self.cycloneApp = cyclone.web.Application(handlers=[ (r'/()', cyclone.web.StaticFileHandler, { "path": "light9/effect/", "default_filename": "sequencer.html" }), (r'/updates', Updates), # (r'/stats/(.*)', StatsHandler, { # 'serverName': 'effectsequencer' # }), ], debug=True, seq=self.seq, graph=self.graph, # stats=self.stats ) reactor.listenTCP(networking.effectSequencer.port, self.cycloneApp) log.info("listening on %s" % networking.effectSequencer.port) if __name__ == "__main__": parser = optparse.OptionParser() parser.add_option( '--show', help='show URI, like http://light9.bigasterisk.com/show/dance2008', default=showconfig.showUri()) parser.add_option("-v", "--verbose", action="store_true", help="logging.DEBUG") parser.add_option("--twistedlog", action="store_true", help="twisted logging") clientsession.add_option(parser) (options, args) = parser.parse_args() log.setLevel(logging.DEBUG if options.verbose else logging.INFO) if not options.show: raise ValueError("missing --show http://...") session = clientsession.getUri('effectSequencer', options) app = App(URIRef(options.show), session) if options.twistedlog: from twisted.python import log as twlog twlog.startLogging(sys.stderr) reactor.run()