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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
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
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
6 from prometheus_client import Gauge
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
7 from starlette.applications import Starlette
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
8 from starlette.requests import Request
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
9 from starlette.responses import HTMLResponse, JSONResponse, Response
3
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
10 from starlette.routing import Route
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
11 from starlette_exporter import PrometheusMiddleware, handle_metrics
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
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
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
14 from video_file_store import VideoFileStore
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
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
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
17 logging.basicConfig(level=logging.DEBUG)
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
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
drewp@bigasterisk.com
parents:
diff changeset
20
drewp@bigasterisk.com
parents:
diff changeset
21
3
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
22 def root(req):
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
23 return HTMLResponse("api")
0
drewp@bigasterisk.com
parents:
diff changeset
24
drewp@bigasterisk.com
parents:
diff changeset
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
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
39
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
40 async def ingestVideoUrl(req: Request) -> Response:
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
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
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
43 return Response(status_code=202)
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
44
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
45
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
46 async def ingestVideoUpload(req: Request) -> Response:
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
47 name = req.query_params['name']
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
48 await svc.addContent(name, req.body())
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
49 return Response(status_code=200)
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
50
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
51
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
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
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
57
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
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
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
60 svc = VideoIngest(store)
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
61
4
c8a41359505c server provides video listing from disk
drewp@bigasterisk.com
parents: 3
diff changeset
62 def main():
3
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
63
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
64 app = Starlette(
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
65 debug=True,
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
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
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
69 Route('/video/api/ingest/videoUpload',
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
70 ingestVideoUpload,
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
71 methods=['POST']),
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
72 Route('/video/api/ingest/videoUrl',
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
73 ingestVideoUrl,
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
74 methods=['POST']),
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents: 6
diff changeset
75 Route('/video/api/ingest/queue', ingestQueue),
3
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
76 ],
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
77 )
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
78
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
79 app.add_middleware(PrometheusMiddleware, app_name='video_api')
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
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
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
84
ee55ed10faec start py service deployment
drewp@bigasterisk.com
parents: 0
diff changeset
85
4
c8a41359505c server provides video listing from disk
drewp@bigasterisk.com
parents: 3
diff changeset
86 app = main()