Jeffgold's picture
Update app.py
5fc270d
raw
history blame
2.44 kB
import time
import os
import gradio as gr
import ffmpeg
import subprocess
from gradio import components
import tempfile
from pathlib import Path
from gradio import inputs
# Define File object
File = Path
# Define temp directory
temp_dir = tempfile.mkdtemp()
video_file = gr.inputs.File(label="Video File", type="file")
quality = gr.inputs.Dropdown(choices=["18", "23", "28", "32"], label="Quality", default="23")
aspect_ratio = gr.inputs.Dropdown(choices=[
"1:1",
"4:3",
"3:2",
"5:4",
"16:9",
"21:9",
"1.85:1",
"2.35:1",
"3:1",
"360",
"9:16",
"16:9",
"2:1",
"1:2",
"9:1",
], label="Aspect Ratio", default="16:9")
video_url = gr.inputs.Textbox(label="Video URL")
def convert_video(video_file: File, quality, aspect_ratio, video_url):
if video_file is None:
video_file = Path(video_url)
# Get the file extension
file_extension = video_file.name.split(".")[-1]
# Remove the file extension
output_path = video_file.name[:-len(file_extension)]
# Add the .mp4 file extension
output_path += ".m3u8"
# Set the output path to the temp directory
output_path = os.path.join(temp_dir, output_path)
if os.path.exists(output_path):
# The file already exists, so we can just display it in the output viewer
gr.outputs.Video(output_path)
else:
# The file does not exist, so we need to convert it
ffmpeg_command = f"ffmpeg -i {video_file} -c:v libx264 -crf {quality} -f mp4 -aspect {aspect_ratio} {output_path}"
try:
subprocess.run(ffmpeg_command, shell=True, timeout=10)
except subprocess.TimeoutExpired:
print("ffmpeg timed out")
return None
except FileNotFoundError:
print("ffmpeg is not installed.")
return None
for i in range(10):
if os.path.exists(output_path):
break
else:
time.sleep(1)
# The file has now been converted, so we can display it in the output viewer
gr.outputs.Video(output_path)
# Create a temporary file to store the download link
with tempfile.NamedTemporaryFile(delete=False) as f:
f.write(output_path.encode())
download_link = f.name
# Add a button to download the file
gr.outputs.HTML("""
<a href="{}" download="downloaded_file.mp4">Download</a>
""".format(download_link))
from gradio import outputs
gr.Interface(convert_video, inputs=[video_file, quality, aspect_ratio, video_url], outputs=[outputs.Video()]).launch()