annotate bin/vidref @ 1939:6f49dc917aa3

start vidref web version. v4l camera frames to web page is working Ignore-this: 34bcc3b6149a1a3bed31aa5f32a4ddc6
author Drew Perttula <drewp@bigasterisk.com>
date Mon, 03 Jun 2019 09:50:29 +0000
parents 3c523c71da29
children 0dc3715050cf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
729
b5efddd80dad update more shbang lines
Drew Perttula <drewp@bigasterisk.com>
parents: 647
diff changeset
1 #!bin/python
1939
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
2 """
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
3 Camera images of the stage. View live on a web page and also save
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
4 them to disk. Retrieve images based on the song and time that was
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
5 playing when they were taken. Also, save snapshot images to a place
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
6 they can be used again as thumbnails of effects.
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
7
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
8 bin/vidref main
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
9 light9/vidref/videorecorder.py capture frames and save them
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
10 light9/vidref/replay.py backend for vidref.js playback element- figures out which frames go with the current song and time
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
11 light9/vidref/index.html web ui for watching current stage and song playback
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
12 light9/vidref/setup.html web ui for setup of camera params and frame crop
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
13 light9/web/vidref.js LitElement for video playback
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
14
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
15 """
882
d96c09669b40 vidref change logger
drewp@bigasterisk.com
parents: 729
diff changeset
16 from run_local import log
1939
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
17
941
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
18 from twisted.internet import reactor, defer
1939
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
19
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
20 import logging, optparse, json, base64
1096
087f6cbe4b22 vidrefsetup tool now prepares a url that vidref will use for rpi camera requests
Drew Perttula <drewp@bigasterisk.com>
parents: 1089
diff changeset
21 import cyclone.web, cyclone.httpclient, cyclone.websocket
1866
3c523c71da29 pyflakes cleanups and some refactors
Drew Perttula <drewp@bigasterisk.com>
parents: 1858
diff changeset
22 from light9 import networking
941
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
23 from light9.vidref.replay import snapshotDir
1939
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
24 from light9.vidref import videorecorder
1692
6fa4288da8a6 rdfdb is its own package now
drewp@bigasterisk.com
parents: 1369
diff changeset
25 from rdfdb.syncedgraph import SyncedGraph
1939
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
26 from io import BytesIO
542
cfd5d5be1b50 vidref complete panels on each replay. replays load and delete pretty well
drewp@bigasterisk.com
parents: 541
diff changeset
27
cfd5d5be1b50 vidref complete panels on each replay. replays load and delete pretty well
drewp@bigasterisk.com
parents: 541
diff changeset
28 parser = optparse.OptionParser()
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1692
diff changeset
29 parser.add_option("-v", "--verbose", action="store_true", help="logging.DEBUG")
542
cfd5d5be1b50 vidref complete panels on each replay. replays load and delete pretty well
drewp@bigasterisk.com
parents: 541
diff changeset
30 (options, args) = parser.parse_args()
cfd5d5be1b50 vidref complete panels on each replay. replays load and delete pretty well
drewp@bigasterisk.com
parents: 541
diff changeset
31
1089
2ee97997ee56 vidref now reads from picamserve
Drew Perttula <drewp@bigasterisk.com>
parents: 1070
diff changeset
32 log.setLevel(logging.DEBUG if options.verbose else logging.INFO)
534
6f1eb6437c96 vidref refactor, start to add more widgets
drewp@bigasterisk.com
parents: 525
diff changeset
33
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1692
diff changeset
34
941
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
35 class Snapshot(cyclone.web.RequestHandler):
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1692
diff changeset
36
941
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
37 @defer.inlineCallbacks
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
38 def post(self):
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
39 # save next pic
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
40 # return /snapshot/path
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
41 try:
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
42 outputFilename = yield self.settings.gui.snapshot()
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
43
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
44 assert outputFilename.startswith(snapshotDir())
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
45 out = networking.vidref.path(
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
46 "snapshot/%s" % outputFilename[len(snapshotDir()):].lstrip('/'))
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1692
diff changeset
47
941
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
48 self.write(json.dumps({'snapshot': out}))
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
49 self.set_header("Location", out)
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
50 self.set_status(303)
1866
3c523c71da29 pyflakes cleanups and some refactors
Drew Perttula <drewp@bigasterisk.com>
parents: 1858
diff changeset
51 except Exception:
941
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
52 import traceback
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
53 traceback.print_exc()
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
54 raise
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
55
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1692
diff changeset
56
1939
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
57 pipeline = videorecorder.GstSource(
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
58 '/dev/v4l/by-id/usb-Generic_FULL_HD_1080P_Webcam_200901010001-video-index0')
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
59
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
60
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
61 class Live(cyclone.websocket.WebSocketHandler):
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
62
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
63 def connectionMade(self, *args, **kwargs):
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
64 pipeline.liveImages.subscribe(on_next=self.onFrame)
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
65
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
66 def connectionLost(self, reason):
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
67 0 #self.subj.dispose()
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
68
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
69 def onFrame(self, t_img):
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
70 t, img = t_img
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
71 if img is None: return
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
72 output = BytesIO()
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
73 img.save(output, 'jpeg', quality=80)
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
74
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
75 self.sendMessage(
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
76 json.dumps({
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
77 'jpeg':
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
78 base64.b64encode(output.getvalue()).decode('ascii'),
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
79 'description':
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
80 f't={t}',
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
81 }))
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
82
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
83
941
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
84 class SnapshotPic(cyclone.web.StaticFileHandler):
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
85 pass
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
86
1369
6b5e079b3dbe timeline hover goes to vidref
Drew Perttula <drewp@bigasterisk.com>
parents: 1212
diff changeset
87
6b5e079b3dbe timeline hover goes to vidref
Drew Perttula <drewp@bigasterisk.com>
parents: 1212
diff changeset
88 class Time(cyclone.web.RequestHandler):
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1692
diff changeset
89
1369
6b5e079b3dbe timeline hover goes to vidref
Drew Perttula <drewp@bigasterisk.com>
parents: 1212
diff changeset
90 def put(self):
6b5e079b3dbe timeline hover goes to vidref
Drew Perttula <drewp@bigasterisk.com>
parents: 1212
diff changeset
91 body = json.loads(self.request.body)
6b5e079b3dbe timeline hover goes to vidref
Drew Perttula <drewp@bigasterisk.com>
parents: 1212
diff changeset
92 t = body['t']
6b5e079b3dbe timeline hover goes to vidref
Drew Perttula <drewp@bigasterisk.com>
parents: 1212
diff changeset
93 source = body['source']
6b5e079b3dbe timeline hover goes to vidref
Drew Perttula <drewp@bigasterisk.com>
parents: 1212
diff changeset
94 self.settings.gui.incomingTime(t, source)
6b5e079b3dbe timeline hover goes to vidref
Drew Perttula <drewp@bigasterisk.com>
parents: 1212
diff changeset
95 self.set_status(202)
6b5e079b3dbe timeline hover goes to vidref
Drew Perttula <drewp@bigasterisk.com>
parents: 1212
diff changeset
96
6b5e079b3dbe timeline hover goes to vidref
Drew Perttula <drewp@bigasterisk.com>
parents: 1212
diff changeset
97
1114
a38955ba6f40 rdfdb port is now in the config
Drew Perttula <drewp@bigasterisk.com>
parents: 1096
diff changeset
98 graph = SyncedGraph(networking.rdfdb.url, "vidref")
1096
087f6cbe4b22 vidrefsetup tool now prepares a url that vidref will use for rpi camera requests
Drew Perttula <drewp@bigasterisk.com>
parents: 1089
diff changeset
99
941
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
100 port = networking.vidref.port
1858
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1692
diff changeset
101 reactor.listenTCP(
7772cc48e016 reformat all python
drewp@bigasterisk.com
parents: 1692
diff changeset
102 port,
1939
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
103 cyclone.web.Application(
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
104 handlers=[
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
105 (r'/()', cyclone.web.StaticFileHandler, {
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
106 'path': 'light9/vidref',
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
107 'default_filename': 'vidref.html'
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
108 }),
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
109 (r'/setup/()', cyclone.web.StaticFileHandler, {
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
110 'path': 'light9/vidref',
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
111 'default_filename': 'setup.html'
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
112 }),
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
113 (r'/setup/live', Live),
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
114 (r'/snapshot', Snapshot),
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
115 (r'/snapshot/(.*)', SnapshotPic, {
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
116 "path": snapshotDir()
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
117 }),
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
118 (r'/time', Time),
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
119 ],
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
120 debug=True,
6f49dc917aa3 start vidref web version. v4l camera frames to web page is working
Drew Perttula <drewp@bigasterisk.com>
parents: 1866
diff changeset
121 ))
941
1d9547f90737 vidref can take snapshots and serve them back
drewp@bigasterisk.com
parents: 937
diff changeset
122 log.info("serving on %s" % port)
937
b0337e6f68f1 refactor to videorecorder.py
drewp@bigasterisk.com
parents: 935
diff changeset
123
935
89adbbb06bcd vidref run in twisted mainloop
drewp@bigasterisk.com
parents: 882
diff changeset
124 reactor.run()