Mercurial > code > home > repos > video
comparison 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 |
comparison
equal
deleted
inserted
replaced
16:838eb0223bdb | 17:071943adf000 |
---|---|
1 import asyncio | |
2 import json | |
1 import logging | 3 import logging |
2 from pathlib import Path | 4 from pathlib import Path |
3 | 5 |
4 from prometheus_client import Gauge | 6 from prometheus_client import Gauge |
5 from starlette.applications import Starlette | 7 from starlette.applications import Starlette |
9 from starlette_exporter import PrometheusMiddleware, handle_metrics | 11 from starlette_exporter import PrometheusMiddleware, handle_metrics |
10 from sse_starlette.sse import EventSourceResponse | 12 from sse_starlette.sse import EventSourceResponse |
11 | 13 |
12 from video_file_store import VideoFileStore | 14 from video_file_store import VideoFileStore |
13 from video_ingest import VideoIngest | 15 from video_ingest import VideoIngest |
14 | 16 import dl_queue |
15 logging.basicConfig(level=logging.DEBUG) | 17 logging.basicConfig(level=logging.DEBUG) |
16 log = logging.getLogger() | 18 log = logging.getLogger() |
19 logging.getLogger('sse_starlette').setLevel(logging.WARNING) | |
17 | 20 |
18 | 21 |
19 def root(req): | 22 def root(req): |
20 return HTMLResponse("api") | 23 return HTMLResponse("api") |
21 | 24 |
34 }) | 37 }) |
35 | 38 |
36 | 39 |
37 async def ingestVideoUrl(req: Request) -> Response: | 40 async def ingestVideoUrl(req: Request) -> Response: |
38 url = await req.body() | 41 url = await req.body() |
39 svc.ingestUrl(url) | 42 await svc.ingestUrl(url.decode('utf8')) |
40 return Response(status_code=202) | 43 return Response(status_code=202) |
41 | 44 |
42 | 45 |
43 async def ingestVideoUpload(req: Request) -> Response: | 46 async def ingestVideoUpload(req: Request) -> Response: |
44 name = req.query_params['name'] | 47 name = req.query_params['name'] |
45 await svc.addContent(name, req.body()) | 48 await svc.addContent(name, req.body()) |
46 return Response(status_code=200) | 49 return Response(status_code=200) |
47 | 50 |
48 | 51 |
49 async def ingestQueue(req: Request) -> EventSourceResponse: | 52 async def ingestQueue(req: Request) -> EventSourceResponse: |
50 | 53 async def g(): |
51 def convertEvents(svcEvents): | 54 async for ev in svc.events(): |
52 for ev in svcEvents: | 55 yield json.dumps(ev) |
53 yield dict(type='ev') | 56 return EventSourceResponse(g()) |
54 | |
55 return EventSourceResponse(convertEvents(svc.events())) | |
56 | 57 |
57 | 58 |
58 store = VideoFileStore(top=Path('/data')) | 59 store = VideoFileStore(top=Path('/data')) |
59 svc = VideoIngest(store) | 60 svc = VideoIngest(store) |
60 | |
61 | 61 |
62 def main(): | 62 def main(): |
63 | 63 |
64 app = Starlette( | 64 app = Starlette( |
65 debug=True, | 65 debug=True, |
76 ], | 76 ], |
77 ) | 77 ) |
78 | 78 |
79 app.add_middleware(PrometheusMiddleware, app_name='video_api') | 79 app.add_middleware(PrometheusMiddleware, app_name='video_api') |
80 app.add_route("/metrics", handle_metrics) | 80 app.add_route("/metrics", handle_metrics) |
81 | |
82 app.state.processTask = asyncio.create_task(dl_queue.process()) | |
81 return app | 83 return app |
82 | 84 |
83 | 85 |
84 app = main() | 86 app = main() |