Don't Marry Your Podcasting Platform: Host Your Own Podcast Feed

Michael Lynch

别和播客托管平台绑死:自己托管 RSS 订阅源

原文由 Michael Lynch 发布,订阅该博客

假设你的播客托管在 Libsyn 或 Podbean 这样的平台上。如果你决定更换托管平台,会发生什么?你之前已经把指向旧平台的 RSS 链接分发给了所有人。

比如,Libsyn 会为你的播客生成这样一个 RSS 链接:

  • https://feeds.libsyn.com/12345/rss

当你把播客提交到 Apple Podcasts 并把 RSS 链接分享给听众时,你实际上是让他们直接指向了你的托管平台。

一旦你更换平台,所有听众的播客客户端仍会到旧链接去寻找你的节目。

不要依赖重定向

大多数播客在更换平台时,会要求旧平台设置重定向。比如,你要从 Libsyn 搬到 Podbean,就会在 Libsyn 的设置里把地址指向新的播客链接。

这样,每当有听众尝试访问旧的 Libsyn RSS 链接时,Libsyn 就会告诉对方你已经搬家了。

这种做法有两个问题:

  1. 并非所有播客播放器在看到重定向时都会更新链接,因此它们会永远继续请求你的旧订阅源。
  2. 无法保证旧的播客托管方会一直为你提供重定向服务。

第二点尤其关键。试想一下,如果你是播客托管平台,为什么要提供一个帮助客户离开自己平台的功能?如果平台为了维持经营而捉襟见肘,重定向很可能就是最早被砍掉的功能之一。

那么,该怎么办?你总得给听众一个播客链接,又该如何避免这个问题呢?

自己托管 RSS 订阅源

播客托管平台看似只提供一项服务,实际上却托管了两项完全不同的服务。

当你把播客托管在 Libsyn 或 Podbean 上时,它们实际上是为你托管了两种不同类型的文件:

  1. 你的音频/视频文件
  2. 播客的 RSS 订阅源,也就是所有节目的索引

但这两项服务其实是完全独立的。如果你愿意,完全可以把它们分别交给不同的服务商托管,一切都能正常运作。这也是我自己的做法,我也建议其他播客主这么做。

这两项服务在技术上都不难,但第二项的成本极低。

播客的录制文件通常很大,根据时长、音质以及是否包含视频,大小在 50 MB 到 5 GB 之间。而播客的 RSS 订阅源则非常小,一般不到 1 MB。按托管成本计算,听众每检查 1 万次你的订阅源,你大约只需支付 1 美分。

你只需在播客服务商前面架设一个 CDN,就能简单又便宜地自行托管 RSS 订阅源。这个 CDN 只负责分发你的 RSS 订阅源,播客播放器仍会直接从托管平台获取体积较大的音频/视频文件。

订阅源示意图

只分发你自己的自定义域名

当你把像 https://feeds.libsyn.com/12345/rss 这样的链接分发给听众和播客目录时,你就和 Libsyn(或你的托管服务商)绑死了。

相反,你应该只分发属于你自己域名的 RSS 链接。

例如,如果你的播客叫“My Awesome Dinosaur Podcast”,你就可以为节目注册这样一个域名:

  • myawesomedinosaurpodcast.com

:本文不介绍如何购买域名,这超出了讨论范围,任何域名注册商都可以。我个人比较喜欢 DNSimple。

之后你分发给听众和播客目录的订阅源地址就是:

如果你更换了托管平台,听众完全无需做任何操作,他们仍然通过同一个 feeds.myawesomedinosaurpodcast.com 地址收听。他们从头到尾都不会看到任何 Libsyn 或 Podbean 的链接。

自行托管 RSS 订阅源

在这个示例中,我将使用以下示例值:

  • https://feeds.libsyn.com/12345/rss: 播客托管方让你使用的 RSS 订阅源。
  • https://feeds.myawesomedinosaurpodcast.com: 你实际对外使用的链接。

创建 BunnyCDN 账号

首先,在 BunnyCDN 上注册一个账号。

你也可以用任何其他 CDN,但我喜欢 Bunny,因为它简单又便宜。

添加 Pull Zone

登录 Bunny 账号后,前往 CDN > Add Pull Zone。

给 Pull Zone 起个名字,随便起什么都行。在本例中,我用的名字是 example12345

在 Origin Type 下选择“Origin URL”,然后填入服务商提供的播客 RSS 链接:

选择“Standard Tier”。

在“Pricing Zones”中,只选择最便宜的选项,取消其他所有选项。RSS 订阅源在全球各地是否都极速访问并不重要,因为这不会影响听众的收听体验。

最后,点击“Add Pull Zone”。

测试链接

Bunny 创建好 Pull Zone 后,尝试访问它在顶部生成的 b-cdn.net 链接:

如果设置成功,访问该链接时你应该能看到播客的 RSS 订阅源(浏览器可能会自动下载该文件)。

如果一切正常,最难的部分就已经完成了。接下来只需设置你的自定义域名。

绑定自定义域名

在你刚创建的 Pull Zone 中,前往 General > Hostnames。

输入你的播客域名,例如:

  • feeds.myawesomedinosaurpodcast.com

:子域名不一定非得是 feeds,你可以起任何名字,不过我觉得 feeds 是一个不错的约定。

Bunny 会给你一条 DNS 记录,你需要在域名注册商那边进行设置。

回到你注册域名的地方,添加 Bunny 显示的那条 DNS 记录。

在域名注册商处添加完 CNAME 记录后,回到 Bunny 页面,点击“Verify & Activate SSL”。

覆盖缓存设置

Bunny(以及所有 CDN)都会积极地缓存数据。它们的设计初衷是减轻源站的负载,因此 Bunny 默认只会偶尔去检查“Origin URL”(即你的播客服务商)是否有更新。

这可能会妨碍听众及时获取更新。你肯定不希望更新了播客,却因为 Bunny 还在提供旧的缓存,导致一两天内都没人能看到更新。

你可以进入 Pull Zone 的 Caching > General,来防止 Bunny 提供过期的播客订阅源。

将“Cache Expiration Time”改为“Override: 20 minutes”。

这会让 Bunny 对播客订阅源的缓存最多只保留 20 分钟。你可以根据自己的喜好调高或调低这个时间。

我不建议选择“Do not cache”。如果你的播客很受欢迎,可能会有数百名听众同时检查订阅源,这会导致 Bunny 同时向你的播客服务商发送数百个请求,服务商可能会因此屏蔽来自 Bunny 的请求,进而让听众看到报错信息。

替换规范链接

RSS 订阅源有一个细节,它里面包含一个如下所示的 self 标签:

<atom:link href="https://feeds.libsyn.com/12345/rss" rel="self" type="application/rss+xml"/>

即使你分发的是 https://feeds.myawesomedinosaurpodcast.com 这个链接,一些播客播放器仍会优先使用 self 标签中的链接,而不是原始链接,这样就会绕过你通过 CDN 托管的版本。

要避免这种情况,你需要使用自定义的 Bunny 边缘脚本。

  1. 前往 Edge Platfrom > Scripting,点击“Add Script”。
  2. 选择“Deploy and edit on Bunny.net”
  3. 将脚本命名为“Replace RSS self tag”
  4. 将 Type 改为“Middleware”
  5. 点击“Add Script”
  6. 在代码编辑器中输入以下代码:
import * as BunnySDK from "https://esm.sh/@bunny.net/[email protected]";

// Replace with the vendor-specific URL to your RSS feed.
const SOURCE_URL = "https://feeds.libsyn.com/12345/rss";

// Replace with the domain name that you own.
const TARGET_URL = "https://feeds.myawesomedinosaurpodcast.com";

/**
 * Modifies the response from the origin to replace a specific URL.
 *
 * @param {Context} context - The context of the middleware.
 * @param {Request} request - The current request done to the origin.
 * @param {Response} response - The HTTP response or string.
 */
async function onOriginResponse(context: { request: Request, response: Response }): Promise<Response> | Response | void {
  const responseText = await context.response.text();

  // Replace the URL with simple string replacement
  const modifiedText = responseText.replace(SOURCE_URL, TARGET_URL);

  // Create a new response with the modified text
  return new Response(modifiedText, {
    status: context.response.status,
    statusText: context.response.statusText,
    headers: context.response.headers
  });
}

BunnySDK.net.http.servePullZone()
  .onOriginResponse(onOriginResponse);

最后,点击“Connect Pull Zone”按钮,将该脚本关联到你的 RSS 订阅源。

大功告成!

如果设置正确,你现在应该已经拥有一个可提供播客订阅源的自定义链接了。

现在这个链接完全由你掌控。以后即使更换播客托管平台,也只需更新 BunnyCDN Pull Zone 中的“Origin”字段即可。再也不用处理重定向,也不必担心旧平台会把你套牢。

本文章由 muse-spark-1.2-contributor 进行翻译

评论