import os import tkinter as tk from tkinter import filedialog from pytube import YouTube import pickle # Output directories for MP3 and MP4 files mp3_output_directory = "" mp4_output_directory = "" # File name for storing the directories config_file = "config/directories.pickle" def create_directory(directory): if not os.path.exists(directory): os.makedirs(directory) def save_directories(): global mp3_output_directory, mp4_output_directory directories = { "mp3": mp3_output_directory, "mp4": mp4_output_directory } with open(config_file, "wb") as f: pickle.dump(directories, f) def load_directories(): global mp3_output_directory, mp4_output_directory if os.path.isfile(config_file): with open(config_file, "rb") as f: directories = pickle.load(f) mp3_output_directory = directories.get("mp3", "") mp4_output_directory = directories.get("mp4", "") def select_directory(format_type): global mp3_output_directory, mp4_output_directory # Open directory selection dialog directory = filedialog.askdirectory() if format_type == "mp3": mp3_output_directory = directory elif format_type == "mp4": mp4_output_directory = directory def open_settings(): settings_window = tk.Toplevel(window) settings_window.title("Settings") settings_window.geometry("300x200") # MP3 output directory selection mp3_label = tk.Label(settings_window, text="MP3 Output Directory:") mp3_label.pack() mp3_directory_entry = tk.Entry(settings_window, width=50) mp3_directory_entry.insert(tk.END, mp3_output_directory) mp3_directory_entry.pack() def select_mp3_directory(): directory = filedialog.askdirectory() mp3_directory_entry.delete(0, tk.END) mp3_directory_entry.insert(tk.END, directory) mp3_directory_button = tk.Button(settings_window, text="Select Directory", command=select_mp3_directory) mp3_directory_button.pack() # MP4 output directory selection mp4_label = tk.Label(settings_window, text="MP4 Output Directory:") mp4_label.pack() mp4_directory_entry = tk.Entry(settings_window, width=50) mp4_directory_entry.insert(tk.END, mp4_output_directory) mp4_directory_entry.pack() def select_mp4_directory(): directory = filedialog.askdirectory() mp4_directory_entry.delete(0, tk.END) mp4_directory_entry.insert(tk.END, directory) mp4_directory_button = tk.Button(settings_window, text="Select Directory", command=select_mp4_directory) mp4_directory_button.pack() def save_settings(): global mp3_output_directory, mp4_output_directory mp3_output_directory = mp3_directory_entry.get() mp4_output_directory = mp4_directory_entry.get() save_directories() settings_window.destroy() # Save button save_button = tk.Button(settings_window, text="Save", command=save_settings) save_button.pack() def download_video(): url = url_entry.get() save_as_mp3 = mp3_var.get() save_as_mp4 = mp4_var.get() selected_quality = quality_var.get() if not save_as_mp3 and not save_as_mp4: status_label.config(text="Please select at least one format.") return try: video = YouTube(url) if save_as_mp3: audio = video.streams.filter(only_audio=True).first() create_directory(mp3_output_directory) audio.download(output_path=mp3_output_directory) status_label.config(text="MP3 file downloaded successfully.") if save_as_mp4: create_directory(mp4_output_directory) stream = video.streams.filter(progressive=True) filtered_streams = [] for s in stream: if s.resolution == selected_quality: filtered_streams.append(s) if len(filtered_streams) > 0: filtered_streams[0].download(output_path=mp4_output_directory) status_label.config(text="MP4 file downloaded successfully.") else: status_label.config(text="No stream found in the specified quality.") except Exception as e: status_label.config(text="Error while downloading: " + str(e)) # Create GUI window = tk.Tk() window.title("YouTube Downloader") # URL entry field url_label = tk.Label(window, text="YouTube URL:") url_label.pack() url_entry = tk.Entry(window, width=50) url_entry.pack() # Format selection checkboxes format_label = tk.Label(window, text="Format:") format_label.pack() mp3_var = tk.IntVar() mp3_checkbox = tk.Checkbutton(window, text=".mp3", variable=mp3_var) mp3_checkbox.pack() mp4_var = tk.IntVar() mp4_checkbox = tk.Checkbutton(window, text=".mp4", variable=mp4_var) mp4_checkbox.pack() # Video quality selection dropdown quality_label = tk.Label(window, text="Video Quality:") quality_label.pack() quality_var = tk.StringVar() quality_var.set("720p") # Default quality quality_dropdown = tk.OptionMenu(window, quality_var, "144p", "240p", "360p", "480p", "720p") quality_dropdown.pack() # Download button download_button = tk.Button(window, text="Download", command=download_video) download_button.pack() # Settings button settings_button = tk.Button(window, text="⚙️", width=2, command=open_settings) settings_button.pack(side=tk.RIGHT, padx=10, pady=10) # Status label status_label = tk.Label(window, text="") status_label.pack() # Load directories from config load_directories() # Start GUI window.mainloop()