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