import tkinter as tk
from tkinter import filedialog, messagebox, Listbox, Scrollbar
import feedparser
import requests
import os
def fetch_episodes():
url = url_entry.get()
if not url:
messagebox.showerror("Error", "Please enter a podcast RSS feed URL.")
return
global feed
feed = feedparser.parse(url)
episodes_list.delete(0, tk.END)
if not feed.entries:
messagebox.showerror("Error", "No episodes found or invalid RSS URL.")
return
for i, entry in enumerate(feed.entries[:20]):
title = entry.title
episodes_list.insert(tk.END, f"{i+1}. {title}")
def download_selected():
selected = episodes_list.curselection()
if not selected:
messagebox.showerror("Error", "Please select an episode to download.")
return
entry = feed.entries[selected[0]]
title = feed.feed.title
episode_title = entry.title
audio_url = entry.enclosures[0].href if entry.enclosures else None
if not audio_url:
messagebox.showerror("Error", "No audio found in this episode.")
return
folder = os.path.join("Podcasts", title)
os.makedirs(folder, exist_ok=True)
filename = os.path.join(folder, f"{episode_title}.mp3")
try:
r = requests.get(audio_url, stream=True)
with open(filename, 'wb') as f:
for chunk in r.iter_content(1024):
f.write(chunk)
messagebox.showinfo("Success", f"Downloaded: {episode_title}")
except Exception as e:
messagebox.showerror("Download Failed", str(e))
# GUI setup
app = tk.Tk()
app.title("๐๏ธ Podcast Downloader & Organizer")
app.geometry("500x400")
tk.Label(app, text="Enter Podcast RSS Feed URL:").pack(pady=5)
url_entry = tk.Entry(app, width=60)
url_entry.pack(pady=5)
tk.Button(app, text="Fetch Episodes", command=fetch_episodes).pack(pady=5)
frame = tk.Frame(app)
frame.pack(pady=10, fill=tk.BOTH, expand=True)
scrollbar = Scrollbar(frame)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
episodes_list = Listbox(frame, yscrollcommand=scrollbar.set, width=80)
episodes_list.pack(padx=10, pady=10, expand=True)
scrollbar.config(command=episodes_list.yview)
tk.Button(app, text="Download Selected Episode", command=download_selected, bg="#4CAF50", fg="white").pack(pady=10)
app.mainloop()