Ujeshhh's picture
Update app.py
6e10c3a verified
import gradio as gr
from moviepy.audio.io.AudioFileClip import AudioFileClip
import yt_dlp
import os
def download_youtube(url, output_format, resolution, audio_bitrate):
try:
output_dir = "downloads"
os.makedirs(output_dir, exist_ok=True)
output_template = f"{output_dir}/%(title)s.%(ext)s"
ydl_opts = {
"format": "bestaudio/best" if output_format in ["MP3", "WAV"] else f"bestvideo[height<={resolution[:-1]}]+bestaudio/best",
"outtmpl": output_template,
"postprocessors": [],
}
if output_format == "MP3":
ydl_opts["postprocessors"].append({
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': audio_bitrate.replace("k", ""),
})
elif output_format == "WAV":
ydl_opts["postprocessors"].append({
'key': 'FFmpegExtractAudio',
'preferredcodec': 'wav',
})
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(url, download=True)
filename = ydl.prepare_filename(info_dict)
if output_format in ["MP3", "WAV"]:
filename = os.path.splitext(filename)[0] + f".{output_format.lower()}"
return "Download complete", filename
except Exception as e:
return f"Error: {str(e)}", None
formats = ["MP3", "WAV", "MP4"]
resolutions = ["360p", "480p", "720p", "1080p"]
bitrates = ["64k", "128k", "192k", "256k", "320k"]
interface = gr.Interface(
fn=download_youtube,
inputs=[
gr.Text(label="YouTube Video URL"),
gr.Radio(formats, label="Select Format"),
gr.Dropdown(resolutions, label="Video Resolution (for MP4)", value="720p"),
gr.Dropdown(bitrates, label="Audio Bitrate (for MP3)", value="128k"),
],
outputs=[
gr.Text(label="Status"),
gr.File(label="Download File"),
],
title="🎡 YouTube Downloader",
description="Download YouTube videos as MP3, WAV, or MP4 with quality selection. Built with Pytube + Gradio."
)
if __name__ == "__main__":
os.makedirs("downloads", exist_ok=True)
interface.launch()