File size: 2,932 Bytes
a74c154
 
5099e75
a74c154
 
5099e75
a74c154
 
 
 
5099e75
a74c154
 
 
 
 
5099e75
a74c154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5099e75
a74c154
 
 
 
 
 
 
 
 
 
5099e75
a74c154
 
 
 
 
5099e75
a74c154
 
 
 
 
 
5099e75
a74c154
 
 
 
 
5099e75
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
 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):
    # 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)
                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()