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()