File size: 3,113 Bytes
af28c41 a74c154 5099e75 a74c154 9a2b388 a74c154 5099e75 a74c154 5099e75 a74c154 5099e75 a74c154 5099e75 a74c154 5099e75 a74c154 5099e75 a74c154 5099e75 a74c154 5099e75 a74c154 9a2b388 a74c154 5099e75 a74c154 5099e75 a74c154 5099e75 a74c154 |
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 |
import gradio as gr
import yt_dlp
import os
import re
import time
from moviepy.video.io.VideoFileClip import VideoFileClip
# Function to sanitize the filename
def sanitize_filename(title):
# Replace invalid characters with an underscore
return re.sub(r'[<>:"/\\|?*]', '_', title)
# Function to download video and return the file path
def download_video(url):
download_path = './downloads' # Folder to store downloads
if not os.path.exists(download_path):
os.makedirs(download_path)
ydl_opts = {
'outtmpl': download_path + '/%(title)s.%(ext)s',
'format': 'best', # Download the best available quality
}
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(url, download=True) # Set download=True to download the video
title = info_dict.get('title', None)
if title:
sanitized_title = sanitize_filename(title)
file_path = os.path.join(download_path, f"{sanitized_title}.mp4") # Adjust the extension as needed
return file_path if os.path.exists(file_path) else None # Ensure the file exists before returning
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')
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)
end_time_input = gr.Number(label="End Time (seconds)", value=10)
# File output for downloaded video
output_file = gr.File(label="Download Cropped Video")
# 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):
video_path = download_video(url)
if video_path:
cropped_video_path = crop_video(video_path, start_time, end_time)
if cropped_video_path and os.path.exists(cropped_video_path):
time.sleep(1) # Add a slight delay to ensure file is fully written
return cropped_video_path
return None
process_btn.click(process_video, inputs=[url_input, start_time_input, end_time_input], outputs=output_file)
return demo
# Launch the interface
if __name__ == "__main__":
gradio_interface().launch()
|