File size: 1,624 Bytes
78477bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import base64
import pathlib
import tempfile
import gradio as gr

recorder_js = pathlib.Path('recorder.js').read_text()
main_js = pathlib.Path('main.js').read_text()
record_button_js = pathlib.Path('record_button.js').read_text().replace('let recorder_js = null;', recorder_js).replace(
    'let main_js = null;', main_js)


def save_base64_video(base64_string):
    base64_video = base64_string
    video_data = base64.b64decode(base64_video)
    with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as temp_file:
        temp_filename = temp_file.name
        temp_file.write(video_data)
    print(f"Temporary MP4 file saved as: {temp_filename}")
    return temp_filename


with gr.Blocks(title="Screen Recorder Demo") as demo:
    start_button = gr.Button("Record Screen πŸ”΄")
    video_component = gr.Video(interactive=True, show_share_button=True)


    def toggle_button_label(returned_string):
        if returned_string.startswith("Record"):
            return gr.Button(value="Stop Recording βšͺ"), None
        else:
            try:
                temp_filename = save_base64_video(returned_string)
            except Exception as e:
                return gr.Button(value="Record Screen πŸ”΄"), gr.Warning(f'Failed to convert video to mp4:\n{e}')
            return gr.Button(value="Record Screen πŸ”΄"), gr.Video(value=temp_filename, interactive=True,
                                                                show_share_button=True)


    start_button.click(toggle_button_label, start_button, [start_button, video_component], js=record_button_js)

if __name__ == "__main__":
    demo.launch()