Spaces:
Paused
Paused
File size: 4,658 Bytes
c16a803 07853df a56389b 6312c58 a56389b 6312c58 a56389b 6312c58 a56389b b9f7ba4 c16a803 40446f2 6c154f8 c16a803 6c154f8 79683ca 07853df 79683ca c047e75 e4ed31e cbd85fc 6312c58 6c154f8 3c753ee 07853df 6312c58 6c154f8 79683ca 6c154f8 6f1f7b0 07853df 6312c58 30f78b0 6312c58 30f78b0 1229389 07853df f34662a 5a36eaa f34662a 0212a08 2d3ac4b e280197 1794bc0 bd750f5 2d3ac4b 5a36eaa 1794bc0 6312c58 1794bc0 30f78b0 1794bc0 1229389 2d3ac4b 1229389 07853df 1794bc0 30f78b0 2d3ac4b 7c6cdc8 24cbec9 2d3ac4b 6312c58 2d3ac4b 9aa63f0 07853df 6312c58 6d80bec 07853df 6c154f8 68299e3 6312c58 3086083 68299e3 99535b7 1229389 99535b7 6312c58 |
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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
import logging
import requests
from urllib.parse import urlparse
import subprocess
from flask import Flask, send_from_directory
from threading import Thread
from pathlib import Path
from moviepy.editor import VideoFileClip
import gradio as gr
# Initialize a Flask application
app = Flask(__name__)
output_dir = Path.cwd() / "output"
output_dir.mkdir(exist_ok=True)
@app.route('/files/<path:path>')
def serve_file(path):
return send_from_directory(output_dir, path)
# Start the Flask server in a new thread
Thread(target=app.run, kwargs={'host': '0.0.0.0', 'port': 5000}).start()
logging.basicConfig(level=logging.INFO)
def download_file(url, destination):
response = requests.get(url)
response.raise_for_status()
with open(destination, 'wb') as f:
f.write(response.content)
def get_input_path(video_file, video_url):
if video_file is not None:
return Path(video_file.name)
elif video_url:
url_path = urlparse(video_url).path
file_name = Path(url_path).name
destination = output_dir / file_name
download_file(video_url, destination)
return destination
else:
raise ValueError("No input was provided.")
def get_output_path(input_path, res):
output_path = output_dir / (Path(input_path).stem + f"_{res}.m3u8")
return output_path
def get_aspect_ratio(input_path, aspect_ratio):
if aspect_ratio is not None:
return aspect_ratio
video = VideoFileClip(str(input_path))
return f"{video.size[0]}:{video.size[1]}"
def create_master_playlist(output_paths):
master_playlist_path = output_dir / "master_playlist.m3u8"
with open(master_playlist_path, 'w') as f:
f.write("#EXTM3U\n")
for path in output_paths:
f.write(f"#EXT-X-STREAM-INF:BANDWIDTH={1000*1000},RESOLUTION={path.stem.split('_')[-1]}\n")
f.write(f"{path.name}\n")
return master_playlist_path
def convert_video(video_file, quality, aspect_ratio, video_url):
input_path = get_input_path(video_file, video_url)
aspect_ratio = get_aspect_ratio(input_path, aspect_ratio)
video = VideoFileClip(str(input_path))
original_height = video.size[1]
output_paths = []
for res in standard_resolutions:
if res > original_height:
continue
scale = "-1:" + str(res)
output_path = get_output_path(input_path, str(res) + 'p')
ffmpeg_command = [
"ffmpeg", "-i", str(input_path), "-c:v", "libx264", "-crf", str(quality),
"-vf", f"scale={scale}:force_original_aspect_ratio=decrease,pad=ceil(iw/2)*2:ceil(ih/2)*2",
"-hls_time", "10", "-hls_playlist_type", "vod", "-hls_segment_filename",
str(output_dir / f"{output_path.stem}_%03d.ts"), str(output_path)
]
logging.info("Running ffmpeg command: " + ' '.join(ffmpeg_command))
subprocess.run(ffmpeg_command, check=True)
output_paths.append(output_path)
master_playlist_path = create_master_playlist(output_paths)
output_paths.append(master_playlist_path)
html_blocks = []
for path in output_paths:
video_path = f'http://localhost:5000/files/{path.name}'
video_component = f'''
<div style="margin-bottom: 20px; border: 1px solid #ccc; padding: 10px;">
<video controls>
<source src="{video_path}" type="application/x-mpegURL">
Your browser does not support the video tag.
</video>
<p>
<a href="{video_path}" target="_blank">Download {path.stem}</a>
</p>
<p>Resolution: {path.stem.split('_')[-1]}</p>
</div>
'''
html_blocks.append(video_component)
return "\n".join(html_blocks),
video_file = gr.inputs.File(label="Video File")
quality = gr.inputs.Dropdown(choices=["18", "23", "27", "28", "32"], default="27", label="Quality")
aspect_ratio = gr.inputs.Dropdown(choices=["16:9", "1:1", "4:3", "3:2", "5:4", "21:9", "1.85:1", "2.35:1", "3:1", "360", "9:16", "2:1", "1:2", "9:1"], default="16:9", label="Aspect ratio (width:height)")
standard_resolutions = [4320, 2160, 1440, 1080, 720, 480, 360, 240, 144] # 8K, 4K, 2K, Full HD, HD, SD in pixels
video_url = gr.inputs.Textbox(label="Or enter video URL")
interface = gr.Interface(
fn=convert_video,
inputs=[video_file, quality, aspect_ratio, video_url],
outputs=[gr.outputs.HTML(label="Download Links")],
title="Video Converter",
description="A simple video converter app",
allow_flagging=False
)
interface.launch(server_name="0.0.0.0", server_port=7860)
|