Podcast 播客清单解析工具
Apple 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 数据测试:
Public discussion