import tkinter as tk
from tkinter import ttk, messagebox, filedialog
from pytube import YouTube
from pydub import AudioSegment
import os
def update_progress(stream, chunk, bytes_remaining):
total_size = stream.filesize
bytes_downloaded = total_size - bytes_remaining
percentage = bytes_downloaded / total_size * 100
progress_var.set(percentage)
root.update_idletasks()
def download_video():
url = url_entry.get()
quality = quality_var.get()
save_path = path_entry.get()
if not url:
messagebox.showerror("Error", "Please enter the YouTube URL")
return
try:
yt = YouTube(url, on_progress_callback=update_progress)
if quality == "Audio (MP3)":
stream = yt.streams.filter(only_audio=True).first()
out_file = stream.download(output_path=save_path)
base, ext = os.path.splitext(out_file)
mp3_file = base + '.mp3'
AudioSegment.from_file(out_file).export(mp3_file, format="mp3")
os.remove(out_file)
messagebox.showinfo("Success", f"Downloaded and converted to MP3:\n{mp3_file}")
else:
stream = yt.streams.filter(progressive=True, res=quality, file_extension='mp4').first()
if stream:
stream.download(output_path=save_path)
messagebox.showinfo("Success", f"Downloaded video in {quality}:\n{stream.default_filename}")
else:
messagebox.showerror("Error", f"No stream found for quality {quality}")
except Exception as e:
messagebox.showerror("Error", f"Failed to download video: {e}")
def browse_path():
folder_selected = filedialog.askdirectory()
path_entry.delete(0, tk.END)
path_entry.insert(0, folder_selected)
# GUI Setup
root = tk.Tk()
root.title("Najeeb YouTube Video Downloader")
# URL Entry
url_label = tk.Label(root, text="YouTube URL:")
url_label.grid(row=0, column=0, padx=10, pady=10)
url_entry = tk.Entry(root, width=50)
url_entry.grid(row=0, column=1, padx=10, pady=10)
# Quality Selection
quality_label = tk.Label(root, text="Select Quality:")
quality_label.grid(row=1, column=0, padx=10, pady=10)
quality_var = tk.StringVar(value="720p")
quality_options = ["144p", "360p", "480p", "720p", "1080p", "Audio (MP3)"]
quality_menu = ttk.Combobox(root, textvariable=quality_var, values=quality_options, state="readonly")
quality_menu.grid(row=1, column=1, padx=10, pady=10)
# Save Path
path_label = tk.Label(root, text="Save to:")
path_label.grid(row=2, column=0, padx=10, pady=10)
path_entry = tk.Entry(root, width=50)
path_entry.grid(row=2, column=1, padx=10, pady=10)
browse_button = tk.Button(root, text="Browse", command=browse_path)
browse_button.grid(row=2, column=2, padx=10, pady=10)
# Progress Bar
progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(root, variable=progress_var, maximum=100)
progress_bar.grid(row=3, column=0, columnspan=3, padx=10, pady=20, sticky='ew')
# Download Button
download_button = tk.Button(root, text="Download", command=download_video, bg='lightblue')
download_button.grid(row=4, column=1, padx=10, pady=20)
root.mainloop()