diff bin/attic/paintserver @ 2376:4556eebe5d73

topdir reorgs; let pdm have its src/ dir; separate vite area from light9/
author drewp@bigasterisk.com
date Sun, 12 May 2024 19:02:10 -0700
parents bin/paintserver@ccdfdc8183ad
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/attic/paintserver	Sun May 12 19:02:10 2024 -0700
@@ -0,0 +1,126 @@
+#!bin/python
+
+from run_local import log
+import json
+from twisted.internet import reactor
+from rdfdb.syncedgraph import SyncedGraph
+from light9 import networking, showconfig
+import optparse, sys, logging
+import cyclone.web
+from rdflib import URIRef
+from light9 import clientsession
+import light9.paint.solve
+from cycloneerr import PrettyErrorHandler
+from light9.namespaces import L9, DEV
+from light9.metrics import metrics
+import imp
+
+
+class Solve(PrettyErrorHandler, cyclone.web.RequestHandler):
+
+    def post(self):
+        painting = json.loads(self.request.body)
+        with metrics('solve').time():
+            img = self.settings.solver.draw(painting)
+            sample, sampleDist = self.settings.solver.bestMatch(
+                img, device=DEV['aura2'])
+            with self.settings.graph.currentState() as g:
+                bestPath = g.value(sample, L9['imagePath']).replace(L9[''], '')
+            #out = solver.solve(painting)
+            #layers = solver.simulationLayers(out)
+
+        self.write(
+            json.dumps({
+                'bestMatch': {
+                    'uri': sample,
+                    'path': bestPath,
+                    'dist': sampleDist
+                },
+                #    'layers': layers,
+                #    'out': out,
+            }))
+
+    def reloadSolver(self):
+        imp.reload(light9.paint.solve)
+        self.settings.solver = light9.paint.solve.Solver(self.settings.graph)
+        self.settings.solver.loadSamples()
+
+
+class BestMatches(PrettyErrorHandler, cyclone.web.RequestHandler):
+
+    def post(self):
+        body = json.loads(self.request.body)
+        painting = body['painting']
+        devs = [URIRef(d) for d in body['devices']]
+        with metrics('solve').time():
+            img = self.settings.solver.draw(painting)
+            outSettings = self.settings.solver.bestMatches(img, devs)
+            self.write(json.dumps({'settings': outSettings.asList()}))
+
+
+class App:
+
+    def __init__(self, show, session):
+        self.show = show
+        self.session = session
+
+        self.graph = SyncedGraph(networking.rdfdb.url, "paintServer")
+        self.graph.initiallySynced.addCallback(self.launch).addErrback(
+            log.error)
+
+
+    def launch(self, *args):
+
+        self.solver = light9.paint.solve.Solver(
+            self.graph,
+            sessions=[
+                L9['show/dance2017/capture/aura1/cap1876596'],
+                L9['show/dance2017/capture/aura2/cap1876792'],
+                L9['show/dance2017/capture/aura3/cap1877057'],
+                L9['show/dance2017/capture/aura4/cap1877241'],
+                L9['show/dance2017/capture/aura5/cap1877406'],
+                L9['show/dance2017/capture/q1/cap1874255'],
+                L9['show/dance2017/capture/q2/cap1873665'],
+                L9['show/dance2017/capture/q3/cap1876223'],
+            ])
+        self.solver.loadSamples()
+
+        self.cycloneApp = cyclone.web.Application(handlers=[
+            (r'/solve', Solve),
+            (r'/bestMatches', BestMatches),
+            metricsRoute(),
+        ],
+                                                  debug=True,
+                                                  graph=self.graph,
+                                                  solver=self.solver)
+        reactor.listenTCP(networking.paintServer.port, self.cycloneApp)
+        log.info("listening on %s" % networking.paintServer.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('paint', options)
+
+    app = App(URIRef(options.show), session)
+    if options.twistedlog:
+        from twisted.python import log as twlog
+        twlog.startLogging(sys.stderr)
+    reactor.run()