既然决定将自己随身音频设备换成采用 Android 系统的 Walkman 播放器 NW-A306 ,那么该如何充分利用这台智能音频设备呢?除了播放的我多年来下载/CD 翻录的海量音乐文件,能不能也让「随时听播客」这件事也在这台随身播放器上实现?
相比于手机随时都处于「在线状态」,这台采用 Android 系统的随身播放器更接近 iPod Touch 的定位——更多的时候都是离线状态下使用。这使得我不得不调整我的播客订阅管理方案。早在 2020 年时我就在巧用 NAS 打造私有跨平台播客订阅服务这篇文章中提到了我当时的解决方案:Airsonic,只不过这个方案一大缺陷在于 Airsonic 并非专门的播客订阅服务器,而是私有化的流媒体音乐服务的「衍生品」。因此我很快转移到了专业的播客客户端——国人开发的泛用型播客客户端 Moon FM。相比于 Airsonic,Moon FM 可以利用自己的服务器/NAS 来搭建属于自己的播客订阅管理服务,并且支持播放进度同步,跨平台客户端支持等等。
但随着后期使用上深入, Moon FM 的缺点也开始逐步显现。首先是并非所有客户端都免费下载。其次自建同步服务需要有较强的动手能力,需要对其采用的数据库服务进行一系列的配置操作,学习曲线较高。最后,但也是最棘手的就是订阅刷新的逻辑,虽然 Moon FM 提供了多端同步功能,但刷新订阅其实是在客户端上完成的,因此如果将喜欢的节目下载到本地离线收听会非常耗时——需要等待所有的订阅更新完成后,再根据自己的喜好从订阅源下载节目到本地离线收听。显然这对于后面严重依赖离线收听的我而言,早已不能满足需求。
考虑到未来收听方式更像是传统的播客订阅方式,因此我更多的希望自己的播客订阅服务可以定时在服务端刷新,这样我打开客户端连接服务端是看到都是最近一次更新的节目列表,而这些节目已经预先下载到了本地服务端了,后面只需要选择喜欢的节目,然后从服务端下载到当前的客户端中即可。这样一方面不再需要客户端刷新订阅节省刷新订阅的时间,另一方面由于节目已经同步更新下载到了服务器端,下载到客户端速度也就更快一些。这样我每次早上出门上班之前打开客户端,挑选几个节目将其离线下载到客户端中,路上就可以随时打开收听了。
在一阵子的寻找后,我终于找到了这个相当完善的开源项目:audiobookshelf,在经过近两个月的使用后,我全方位的替换掉了我之前的 Moon FM,成为了我当下自部署的跨平台播客订阅服务解决方案。
audiobookshelf 其实从名字上就可以看出来——专门为 audiobook 而生的自部署订阅管理服务,不过开发方对其的定义还包含了对播客订阅的管理。而单就功能上来说,audiobookshelf 包含了订阅管理、多端播放进度同步,播客查找和添加等多个功能。最重要的是无论是服务端还是客户端都是完全免费——服务端你可以轻松的部署到你的 VPS 或者自己的 NAS 上,而客户端包含了 Android 和 iOS 以及桌面端——服务端中已经包含了桌面客户端的所有功能,你可以将其添加为 PWA 客户端在桌面收听节目。
对比 Moon FM,audiobookshelf 最大的好处在于订阅更新工作完全可以交给服务端来完成,因此客户端应用只需要连接到服务端,看到都是最新一次更新的节目列表,并且这些更新的节目文件都已经下载到服务端了,你只需要挑选自己喜欢的节目下载到客户端即可。真正做到无需等待刷新,立刻就能听!
那么话不多说,下面我就基于群晖 NAS (DS218+)教大家来部署和配置 audiobookshelf 服务。
和其他服务一样,audiobookshelf 官方提供了基于 Docker 的安装方式。首先在群晖里面打开 File Station,在 docker 文件夹下面先创建一个名为 audiobookshelf 的文件夹,这个文件夹未来是存储相关的配置信息的。
然后我在 web 文件夹下有创建了一个 audiobooks 文件夹,该文件夹未来用来存储下载下来的播客节目文件。再创建一个 metadata 文件夹,用来保存各种元数据文件等。
接下来我们需要获取自己这台群晖的 PUID 和 PGID,这里我们可以运行一个计划任务来获取,首先进入到「控制面板」-「计划任务」,点击「新增」-「计划的任务」-「用户定义的脚本」。
在新的任务创建窗口中,在「常规」选项卡里面输入任务名称:「My UID and GID」,用户账号选择你当前的群晖登录账号。
切换到「计划」选项卡,在日期里面选择「在以下日期运行」,选择「当天日期」以及「不要重复」。
最后在「任务设置」选项卡里面,通知设置中勾选「通过电子邮件发送运行详情」,然后填上你的邮件地址;最后在用户定义的脚本这里填上「id」后点击确定,这个任务就创建好了。
回到任务计划管理页面,勾选刚刚创建的「My UID and GID」然后点击上方的「运行」来执行,稍后你就可以在你的电子邮箱里面看到这个计划任务的运行情况,以及对应的 PUID 和 PGID 值了,将这两个值保存好后面会用到。
接下来我们继续使用任务计划,创建一个新的计划——「新增」-「计划的任务」-「用户定义的脚本」。然后在新的任务创建窗口中,在常规选项卡中输入任务名称「Install Audiobookshelf」,用户账号则选择 root。
切换到「计划」选项卡,这里日期选择「在以下日期运行」,选择当天日期并且也是「不要重复」。
至于「任务设置」选项卡,在用户定义的脚本里面输入以下脚本,这里PUID 和PGID 需要改成刚才我们获取的本机数字。
如果你希望知道脚本的运行情况,那么在「通知设置」里面勾选「通过电子邮件发送运行详情」并输入邮箱号,最后点击确认完成任务设置。
接下来我们还是回到「任务计划」页面,然后勾选「Install Audiobookshelf」这个计划任务,点击运行来进行执行并等待安装完成。不一会儿如果 Docker 容器里面出现了一个名为 audiobookshelf 这个容器并已经运行,我们可以尝试打开网页浏览器,然后在地址栏输入:
安装成功后接下来自然就是进行配置了。我们需要根据网页上的提示,创建一个管理员的账户和密码,然后使用这个管理员账户和密码登录到服务端管理页面中。
为了方面后面的操作,我们先将界面语言改成简体中文。这里在服务端界面点击右上角的「设置」按钮,然后在「Setting」页面下找到默认服务器语言选项,在里面找到「简体中文」来切换服务端页面语言。
然后我们要为此添加个媒体库,这里媒体类型选择「Podcast」,然后输入媒体库名称(比如就叫 Podcast),然后点击「Create」完成媒体库的创建。
媒体库创建完成后,接下来就是为我们的媒体库添加播客了,这里我们就用系统的「查找」功能来添加。audiobookshelf 的查找可以直接检索 iTunes Podcast 库,因此对于已经上架 iTunes Podcast 的播客节目可以直接搜索名字就可以订阅。比如说我想订阅少数派的播客节目,则直接在查找里面输入「少数派」然后点击「提交」,然后结果列表中就会呈现相关的播客列表,然后点击其中的一个播客,就会可以弹出当前这个播客的相关详情页面。
在这个播客详情中你可以编辑作者、标题、流派等元数据,然后点击「提交」就会添加到你的 audiobookshelf 媒体库中,当然如果你希望后面服务端可以定时自动更新并下载播客到服务端中,那么在点击「提交」之前最好勾选上「自动下载剧集」。
而除了直接根据名称搜索来添加订阅之外,在「查找」页面中还可以直接粘贴播客的RSS订阅的地址来添加,当然如果你之前还使用了其他泛用型博客客户端,也可以导出此前的订阅 OPML 并在这里上传实现批量的添加。
随着播客节目的陆续添加,我们就可以在「媒体库」里面对播客进行管理了。将鼠标悬浮在播客界面的图标上,然后点击图标右上角的编辑来对节目下载更新进行二次调整。在弹出的编辑项中切换到「计划任务」选项卡,就可以设定当前这个播客的更新周期,比如说我可以设置一次下载的节目数以及保存在服务器的节目数,这样好处在于可以有效的节约我的 NAS 的存储空间,同时也能保持当前这个播客节目尽可能都是最新的。同时还可以设置每天自动更新的时间和周期,这样每天打开 audiobookshelf 都可以随时听到新节目。
而点击「最新」页面,就可以看到当设置好周期更新后,最新更新的播客节目了,在网页端直接点击播放就可以直接收听了。
既然是播客订阅管理平台,我们自然不会满足于仅仅在本地局域网内访问,而是希望也可以在广域网访问,这样可以随时随地打开收听下载节目了。
由于我家里的网络环境可以获得公网 IP,因此我采用的是相对简单的 DDNS来解决。打开群晖的「控制面板」-「外部访问」,在 DDNS 这里配置好相应的域名并确保网络状态是正常即可。
接着打开家里路由器的管理页面,在端口转发这里配置好对应的外部端口以及内部端口,然后测试使用浏览器访问的 DDNS 域名:外部端口号这个地址,如果能打开管理界面就表示配置成功了。
当然如果你的家中网络环境受限,无法获得公网 IP,也可以使用 frp 这样的内网穿透技术来实现,这里就不过多赘述了。
在网页端配置完成之后,我们就可以使用 audiobookshelf 的移动客户端来访问你的播客订阅库并收听播客的,audiobookshelf 提供了官方的 Android 客户端以及 iOS 客户端(未上架,需要通过 testflight 来加入测试),可以非常方便的进行播客的节目的聆听。
第一次打开客户端需要填写你部署的 audiobookshelf 的地址,这里填写可以通过外网访问的地址,然后再输入你的账号和密码,就可以进入到你的订阅的播客库了。
默认首页会呈现正在聆听、最新节目、最近添加、已听完以及本地节目等多个板块,点击最新节目可以看到当前播客最新节目的节目简介内容,如果你希望在线聆听,则直接点击上方的 stream ,如果希望下载到本地离线听,就点击后面的这个下载到本地的按钮存储到本机中。下载到本地之后播放按钮就会变成 Play,播放的就变成保存在本地存储空间中的内容了。
如果你希望查看最新更新的播客订阅,则可以切换到 Latest 这个选项卡中,这里可以看到最新更新的节目列表,单个节目节目时长。而我往往每天早上就会直接切换到这个选项卡,看到感兴趣的节目就会直接点击下载,并且移动端的audiobookshelf 是支持离线模式下使用,这和 Spotify 的离线模式非常类似,这里直接播放下载本地的节目即可。
而单就从播放而言,audiobookshelf 的播放器做界面的还是相当全面的,支持倍数播放、快进10秒/快退 10 秒以及睡前定时关闭模式。同时支持跨终端的进度同步,即便是在离线模式下播放,只要终端联网并可以重新连接到服务端,就会此前的播放进度同步到服务端,这样你可以选择使用其他端继续收听。
audiobookshelf 并没有提供专门的桌面端应用,不过考虑到器服务端就是桌面端,因此这里我就将其安装为 PWA 应用,这样在我的任何桌面设备都可以正常使用。
桌面端在使用上其实和移动端有一个「小小」的差别——由于桌面端是 web 应用,且直接和服务端通信,因此没有所谓的离线模式和下载的说法,所以桌面端就只能在线使用了。当然还有一些折衷的解决方案,比如说在 Windows 11 上使用 WSA 的方式运行 Android 端或者在 Apple silicon 处理器的 Mac 上直接运行 iOS 端,但操作上会比较复杂,这里就不过多讲述实操方法了。
经过这样的一番操作,我终于实现了自部署播客订阅管理的再一次升级。这一次升级中无论是服务端还是客户端都是免费使用。不仅仅可以支持多终端跨平台基于 NAS 收听、管理以及更新订阅的播客,还支持移动端离线收听,进度同步等功能。
同时相比我此前的 Moon FM 方案还是 Airsonic,其对技术要求也更低,几乎傻瓜式的操作也非常适合刚刚开始玩 NAS 的玩家。如果你和我和一样也使用 NAS,也不妨可以尝试这个开源免费的播客订阅管理服务。