Skip to content

Instantly share code, notes, and snippets.

@rynsy
Created October 14, 2019 00:35
Show Gist options
  • Save rynsy/ca75bd4909b3ab1dc77d8be6d467dbea to your computer and use it in GitHub Desktop.
Save rynsy/ca75bd4909b3ab1dc77d8be6d467dbea to your computer and use it in GitHub Desktop.
Script to grab all MP3's from an RSS feed (for archiving podcasts)
import feedparser as f
import requests as r
import argparse
import os
import sys
import re
from mutagen.easyid3 import EasyID3
from mutagen.id3 import ID3, APIC
parser = argparse.ArgumentParser()
parser.add_argument("--feed", help="Filename of feed object", type=str)
args = parser.parse_args()
filename = args.feed
feed = f.parse(filename)
path = os.path.join(os.getcwd(), str(feed['feed']['title']))
EasyID3.RegisterTextKey('comment', 'COMM')
cover_link = feed['feed']['image']['href']
if not os.path.exists(path):
try:
os.mkdir(path)
print("Created directory: {}".format(feed['feed']['title']))
except OSError:
print("Couldn't create directory for {} feed".format(feed['feed']['title']))
else:
print("Saving MP3's to folder: {}".format(path))
print("Getting Podcast cover")
cover_data = r.get(cover_link)
if cover_data.status_code == 200:
cover_path = os.path.join(path, "cover.jpeg")
with open(cover_path, "wb") as coverfile:
coverfile.write(cover_data.content)
print("\tSaved cover to {}".format(cover_path))
else:
print("Couldn't get cover")
cover_handle = open(cover_path, "rb")
cover = cover_handle.read()
episode_number = len(feed.entries)
for episode in feed.entries:
title = re.sub('[?/]*','', episode['title'])
dl_link = episode['links'][1]['href']
episode_path = os.path.join(path, str(title) + str(".mp3"))
if os.path.isfile(episode_path):
print("Episode {} exists at {}, skipping".format(title, episode_path))
continue
print("Downloading episode: {}".format(title))
data = r.get(dl_link)
if data.status_code == 200:
with open(episode_path, "wb") as mp3file:
mp3file.write(data.content)
print("\tEpisode {}.mp3 downloaded. Setting metadata...".format(title))
try:
mp3 = EasyID3(episode_path)
mp3['album'] = feed['feed']['title']
mp3['artist'] = feed['feed']['author']
mp3['title'] = title
mp3['comment'] = episode['summary_detail']['value']
mp3['tracknumber'] = str(episode_number)
mp3.save()
print("\tEpisode {}.mp3 metadata set. Setting album art...".format(title))
mp3 = ID3(episode_path)
mp3['APIC'] = APIC(
encoding=3,
mime='image/jpeg',
type=3, desc=u'Cover',
data=cover
)
mp3.save()
print("\tEpisode {}.mp3 album art set.".format(title))
except:
print("\tFailed to set metadata")
else:
print("Couldn't download episode: {}".format(title))
episode_number -= 1
cover_handle.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment