Created
October 14, 2019 00:35
-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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