An interactive python script that downloads all the podcasts for a given RSS feed. It also allows you to preview all the files that will be downloaded.
This requires requests
.
pip install requests
import requests | |
import xml.etree.ElementTree as ET | |
import urllib.request | |
import os | |
def download_podcast_episodes_interactive(): | |
# Namespace definition for parsing iTunes-specific tags | |
ns = {'itunes': 'http://www.itunes.com/dtds/podcast-1.0.dtd'} | |
# Prompt the user for the RSS feed URL | |
rss_url = input("Enter the RSS feed URL of the podcast: ") | |
# Fetch the RSS feed content | |
response = requests.get(rss_url) | |
if response.status_code == 200: | |
rss_content = response.content | |
# Parse the XML content of the RSS feed | |
root = ET.fromstring(rss_content) | |
# Attempt to fetch podcast title | |
channel = root.find('.//channel') | |
podcast_title = channel.find('title').text if channel is not None else "Unknown Podcast" | |
episodes = root.findall('.//item') | |
total_episodes = len(episodes) | |
print(f"Podcast Name: {podcast_title}") | |
print(f"Total Episodes: {total_episodes}") | |
# Ask the user what they wish to do next | |
action = input("Enter 'yes' to download all episodes, 'preview' to see filenames, or 'no' to cancel: ").lower() | |
podcast_dir = podcast_title.replace(" ", "_").replace("/", "_") # Simplify the title for the folder name | |
if not os.path.exists(podcast_dir): | |
os.makedirs(podcast_dir) | |
# Preview or download each episode | |
for item in episodes: | |
title = item.find('title').text | |
episode_number = item.find('itunes:episode', ns) | |
if episode_number is not None: | |
episode_number = episode_number.text | |
else: | |
episode_number = "Unknown" | |
audio_url = item.find('.//enclosure').attrib['url'] | |
# Format filename to include episode number and title | |
filename = f"{episode_number} - {title}".replace("/", "-") # Replace disallowed characters | |
filename = "".join([c for c in filename if c.isalpha() or c.isdigit() or c==' ' or c=='-' or c=='.']).rstrip() | |
filepath = os.path.join(podcast_dir, filename + '.mp3') | |
if action == "preview": | |
print(f"Will download: {filename}") | |
elif action == "yes": | |
# Download the audio file if it doesn't already exist | |
if not os.path.exists(filepath): | |
print(f"Downloading: {filename}") | |
urllib.request.urlretrieve(audio_url, filepath) | |
print(f"Downloaded: {filepath}") | |
else: | |
print(f"Already exists: {filepath}") | |
if action == "no": | |
print("Download canceled.") | |
else: | |
print("Failed to fetch RSS feed.") | |
# Start the interactive downloading process | |
download_podcast_episodes_interactive() |