Mercurial > code > home > repos > video
annotate video.py @ 18:1b388ee5dd09
reformat
author | drewp@bigasterisk.com |
---|---|
date | Mon, 17 Apr 2023 00:41:25 -0700 |
parents | 071943adf000 |
children | cf6842952e13 |
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 |
18 | 17 |
3 | 18 logging.basicConfig(level=logging.DEBUG) |
19 log = logging.getLogger() | |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
20 logging.getLogger('sse_starlette').setLevel(logging.WARNING) |
0 | 21 |
22 | |
3 | 23 def root(req): |
24 return HTMLResponse("api") | |
0 | 25 |
26 | |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
27 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
|
28 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
|
29 vfInDir = store.findInDir(subdir) |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
30 return JSONResponse({ |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
31 "videos": [{ |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
32 'webRelPath': vf.webRelPath, |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
33 'label': vf.label, |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
34 'thumbRelPath': await store.getOrCreateThumb(vf), |
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
35 } 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
|
36 "subdirs": |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
37 list(store.findSubdirs(subdir)), |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
38 }) |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
39 |
15 | 40 |
41 async def ingestVideoUrl(req: Request) -> Response: | |
42 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
|
43 await svc.ingestUrl(url.decode('utf8')) |
15 | 44 return Response(status_code=202) |
45 | |
46 | |
47 async def ingestVideoUpload(req: Request) -> Response: | |
48 name = req.query_params['name'] | |
49 await svc.addContent(name, req.body()) | |
50 return Response(status_code=200) | |
51 | |
52 | |
53 async def ingestQueue(req: Request) -> EventSourceResponse: | |
18 | 54 |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
55 async def g(): |
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
56 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
|
57 yield json.dumps(ev) |
18 | 58 |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
59 return EventSourceResponse(g()) |
15 | 60 |
61 | |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
62 store = VideoFileStore(top=Path('/data')) |
15 | 63 svc = VideoIngest(store) |
64 | |
18 | 65 |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
66 def main(): |
3 | 67 |
68 app = Starlette( | |
69 debug=True, | |
70 routes=[ | |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
71 Route('/video/api/', root), |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
72 Route('/video/api/videos', videos), |
15 | 73 Route('/video/api/ingest/videoUpload', |
74 ingestVideoUpload, | |
75 methods=['POST']), | |
76 Route('/video/api/ingest/videoUrl', | |
77 ingestVideoUrl, | |
78 methods=['POST']), | |
79 Route('/video/api/ingest/queue', ingestQueue), | |
3 | 80 ], |
81 ) | |
82 | |
83 app.add_middleware(PrometheusMiddleware, app_name='video_api') | |
84 app.add_route("/metrics", handle_metrics) | |
18 | 85 |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
86 app.state.processTask = asyncio.create_task(dl_queue.process()) |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
87 return app |
3 | 88 |
89 | |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
90 app = main() |