Spaces:
Paused
Paused
| import os | |
| import zipfile | |
| import subprocess | |
| # Function to install missing packages | |
| def install_packages(): | |
| try: | |
| import yt_dlp | |
| import moviepy | |
| import gradio | |
| except ImportError: | |
| subprocess.check_call(["python", "-m", "pip", "install", "yt-dlp==2024.8.6", "moviepy", "gradio"]) | |
| install_packages() | |
| from moviepy.editor import VideoFileClip | |
| import yt_dlp | |
| import gradio as gr | |
| def download_video(url, output_dir="downloads"): | |
| if not os.path.exists(output_dir): | |
| os.makedirs(output_dir) | |
| ydl_opts = { | |
| 'format': 'bestvideo+bestaudio/best', | |
| 'outtmpl': os.path.join(output_dir, 'video.mp4'), | |
| 'noplaylist': True, | |
| 'quiet': True | |
| } | |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
| ydl.download([url]) | |
| def split_video(input_path, output_dir="segments", segment_length=60): | |
| if not os.path.exists(output_dir): | |
| os.makedirs(output_dir) | |
| clip = VideoFileClip(input_path) | |
| duration = int(clip.duration) | |
| segments = [] | |
| for start in range(0, duration, segment_length): | |
| end = min(start + segment_length, duration) | |
| segment = clip.subclip(start, end) | |
| segment_filename = os.path.join(output_dir, f"segment_{start // segment_length + 1}.mp4") | |
| segment.write_videofile(segment_filename, codec="libx264") | |
| segments.append(segment_filename) | |
| return segments | |
| def create_zip(files, zip_filename="video_segments.zip"): | |
| with zipfile.ZipFile(zip_filename, 'w') as zipf: | |
| for file in files: | |
| zipf.write(file, os.path.basename(file)) | |
| return zip_filename | |
| def process_video(url): | |
| download_video(url) | |
| input_path = "downloads/video.mp4" | |
| segments_dir = "segments" | |
| zip_filename = "video_segments.zip" | |
| segments = split_video(input_path, segments_dir) | |
| zip_file = create_zip(segments, zip_filename) | |
| return zip_file | |
| # Gradio Interface | |
| def gradio_interface(url): | |
| zip_file = process_video(url) | |
| return zip_file | |
| interface = gr.Interface( | |
| fn=gradio_interface, | |
| inputs="text", | |
| outputs="file", | |
| title="YouTube Video Downloader and Splitter", | |
| description="Download a YouTube video at the highest quality, split it into 1-minute segments, and zip the segments." | |
| ) | |
| interface.launch() | |