Mercurial > code > home > repos > video
annotate video.py @ 23:9e56e86a6814
server supports downloading into a given folder
author | drewp@bigasterisk.com |
---|---|
date | Mon, 17 Apr 2023 13:33:59 -0700 |
parents | cf6842952e13 |
children | bf860a23d0c1 |
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 |
20 | 41 def folderTree(req: Request) -> JSONResponse: |
42 return JSONResponse(store.folderTree()) | |
43 | |
44 | |
15 | 45 async def ingestVideoUrl(req: Request) -> Response: |
23
9e56e86a6814
server supports downloading into a given folder
drewp@bigasterisk.com
parents:
20
diff
changeset
|
46 folder = req.query_params['folder'] |
15 | 47 url = await req.body() |
23
9e56e86a6814
server supports downloading into a given folder
drewp@bigasterisk.com
parents:
20
diff
changeset
|
48 await svc.ingestUrl(url.decode('utf8'), folder) |
15 | 49 return Response(status_code=202) |
50 | |
51 | |
52 async def ingestVideoUpload(req: Request) -> Response: | |
53 name = req.query_params['name'] | |
54 await svc.addContent(name, req.body()) | |
55 return Response(status_code=200) | |
56 | |
57 | |
58 async def ingestQueue(req: Request) -> EventSourceResponse: | |
18 | 59 |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
60 async def g(): |
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
61 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
|
62 yield json.dumps(ev) |
18 | 63 |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
64 return EventSourceResponse(g()) |
15 | 65 |
66 | |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
67 store = VideoFileStore(top=Path('/data')) |
15 | 68 svc = VideoIngest(store) |
69 | |
18 | 70 |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
71 def main(): |
3 | 72 |
73 app = Starlette( | |
74 debug=True, | |
75 routes=[ | |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
76 Route('/video/api/', root), |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
77 Route('/video/api/videos', videos), |
20 | 78 Route('/video/api/folderTree', folderTree), |
15 | 79 Route('/video/api/ingest/videoUpload', |
80 ingestVideoUpload, | |
81 methods=['POST']), | |
82 Route('/video/api/ingest/videoUrl', | |
83 ingestVideoUrl, | |
84 methods=['POST']), | |
85 Route('/video/api/ingest/queue', ingestQueue), | |
3 | 86 ], |
87 ) | |
88 | |
89 app.add_middleware(PrometheusMiddleware, app_name='video_api') | |
90 app.add_route("/metrics", handle_metrics) | |
18 | 91 |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
92 app.state.processTask = asyncio.create_task(dl_queue.process()) |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
93 return app |
3 | 94 |
95 | |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
96 app = main() |