File size: 2,396 Bytes
485608a
faa2bdb
 
 
c8942d9
faa2bdb
 
7a80d3a
faa2bdb
5296733
faa2bdb
40446f2
d47c1c5
40446f2
ec46e62
 
 
701ed9a
 
 
b7d9c54
131761b
06412df
6f1f7b0
 
 
 
 
 
 
 
 
1819951
6f1f7b0
 
1819951
6f1f7b0
c137773
6f1f7b0
 
 
785f173
6f1f7b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4c21960
6f1f7b0
 
 
 
 
 
 
 
 
 
 
7a80d3a
2024db3
 
6f1f7b0
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
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")

def get_aspect_ratio(video_file):
  # Get the path to the ffprobe binary
  ffprobe_path = ffmpeg.probe_path()

  # Get the command to get the aspect ratio of the video
  ffprobe_command = f"{ffprobe_path} -show_entries stream=width,height -of compact=p=0:nk=1 {video_file}"

  # Run the command and get the output
  output = subprocess.check_output(ffprobe_command, shell=True).decode("utf-8")

  # Get the aspect ratio from the output
  aspect_ratio = output.split()[0].split(":")[1]

  return aspect_ratio

def convert_video(video_file: File, quality, aspect_ratio):
  if video_file is None:
    video_file = Path(video_url)

  # Get the original aspect ratio of the video
  original_aspect_ratio = get_aspect_ratio(video_file)

  # Check if the aspect ratio is already set
  if aspect_ratio == original_aspect_ratio:
    return video_file

  # Set the aspect ratio
  ffmpeg_command = f"ffmpeg -i {video_file} -c:v libx264 -crf {quality} -f mp4 -aspect {aspect_ratio} {video_file}"

  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(video_file):
      break
    else:
      time.sleep(1)

  # The file has now been converted, so we can display it in the output viewer
  if os.path.exists(video_file):
    gr.components.Video(video_file)
  else:
    print("File does not exist.")

  # 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.components.HTML("""
  # <a href="{}" download="downloaded_file.mp4">Download</a>
  # """.format(download_link))

from gradio import outputs

gr.Interface(convert_video, inputs=[video_file, quality], outputs=[outputs.Video()]).launch(share=True)