File size: 1,466 Bytes
21e6506
 
2b28c21
21e6506
 
2b28c21
21e6506
2b28c21
21e6506
2b28c21
21e6506
2b28c21
21e6506
2b28c21
 
21e6506
 
 
 
 
 
 
 
 
 
 
2b28c21
21e6506
2b28c21
21e6506
 
 
 
2b28c21
21e6506
2b28c21
 
21e6506
 
2b28c21
21e6506
 
 
 
 
 
 
 
 
 
2b28c21
21e6506
 
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
import base64
import tempfile

from openai import AsyncOpenAI
from shiny.express import input, render, ui

from videoinput import audio_spinner, input_video_clip, process_video

client = AsyncOpenAI()

ui.page_opts(class_="py-5")

input_video_clip("clip")


@render.ui
async def show_clip():
    clip = input.clip()
    mime_type = clip["type"]
    bytes = base64.b64decode(clip["bytes"])
    # TODO: Use correct file extension based on mime type
    with tempfile.TemporaryDirectory() as tempdir:
        filename = tempfile.mktemp(dir=tempdir, suffix=get_video_extension(mime_type))
        with open(filename, "wb") as file:
            file.write(bytes)
            file.close()

        with ui.Progress() as p:

            mp3_data_uri = await process_video(
                client,
                filename,
                callback=lambda status: p.set(message=status),
            )
            return audio_spinner(src=mp3_data_uri)


def get_video_extension(mime_type: str) -> str:
    mime_type = mime_type.split(";")[0].strip()

    # Dictionary to map MIME types to file extensions
    mime_to_extension = {
        "video/webm": ".webm",
        "video/mp4": ".mp4",
        "video/ogg": ".ogv",
        "video/x-matroska": ".mkv",
        "video/avi": ".avi",
        "video/mpeg": ".mpeg",
        "video/quicktime": ".mov",
    }

    # Return the appropriate file extension for the given MIME type
    return mime_to_extension.get(mime_type, "")