Mercurial > code > home > repos > video
annotate video.py @ 36:ed16fdbb3996
rewrite WIP. scan fs separately; store in db. thumbs are broken for now
author | drewp@bigasterisk.com |
---|---|
date | Tue, 03 Dec 2024 00:08:22 -0800 |
parents | d83dbda8bccf |
children | 7cacfae58430 |
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 |
28
1e058bea3ac2
crash better when mongo is unreachable
drewp@bigasterisk.com
parents:
27
diff
changeset
|
6 import uvicorn |
3 | 7 from prometheus_client import Gauge |
28
1e058bea3ac2
crash better when mongo is unreachable
drewp@bigasterisk.com
parents:
27
diff
changeset
|
8 from sse_starlette.sse import EventSourceResponse |
3 | 9 from starlette.applications import Starlette |
10 from starlette.requests import Request | |
15 | 11 from starlette.responses import HTMLResponse, JSONResponse, Response |
3 | 12 from starlette.routing import Route |
13 from starlette_exporter import PrometheusMiddleware, handle_metrics | |
5
75b54be050bc
show one subdir of archive at once, with folders and parents-breadcrumbs
drewp@bigasterisk.com
parents:
4
diff
changeset
|
14 |
28
1e058bea3ac2
crash better when mongo is unreachable
drewp@bigasterisk.com
parents:
27
diff
changeset
|
15 import dl_queue |
15 | 16 from video_file_store import VideoFileStore |
17 from video_ingest import VideoIngest | |
36
ed16fdbb3996
rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents:
32
diff
changeset
|
18 from mongo_required import open_mongo_or_die |
18 | 19 |
3 | 20 logging.basicConfig(level=logging.DEBUG) |
21 log = logging.getLogger() | |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
22 logging.getLogger('sse_starlette').setLevel(logging.WARNING) |
32 | 23 logging.getLogger('pymongo').setLevel(logging.INFO) |
0 | 24 |
25 | |
3 | 26 def root(req): |
27 return HTMLResponse("api") | |
0 | 28 |
29 | |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
30 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
|
31 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
|
32 vfInDir = store.findInDir(subdir) |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
33 return JSONResponse({ |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
34 "videos": [{ |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
35 'webRelPath': vf.webRelPath, |
36
ed16fdbb3996
rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents:
32
diff
changeset
|
36 'webDataPath': vf.webDataPath, |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
37 'label': vf.label, |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
38 } 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
|
39 "subdirs": |
6
ccfea3625cf6
render thumbs and display them (no video player at all atm)
drewp@bigasterisk.com
parents:
5
diff
changeset
|
40 list(store.findSubdirs(subdir)), |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
41 }) |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
42 |
15 | 43 |
20 | 44 def folderTree(req: Request) -> JSONResponse: |
45 return JSONResponse(store.folderTree()) | |
46 | |
47 | |
15 | 48 async def ingestVideoUrl(req: Request) -> Response: |
23
9e56e86a6814
server supports downloading into a given folder
drewp@bigasterisk.com
parents:
20
diff
changeset
|
49 folder = req.query_params['folder'] |
15 | 50 url = await req.body() |
23
9e56e86a6814
server supports downloading into a given folder
drewp@bigasterisk.com
parents:
20
diff
changeset
|
51 await svc.ingestUrl(url.decode('utf8'), folder) |
15 | 52 return Response(status_code=202) |
53 | |
54 | |
55 async def ingestVideoUpload(req: Request) -> Response: | |
56 name = req.query_params['name'] | |
57 await svc.addContent(name, req.body()) | |
58 return Response(status_code=200) | |
59 | |
60 | |
61 async def ingestQueue(req: Request) -> EventSourceResponse: | |
18 | 62 |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
63 async def g(): |
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
64 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
|
65 yield json.dumps(ev) |
18 | 66 |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
67 return EventSourceResponse(g()) |
15 | 68 |
69 | |
36
ed16fdbb3996
rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents:
32
diff
changeset
|
70 db = open_mongo_or_die().get_database('video') |
ed16fdbb3996
rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents:
32
diff
changeset
|
71 store = VideoFileStore(db.get_collection('fs')) |
15 | 72 svc = VideoIngest(store) |
73 | |
18 | 74 |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
75 def main(): |
3 | 76 |
77 app = Starlette( | |
78 debug=True, | |
79 routes=[ | |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
80 Route('/video/api/', root), |
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
81 Route('/video/api/videos', videos), |
20 | 82 Route('/video/api/folderTree', folderTree), |
15 | 83 Route('/video/api/ingest/videoUpload', |
84 ingestVideoUpload, | |
85 methods=['POST']), | |
86 Route('/video/api/ingest/videoUrl', | |
87 ingestVideoUrl, | |
88 methods=['POST']), | |
89 Route('/video/api/ingest/queue', ingestQueue), | |
3 | 90 ], |
91 ) | |
92 | |
93 app.add_middleware(PrometheusMiddleware, app_name='video_api') | |
25 | 94 app.add_route("/video/api/metrics", handle_metrics) |
27 | 95 app.add_route("/metrics", handle_metrics) |
18 | 96 |
17
071943adf000
dnd a file or a url which we'll queue and fetch
drewp@bigasterisk.com
parents:
15
diff
changeset
|
97 app.state.processTask = asyncio.create_task(dl_queue.process()) |
4
c8a41359505c
server provides video listing from disk
drewp@bigasterisk.com
parents:
3
diff
changeset
|
98 return app |
3 | 99 |
100 | |
28
1e058bea3ac2
crash better when mongo is unreachable
drewp@bigasterisk.com
parents:
27
diff
changeset
|
101 uvicorn.run(main, |
1e058bea3ac2
crash better when mongo is unreachable
drewp@bigasterisk.com
parents:
27
diff
changeset
|
102 host="0.0.0.0", |
1e058bea3ac2
crash better when mongo is unreachable
drewp@bigasterisk.com
parents:
27
diff
changeset
|
103 port=8004, |
1e058bea3ac2
crash better when mongo is unreachable
drewp@bigasterisk.com
parents:
27
diff
changeset
|
104 log_level=logging.INFO, |
1e058bea3ac2
crash better when mongo is unreachable
drewp@bigasterisk.com
parents:
27
diff
changeset
|
105 factory=True) |