Skip to content
关于生活
EmailHomepage

自建 Podcast 过程中现代前后端分离工程的交付探索

Podcast, Code, Engineering8 min read

喜欢折腾是一个技术从业者的基本素养 — 沃·兹基硕德

0. 搞播客的原因

2021 年的下半年,播客这个东西在我的日常生活里逐渐开始占有更多的比重,国内也开始出现了除喜马拉雅、网易云音乐、蜻蜓FM之外的更多专业服务于播客的厂商。小宇宙和爱发电又是其中的佼佼者。 我本人在大学时曾有幸参与过一档网络电台的建设,也录过其中一期节目。当时我负责的部分主要是基于帝国 CMS 的管理后台建设、基于忘了叫什么的直播信号推送以及一款基于 flash 的音频播放器的播放列表生成,当然,是手动编写 xml 文件。 当时的我也没有想到毕业之后会真的走上前端开发这条道路。 说回现在,近半年来我从开始听津津乐道开始,逐渐听了悲观生活指南、几乎正常、路人抓马、Nice Try、加州101这些节目,心中想做点什么的小火苗又开始随着别人的声波缓缓摇晃壮大起来了。我自认为我还算是声音条件不错的,又加上喜欢胡思乱想胡言乱语,从自己做起再拉几个朋友一起录录音搞一搞应该不算是个困难的事情。写到这里我突然想起来前几年我还试图搞过一个朋友间的内容创作平台,当时似乎还是基于 wordpress 搭建的一个站点,还二开了一个 mp3 播放器。当时也放了两期朋友做的节目上去,只不过当时不知道那种形式其实就是播客,也没有试图生成 rss 订阅链接,就只是放那儿了。

1. 选型

作为一名播客新手,我的脑回路可以算得上是有点奇葩,但若结合我本职是个前端工程师来看就很顺理成章了。做播客的第一步我没有去想选题,没有去挑设备,也没有想怎么录怎么剪,而是在想音频放在哪儿。我不想用喜马拉雅或者蜻蜓 FM 之类的内容服务商,感觉不自由。从一开始我就拿定了要直接做自建播客 RSS 订阅流的方式,这样可能推广起来比较麻烦但是起码内容都是自己掌控,调性上也比较符合一个技术人的折腾初衷。

内容管理系统

前面说到前些年在 wordpress 上搞过一个播放器,那个是用 php 实现的,这次就想了一下就直接pass掉了。之前我有分享过 strapi , strapi 是一个基于 nodejs 的 headless cms,很适合前端人使用。不过又因为我想做一个 rss 自动生成的机制,受限于 strapi 本身的功能,我有考虑是用 egg.js 还是 nuxtjs 单做一个只有 rss 生成功能的机器人。写了两个 demo 之后发现, eggjs 很久不更新了, nuxtjs 的上手难度是有点大的,而且仅仅为了一个 rss 自动更新就单独起一套服务有些不划算。所以最终播客的内容管理还是 strapi ,数据库选用了 postgresql , pg 在现代的开发中应该是应用比较广泛的一个数据库了。

RSS 订阅流生成

自建 RSS 订阅流是我做播客的基调,选用这个方式一是因为上面所说的几点,二就是我想通过这种方式去了解播客究竟是什么。通过打开津津乐道的订阅链接,我发现播客的 RSS 订阅流也是固定格式的 xml ,只是跟普通的新闻订阅流有不同属性上的区分。我确实没有什么 XML 的处理经验,毕竟从我搞开发开始都是用 JSON 跟各端进行数据交互了。简单查阅了一下 npm 仓库就发现了一个神仙 npm 包,就叫做 podcast ,而在其说明中也列出了一档播客节目的全部属性。

内容托管

这里没有特别要说的,毕竟我的音频文件,RSS 文件还有图片文件总要找个地方存储,这个的选型上就看方便程度和价格了。考虑到使用方便,我直接就确定了使用腾讯云存储桶。理由如下:

  • SDK 全面,且有很完整的文档
  • 价格便宜
  • 官方GUI便捷易用

内容展示(配套站点)

查看了 rss 订阅流中的播客属性后发现,每一集节目(episode)最好是有配套的页面的,所以很有必要为整档节目做一个配套的博客,友台津津乐道也是这么做的,而且做得非常非常之出色。这个站点除展示每集节目的信息外也可以用于在社交媒体上推广自己的播客。在对内容管理做选型时我就在考虑是不是用 gatsby 做内容。经过仔细考虑,也回想了一下大学时用帝国 CMS 的经验,最终决定尝试一下之前一直想做但是没有实际应用的 SSR,对比市面上几个框架之后理所当然地选用了 nextjs。这里插个题外话,我刚用 nextjs 做完就看到 react-router 搞出了 remix 来做 SSR,当时我就忍不住去跟 Daniel 吐糟实在是学不动了太卷了!

最终选型结果(含配套域名及服务器)

这里只列一下最终的结果吧,巧的就是在做播客之前几天碰到双十一,腾讯云搞 lighthouse 的大力推广,带宽出乎意料于是直接买了三年。域名都是之前在阿里云购买的,配套的 SSL 证书也都是单域名免费版。

  • 播客站点 https://www.buttercatann.com ,采用 nextjs 做前端展示,腾讯云 lighthouse 做轻量应用服务器
  • 播客服务端 https://api.buttercatann.com , 采用 strapi 做服务及后台内容管理,跟站点选用同一台腾讯云 lighthouse 轻量应用服务器,数据库选用 postgreSQL 12 ,数据库是我的一台腾讯云 CVM,很久之前就申请过的,与我另一个站点 https://api.l-blog.me/ 用的是同一个数据库
  • 播客文件存储 https://podcast.buttercatann.com ,CNAME 解析到腾讯云对象存储(公有读私有写权限),提供音频文件、图片文件、视频文件及 RSS 订阅文件存储及访问