RumaDev's picture
Create app.py
50d6eaf verified
import gradio as gr
import yt_dlp
import os
import time
import threading
def download_video(url, resolution):
# Define resolution options
resolutions = {
"2160p": "bestvideo[height<=2160]+bestaudio/best",
"1440p": "bestvideo[height<=1440]+bestaudio/best",
"1080p": "bestvideo[height<=1080]+bestaudio/best",
"720p": "bestvideo[height<=720]+bestaudio/best",
"480p": "bestvideo[height<=480]+bestaudio/best",
}
try:
# Set yt-dlp options
ydl_opts = {
'format': resolutions[resolution],
'outtmpl': '%(title)s.%(ext)s',
'noplaylist': True,
'merge_output_format': 'mp4',
'postprocessors': [{
'key': 'FFmpegVideoConvertor',
'preferedformat': 'mp4', # Ensure output is in MP4 format
}],
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(url, download=True)
filename = ydl.prepare_filename(info_dict)
# Check if the file already exists
if os.path.exists(filename):
os.remove(filename) # Remove the existing file
ydl.download([url])
yield filename # Yield the filename to display the video
time.sleep(10) # Wait for 20 seconds before deleting the file
if os.path.exists(filename):
os.remove(filename) # Remove the file after 20 seconds
except Exception as e:
yield None
print("An error occurred:", e)
def download_audio(url):
try:
# Set yt-dlp options for audio download
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': '%(title)s.%(ext)s',
'noplaylist': True,
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
}],
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(url, download=True)
filename = ydl.prepare_filename(info_dict).replace('.webm', '.mp3').replace('.m4a', '.mp3')
# Check if the file already exists
if os.path.exists(filename):
os.remove(filename) # Remove the existing file
ydl.download([url])
yield filename # Yield the filename to display the audio
time.sleep(20) # Wait for 20 seconds before deleting the file
if os.path.exists(filename):
os.remove(filename) # Remove the file after 20 seconds
except Exception as e:
yield None
print("An error occurred:", e)
# Create Gradio interface
with gr.Blocks() as iface:
with gr.Tab("MP4 Downloader"):
gr.Markdown("### Download YouTube videos as MP4")
url_input_mp4 = gr.Textbox(label="YouTube URL", placeholder="Enter YouTube URL here")
resolution_input = gr.Dropdown(label="Resolution", choices=["2160p", "1440p", "1080p", "720p", "480p"], value="1080p")
download_button_mp4 = gr.Button("Download MP4")
output_mp4 = gr.Video(label="Downloaded Video")
download_button_mp4.click(download_video, inputs=[url_input_mp4, resolution_input], outputs=output_mp4)
with gr.Tab("MP3 Downloader"):
gr.Markdown("### Download YouTube videos as MP3")
url_input_mp3 = gr.Textbox(label="YouTube URL", placeholder="Enter YouTube URL here")
download_button_mp3 = gr.Button("Download MP3")
output_mp3 = gr.Audio(label="Downloaded Audio")
download_button_mp3.click(download_audio, inputs=[url_input_mp3], outputs=output_mp3)
iface.launch()