Podcast 播客清单解析工具
2 min read

Podcast 播客清单解析工具

Apple Podcast 订阅列表导出工具
Podcast 播客清单解析工具
Photo by rupixen.com / Unsplash

产品原型

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

足迹