File size: 3,037 Bytes
5943625
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
249efe7
5943625
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fac62a1
249efe7
5943625
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import json
import gradio as gr
import requests
import os



def get_presigned_url(Video_input):
    
    file_name = os.path.basename(Video_input)
    print(file_name)
    response = requests.get(
        "https://lfipbncruqwwpzis5owg7danqm0ezcjr.lambda-url.us-west-1.on.aws", 
        params={"filename": file_name}
    )

    if response.status_code == 200:
        data = json.loads(response.text)
        presigned_url = data['presignedUrl']
        
    
    # Use the presigned_url and object_key in your Gradio app
        return presigned_url
    else:
        print(f"Error: Status code {response.status_code}")
        return None


def upload_to_s3(video_input, presigned_url):
    url = presigned_url['url']
    fields = presigned_url['fields']

    key = presigned_url['fields']['key']
    #print(fields)
    if video_input is None or presigned_url is None:
        return "No file selected or presigned URL not available."
    
    try:
        with open(video_input, 'rb') as file:
            response = requests.post(url, data=fields, files={"file": file})
            # response = requests.put(presigned_url, data=file, headers={'Content-Type': 'video/mp4'})
        
        if response.status_code == 204:
            return "File uploaded successfully.", key
        else:
            return f"Upload failed. Status code: {response.status_code}"
    except Exception as e:
        return f"Error during upload: {str(e)}"

# def process_video(video_url):
#     #... (process video from S3 URL)...

def handle_upload(video_input):
    presigned_url = get_presigned_url(video_input)
    # print(presigned_url)
    return upload_to_s3(video_input, presigned_url)

def perform_inference(key):
    if key:
        api_url = "https://xvgvbxenint7vknztncwcxz2640aunqp.lambda-url.us-west-1.on.aws"
        response = requests.post(api_url, json={"objectKey": key})
        # print(response.json())
        json_response = response.json()
        # print(json_response['choices'][0]['message']['content'])
        return f"Inference completed on file: {json_response['choices'][0]['message']['content']}"
    else:
        return "No file uploaded for inference."

with gr.Blocks() as demo:

    gr.HTML("<h1>Video Inference Demo.</h1>")
    gr.HTML("<p>Please upload short video clips upto 50MB for better experience!</p>")
    
    #video_input = gr.File(label="Upload Video")
    video_input=gr.Video(label="Upload Video"),
    upload_status = gr.Textbox(label="Upload Status", interactive=False)
    s3_url = gr.Textbox(label="S3 URL", visible=False)
    inference_result = gr.Textbox(label="Inference Result", interactive=False)

    # Chain functions using .then()
    upload_button = gr.Button("Upload and Run Inference")
    upload_button.click(
        fn=handle_upload,
        inputs=video_input,
        outputs=[upload_status, s3_url]
    ).then(
        fn=perform_inference,
        inputs=s3_url,  # Use output of previous function automatically
        outputs=inference_result
    )

demo.launch(share=True)