Ytstock / app.py
Artificial-superintelligence's picture
Update app.py
cd153ea verified
raw
history blame
3.37 kB
import gradio as gr
import yt_dlp
import os
import re
from moviepy.video.io.VideoFileClip import VideoFileClip
# Function to sanitize the filename
def sanitize_filename(title):
return re.sub(r'[<>:"/\\|?*]', '_', title)
# Function to download video and return the file path
def download_video(url):
download_path = './downloads'
if not os.path.exists(download_path):
os.makedirs(download_path)
ydl_opts = {
'outtmpl': os.path.join(download_path, '%(title)s.%(ext)s'),
'format': 'best',
}
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(url, download=True)
title = info_dict.get('title', None)
if title:
sanitized_title = sanitize_filename(title)
file_path = os.path.join(download_path, f"{sanitized_title}.mp4")
return file_path if os.path.exists(file_path) else None
return None
except Exception as e:
return str(e)
# Function to crop the video
def crop_video(input_path, start_time, end_time):
output_path = input_path.replace('.mp4', '_cropped.mp4')
try:
with VideoFileClip(input_path) as video:
cropped_video = video.subclip(start_time, end_time)
cropped_video.write_videofile(output_path, codec='libx264', audio_codec='aac')
return output_path
except Exception as e:
return str(e)
# Create Gradio interface
def gradio_interface():
with gr.Blocks() as demo:
gr.Markdown("# YouTube Video Downloader and Cropper")
gr.Markdown("Enter the YouTube URL to download and crop the video.")
# Input for YouTube URL
url_input = gr.Textbox(label="YouTube URL", placeholder="Enter YouTube video URL here...")
# Inputs for cropping
start_time_input = gr.Number(label="Start Time (seconds)", value=0, interactive=True)
end_time_input = gr.Number(label="End Time (seconds)", value=10, interactive=True)
# File output for downloaded video
output_file = gr.File(label="Download Cropped Video")
# Status message for user feedback
status_message = gr.Textbox(label="Status", placeholder="Processing...", interactive=False)
# Download and Crop button
process_btn = gr.Button("Download and Crop Video")
# Define the action on button click
def process_video(url, start_time, end_time):
status_message.value = "Downloading video..."
video_path = download_video(url)
if video_path:
status_message.value = "Cropping video..."
cropped_video_path = crop_video(video_path, start_time, end_time)
if cropped_video_path and os.path.exists(cropped_video_path):
return cropped_video_path, "Done! You can download your video below."
else:
status_message.value = "Error cropping video."
else:
status_message.value = "Error downloading video. Please check the URL."
return None, status_message.value
process_btn.click(process_video, inputs=[url_input, start_time_input, end_time_input], outputs=[output_file, status_message])
return demo
# Launch the interface
if __name__ == "__main__":
gradio_interface().launch()