Mercurial > code > home > repos > light9
diff bin/attic/subserver @ 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/subserver@3c523c71da29 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bin/attic/subserver Sun May 12 19:02:10 2024 -0700 @@ -0,0 +1,104 @@ +#!bin/python +""" +live web display of all existing subs with pictures, mainly for +dragging them into CC or Timeline +""" +from run_local import log +import optparse, logging, json, subprocess, datetime +from dateutil.tz import tzlocal +from twisted.internet import reactor, defer +import cyclone.web, cyclone.httpclient, cyclone.websocket +from rdflib import URIRef, Literal +import pyjade.utils +from rdfdb.syncedgraph import SyncedGraph +from rdfdb.patch import Patch +from light9.namespaces import L9, DCTERMS +from light9 import networking, showconfig + +from cycloneerr import PrettyErrorHandler + + +class Static(PrettyErrorHandler, cyclone.web.StaticFileHandler): + + def get(self, path, *args, **kw): + if path in ['', 'effects']: + return self.respondStaticJade("light9/subserver/%s.jade" % + (path or 'index')) + + if path.endswith(".js"): + return self.responseStaticCoffee( + 'light9/subserver/%s' % + path.replace(".js", ".coffee")) # potential security hole + + cyclone.web.StaticFileHandler.get(self, path, *args, **kw) + + def respondStaticJade(self, src): + html = pyjade.utils.process(open(src).read()) + self.write(html) + + def responseStaticCoffee(self, src): + self.write( + subprocess.check_output( + ['/usr/bin/coffee', '--compile', '--print', src])) + + +class Snapshot(PrettyErrorHandler, cyclone.web.RequestHandler): + + @defer.inlineCallbacks + def post(self): + about = URIRef(self.get_argument("about")) + response = yield cyclone.httpclient.fetch( + networking.vidref.path("snapshot"), method="POST", timeout=1) + + snapUri = URIRef(json.loads(response.body)['snapshot']) + # vidref could write about when it was taken, etc. would it be + # better for us to tell vidref where to attach the result in + # the graph, and then it doesn't even have to return anything? + + ctx = showconfig.showUri() + "/snapshots" + + self.settings.graph.patch( + Patch(addQuads=[ + (about, L9['image'], snapUri, ctx), + (snapUri, DCTERMS['created'], + Literal(datetime.datetime.now(tzlocal())), ctx), + ])) + + self.write(json.dumps({'snapshot': snapUri})) + + +def newestImage(subject): + newest = (None, None) + for img in graph.objects(subject, L9['image']): + created = graph.value(img, DCTERMS['created']) + if created > newest[0]: + newest = (created, img) + return newest[1] + + +if __name__ == "__main__": + parser = optparse.OptionParser() + parser.add_option("-v", + "--verbose", + action="store_true", + help="logging.DEBUG") + (options, args) = parser.parse_args() + + log.setLevel(logging.DEBUG if options.verbose else logging.INFO) + + graph = SyncedGraph(networking.rdfdb.url, "subServer") + + port = networking.subServer.port + reactor.listenTCP( + port, + cyclone.web.Application(handlers=[ + (r'/snapshot', Snapshot), + (r'/(.*)', Static, { + "path": "light9/subserver", + "default_filename": "index.jade" + }), + ], + debug=True, + graph=graph)) + log.info("serving on %s" % port) + reactor.run()