File size: 2,270 Bytes
33bdf0e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import os.path

from fastapi import FastAPI, Response, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
import subprocess
import random
import string
import cv2
import os
app = FastAPI()
origins = ["*"]
app.add_middleware(CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"],allow_headers=["*"])

def generate_random_filename(length=10):
    characters = string.ascii_letters + string.digits
    random_filename = ''.join(random.choice(characters) for _ in range(length))
    return random_filename

def save_video(image_folder):
    output_video = os.path.join(image_folder, 'output_video.mp4')
    images = [img for img in os.listdir(image_folder) if img.endswith(".jpg")]
    if not images or len(images) < 2:
        return None
    images.sort()
    frame = cv2.imread(os.path.join(image_folder, images[0]))
    height, width, layers = frame.shape
    video = cv2.VideoWriter(output_video, cv2.VideoWriter_fourcc(*'mp4v'), 30, (width, height))
    for image in images:
        video.write(cv2.imread(os.path.join(image_folder, image)))
    cv2.destroyAllWindows()
    video.release()
    return output_video


@app.get("/")
def run_scenario_script():
    return {'msg': 'hi'}
@app.get("/run/")
async def run_scenario_script(file: UploadFile = File(...)):
    filename = file.filename
    file_content = await file.read()
    file_text = file_content.decode("utf-8")
    # xosc file
    # todo python path
    cur_dir = generate_random_filename(length=4)
    cur_dir = os.path.join('./temp', cur_dir)
    runner = subprocess.Popen(['python', 'scenario_runner.py', '-openscenario', ''])
    autopilot = subprocess.Popen(['python', 'autopilot_control_offscreen.py', '-save_dir', cur_dir])
    _, _ = runner.communicate()
    _, _ = autopilot.communicate()
    code_r = runner.poll()
    code_a = autopilot.poll()
    video_path = save_video(cur_dir)
    if video_path is None:
        return Response(content="No video.", media_type="text/plain")
    with open(video_path, 'rb') as video_file:
        video_data = video_file.read()
    return Response(content=video_data, media_type="video/mp4")

if __name__ == '__main__':
    uvicorn.run(app='scenario_api:app', host="0.0.0.0", port=8456, reload=True)