Podcast 播客清单解析工具
产品原型
1. background
在写 blog 的时候想分享一下我的播客列表,结果发现 Apple Podcast 应用没有导出订阅列表的功能,所以就想自己写一个工具进行订阅播客列表的导出。
2. ideas
2.1 问题边界
这个工具主要是解决 Apple Podcast app 导出订阅列表的功能。
2.2 问题思路
macOS Catalina 将播客独立成新的 Apple Podcast app,而应用本身没有导出功能,但是经过搜索发现所有的记录都被记录在 plist
文件中,而该文件是一个本地文件:~/Library/Containers/com.apple.podcasts/Data/Documents/PodcastsDB.plist
由此形成我的解决思路:
- 读取 podcast plist 文件
- 解析订阅列表
- 按照模版格式输出
2.3 遗留问题
这个是一个简单的工具,有几个问题决定了这个工具是否可行:
- 该工具依赖
PodcastsDB.plist
文件的存在 - 该工具是一个命令行工具,需要有更加友好的使用方式
- Apple Podcast app 支持导出功能对工具是一个降维打击
3. user portrait
3.1 谁会使用
希望可以分享 Apple Podcast app 订阅列表的人。
3.2 怎么使用
当前是命令行支持,直接运行命令即可。
3.3 什么价值
解决了 Apple Podcast 导出功能的缺失。
MVP 源码
#! /usr/bin/python3
# -*- coding: utf-8 -*-
import os
import sys
import argparse
import plistlib as pl
import logging
def cmdline():
"""cmdline parameter"""
home = os.path.expanduser("~")
default_apple_podcast_plist = os.path.join(
home, "Library/Containers/com.apple.podcasts/Data/Documents/PodcastsDB.plist")
parser = argparse.ArgumentParser(description='Apple Podcast List Parser.')
parser.add_argument('-f', '--filename', type=str, nargs='?',
default=default_apple_podcast_plist, help='file name to parse')
return parser.parse_args()
if __name__ == "__main__":
# create logger
logger = logging.getLogger('logger')
logger.setLevel(logging.DEBUG)
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# create formatter
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch
ch.setFormatter(formatter)
# add ch to logger
logger.addHandler(ch)
if sys.platform != 'darwin':
print("only support macOS Podcast app parsing, please make sure run in macOS")
sys.exit(1)
args = cmdline()
logger.debug(args.filename)
with open(args.filename, 'rb') as buffer:
lists = pl.load(buffer)
output = ""
for item in lists[0]['children'][0]['children']:
output += f'#### {item["title"]}\nurl: {item["feedUrl"]}\n\n'
with open("podcast-list.md", 'w', encoding='utf-8') as output_buffer:
output_buffer.write(output)
demo 数据测试: