Mercurial > code > home > repos > video
annotate video.py @ 17:071943adf000
dnd a file or a url which we'll queue and fetch
author | drewp@bigasterisk.com |
---|---|
date | Sun, 16 Apr 2023 03:19:33 -0700 |
parents | 53d99454f394 |
children | 1b388ee5dd09 |
rev | line source |
---|---|
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
1 import asyncio |
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
2 import json |
15 | 3 import logging |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
4 from pathlib import Path |
5
75b54be050bc
show one subdir of archive at once, with folders and parents-breadcrumbs
drewp@bigasterisk.com
parents:
4
diff
changeset
|
5 |
3 | 6 from prometheus_client import Gauge |
7 from starlette.applications import Starlette | |
8 from starlette.requests import Request | |
15 | 9 from starlette.responses import HTMLResponse, JSONResponse, Response |
3 | 10 from starlette.routing import Route |
11 from starlette_exporter import PrometheusMiddleware, handle_metrics | |
15 | 12 from sse_starlette.sse import EventSourceResponse |
5
75b54be050bc
show one subdir of archive at once, with folders and parents-breadcrumbs
drewp@bigasterisk.com
parents:
4
diff
changeset
|
13 |
15 | 14 from video_file_store import VideoFileStore |
15 from video_ingest import VideoIngest | |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
16 import dl_queue |
3 | 17 logging.basicConfig(level=logging.DEBUG) |
18 log = logging.getLogger() | |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
19 logging.getLogger('sse_starlette').setLevel(logging.WARNING) |
0 | 20 |
21 | |
3 | 22 def root(req): |
23 return HTMLResponse("api") | |
0 | 24 |
25 | |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
26 async def videos(req: Request) -> JSONResponse: |
5
75b54be050bc
show one subdir of archive at once, with folders and parents-breadcrumbs
drewp@bigasterisk.com
parents:
4
diff
changeset
|
27 subdir = req.query_params.get('subdir', '/') # danger user input |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
28 vfInDir = store.findInDir(subdir) |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
29 return JSONResponse({ |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
30 "videos": [{ |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
31 'webRelPath': vf.webRelPath, |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
32 'label': vf.label, |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
33 'thumbRelPath': await store.getOrCreateThumb(vf), |
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
34 } for vf in vfInDir], |
5
75b54be050bc
show one subdir of archive at once, with folders and parents-breadcrumbs
drewp@bigasterisk.com
parents:
4
diff
changeset
|
35 "subdirs": |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
36 list(store.findSubdirs(subdir)), |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
37 }) |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
38 |
15 | 39 |
40 async def ingestVideoUrl(req: Request) -> Response: | |
41 url = await req.body() | |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
42 await svc.ingestUrl(url.decode('utf8')) |
15 | 43 return Response(status_code=202) |
44 | |
45 | |
46 async def ingestVideoUpload(req: Request) -> Response: | |
47 name = req.query_params['name'] | |
48 await svc.addContent(name, req.body()) | |
49 return Response(status_code=200) | |
50 | |
51 | |
52 async def ingestQueue(req: Request) -> EventSourceResponse: | |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
53 async def g(): |
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
54 async for ev in svc.events(): |
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
55 yield json.dumps(ev) |
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
56 return EventSourceResponse(g()) |
15 | 57 |
58 | |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
59 store = VideoFileStore(top=Path('/data')) |
15 | 60 svc = VideoIngest(store) |
61 | |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
62 def main(): |
3 | 63 |
64 app = Starlette( | |
65 debug=True, | |
66 routes=[ | |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
67 Route('/video/api/', root), |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
68 Route('/video/api/videos', videos), |
15 | 69 Route('/video/api/ingest/videoUpload', |
70 ingestVideoUpload, | |
71 methods=['POST']), | |
72 Route('/video/api/ingest/videoUrl', | |
73 ingestVideoUrl, | |
74 methods=['POST']), | |
75 Route('/video/api/ingest/queue', ingestQueue), | |
3 | 76 ], |
77 ) | |
78 | |
79 app.add_middleware(PrometheusMiddleware, app_name='video_api') | |
80 app.add_route("/metrics", handle_metrics) | |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
81 |
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
82 app.state.processTask = asyncio.create_task(dl_queue.process()) |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
83 return app |
3 | 84 |
85 | |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
86 app = main() |