Files @ ce32d00263a6
Branch filter:

Location: light9/bin/effectsequencer

drewp@bigasterisk.com
set 2019 show to all-localhost
#!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()