如果像一样喜欢在手机上离线收听播客,可能会发现很多网站并没有提供直接的下载按钮,这迫使不得不手动寻找文件。最近,在访问Changelog.com的播客时遇到了这个问题,所以决定编写一个小型的控制台应用程序,直接将mp3文件下载到磁盘上。
前提条件:这将是一个相对简单但仍然有用的教程。要跟上,只需要一个PythonIDE和基本的Python技能。可以在GitHub页面上找到项目的完整源代码。
由于即将编写的是一个相当小的控制台应用程序,决定将所有内容都放在一个文件中。首先,创建一个名为changelog_mp3.py的空文件。为了使其可执行,应该在文件顶部添加标准的Pythonshebang:
#!/bin/python3
在Changelog概览页面上,会发现有几个播客类别可供选择。一旦打开感兴趣的类别并选择一个播客,将看到一些关于播客的信息和一个在线播放器。要获取实际的mp3文件,必须右键点击播放按钮,并在新标签页中打开链接。看看URL,将看到想要下载的文件,例如JS Party播客的js-party-25。
可以以类似的方式获取其他播客的基础URL,这使能够为所有播客初始化一个数组:
base_urls = [
'https://cdn.changelog.com/uploads/podcast//the-changelog-.mp3',
'https://cdn.changelog.com/uploads/gotime//go-time-.mp3',
'https://cdn.changelog.com/uploads/rfc//request-for-commits-.mp3',
'https://cdn.changelog.com/uploads/founderstalk//founders-talk-.mp3',
'https://cdn.changelog.com/uploads/spotlight//spotlight-.mp3',
'https://cdn.changelog.com/uploads/jsparty//js-party-.mp3',
]
让进入这个程序的核心:下载播客的代码。所有的魔法都将发生在下面的download_podcasts方法中:
def download_podcast(podcast_id):
base_url = base_urls[podcast_id - 1]
print("Enter one or more episodes to download:")
episodes = (int(x) for x in input().split(','))
target = '/home/philipp/Downloads/'
for episode in episodes:
download_url = base_url.replace('', str(episode))
print(f'Downloading episode {episode} to {target}')
try:
urllib.request.urlretrieve(download_url, target + download_url.split('/')[ -1 ])
print('Download complete!')
except:
print(f'Could not download file: {download_url}')
方法的唯一参数是podcast_id,它告诉程序应该下载哪个类别的播客。接下来,要求用户输入一个或多个他们想要下载的剧集编号,并定义mp3文件的目标文件夹。
在下面的for循环中,简单地遍历所有选定的剧集,用剧集编号替换‘id’占位符,这样就得到了一个有效的URL,最后下载文件。由于使用的是urllib库,必须在文件顶部添加一个import语句:
import urllib.request
这就是需要从Changelog.com下载并存储为mp3文件的所有内容。要调用新代码,在main方法中实现了一个简单的控制台UI:
def main():
print('Which podcast would you like to download?')
print('(1) - The Changelog')
print('(2) - Go Time')
print('(3) - Request for Commits')
print('(4) - Founders Talk')
print('(5) - Spotlight')
print('(6) - JS Party')
n = int(input())
download_podcast(n)
if __name__ == "__main__":
main()