使用 RSS 发布播客

2023-02-10 ⏳4.5分钟(1.8千字) g

最近在练习英语听力,想试试广播剧。研究了一番后发现,英语有很多优秀的广播剧资源1。其中做的最好的就是英国,而 BBC 甚至还出品了经典的《指环王》。所以我就从网找到了指环王的资源2,放到博客服务器上。但直接使用浏览器不太方便,我就想能不能做成播客,也就是 Podcast,然后用手机自带的播客工具播放。制作过程比我想像的要复杂,今天把整个过程分享给大家。

苹果手机自带播客软件,苹果官方也维护自己的播客商店。所有发布的内容必须通过苹果审核。就是这么封闭的生态,苹果居然依赖开放的技术来运营播客。这种开放性一方面表现在苹果内置的播客软件是所谓的泛用型播客户端。它不光可以播放苹果商店的内容,还可以通过 RSS 链接订阅任意播客内容。这跟国内一众专用音频平台不同。另一方面,播客内容由作者托管,苹果的播客商店只负责保存发布信息。而这些发布信息同样使用开放的 RSS 格式来传输。本文的主要内容就是讲如何制成符合苹果标准3的 RSS 文件。

在制作 RSS 文件之前,首先我们需要有一组音频文件。播客支持很多种音频格式,常见的有 MP3 和 AAC 等。我下载的 Lord of the Rings 是 MP3 格式。有了音频还需要将它们上传到某 WEB 服务器上,每个文件需要有一个唯一的下载链接。注意,用户每次收听都要到这个链接下载音频文件。

然后我们就可以制作 RSS 文件了。RSS 本来是一种用来发布博客内容更新的 XML 文件。曾经在博客时代大行其道,现在已经式微了。虽然后来有了更合理也更严格的 ATOM 格式,但因为 RSS 比较简单,所以一直没有被淘汰。我估计苹果选用 RSS 应该也是觉得它比较简单。

播客用的 RSS 有很多字段,但幸运的是必填的字段不多。一番搜索之后,我找到了苹果的官方文档4。文档中详细列举了需要的字段以及它们在播客应用中的展示方式。

比如播客详情的展示方式如下:

播客详情样式

比如播客内容列表的展示方式如下:

播客内容列表样式

我根本没打算发布到苹果的播客商店,所以制作一个满足播客应用播放的最小 RSS 就行了。就详情而言,需要提供以下字段:

字段名 用途 父级字段
<title> 播客标题 <channel>
<description> 播客内容介绍 <channel>
<itunes:image> 播客封面图片,宽度在 1400-3000 的 JPEG/PNG 图片 <channel>
<language> 内容语言,符合 ISO639 标准5,比如 en-us <channel>
<itunes:category> 内容分类,通过 text 属性指定,符合苹果规定6 <channel>
<itunes:explicit> 成人内容标记,文档上写用 true/false,实际校验时用 yes/no <channel>

以上是内容介绍信息字段,接下来是每一集需要的字段。在 RSS 中,每一集的信息保存在一个<item>标签内。必填的字段只有两个。第一个是<title>,表示这一集的标题。第二个是<enclosure>,里面保存每条音频的 URL、数据长度(以字节为单位)和内容格式。比如 MP3 对应的是 audio/mpeg。完整的<enclosure>结构如下:

<enclosure
 url="http://mypodcast.com/episode001.mp3" 
 length="5650889"
 type="audio/mpeg
/>

除此之外,还有一些推荐字段值得添加,因为可以方便订阅者查看必要的信息。

字段名 用途 父级字段
<description> 本集内容简介 <item>
<itunes:duration> 本集时长 <item>
<itunes:image> 本集封面 <item>
<itunes:explicit> 成人内容标记 <item>

还有一个字段叫<pubDate>,表示内容发布时间。讲道理应该指明。其格式需要满足 RFC28227 的规定。但因为我是窃的 BBC 的内容,就不那么讲究了,所以没有输出这个字段。

如果是正常发布播客内容,那肯定是一集一集地来。所以上面的信息可以依次填写,像文件大小、播放时长等信息也可以逐个检查。但我这边的内容是从网上下的,一共有十三个音频文件。让我手工查询这些信息再拼成对应的 XML 简直是要命。所以我就写了一个简单的脚本。但在写脚本之前,我们应该确定各字段内容的提取方法。

文件长度可以使用 state 命令提取:

stat -c %s "path/to/mp3"

MP3 文件的播放时长可以使用 mp3info 提取:

mp3info -p "%S" "path/to/mp3"

组合成脚本如下:

echo "    <item>"
echo "      <itunes:title>$(basename "$1" .mp3)</itunes:title>"
echo "      <enclosure"
echo "        length=\"$(stat -c %s "$1")\""
echo "        type=\"audio/mpeg\""
echo "        url=\"https://taoshu.in/adrama/lord-of-the-rings/$(echo $1|sed 's/ /%20/g'|sed -E 's#^./##')\""
echo "      />"
echo "      <itunes:duration>$(mp3info -p "%S" "$1")</itunes:duration>"
echo "      <itunes:explicit>false</itunes:explicit>"
echo "    </item>"

这里只制成了<item>部分。其他部分内容较少,可以手工填写。将脚本保存到某个目录,比如 /tmp/a.sh。然后使用 xargs 就可以生成全部的 <item> 信息:

ls *.mp3 | xargs -I % bash /tmp/a.sh % >> rss.xml

最后调整一下 rss.xml 的内容格式就大功告成了✌️

RSS 文件准备好之后,我就通过播客软件订阅。操作也很简单,切换到资料库,点击右上角的三个点,选中菜单里的通过URL关注节目,然后输入对应的 RSS 链接,稍等片刻就可以了。

不过在操作的过程中可能会遇到无法添加播客,因为找不到服务器或播客流的问题。基本就是 RSS 的格式不对或者必填字段有缺失。网上有很多所谓的播客 RSS 校验工具,我试了几个,都不灵。最后真正能解决问题的还是 W3C 官方的 Feed Validation Service8。

W3C 最强的一点是可以提示那个字段值不对,哪个必填字段缺失了,非常强大!当然,它还会建议添加某个推荐字段,不过这些字段不会影响订阅。通过 W3C 校验之后再去播客里重新添加,药到病除🎉

最后附上 Lord of the Rings 的播客链接,想练听力的可以订阅😄

https://taoshu.in/adrama/lord-of-the-rings/rss.xml


  1. https://m.sohu.com/a/412568153_99975769/↩︎

  2. https://archive.org/details/lord-of-the-rings-10↩︎

  3. 其实苹果的标准已经成了行业的事实标准了,其他平台几乎都支持😂↩︎

  4. https://help.apple.com/itc/podcasts_connect/#/itcb54353390↩︎

  5. https://www.loc.gov/standards/iso639-2/php/code_list.php↩︎

  6. https://podcasters.apple.com/support/1691-apple-podcasts-categories↩︎

  7. http://www.faqs.org/rfcs/rfc2822.html↩︎

  8. https://validator.w3.org/feed/check.cgi↩︎