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

Michael Lynch

不要与播客托管平台绑定:自行托管你的播客订阅源

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

例如,Libsyn 会为你的播客提供一个如下所示的 RSS URL:

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

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

如果你更换平台,听众的播客应用仍会在旧 URL 上寻找你的播客。

不要依赖重定向

大多数播客在更换平台时,会要求旧平台设置重定向。例如,如果你要从 Libsyn 搬到 Podbean,你会在 Libsyn 的设置中将其指向新的播客 URL。

这样,每当听众尝试访问你的旧 Libsyn RSS URL 时,Libsyn 就会告诉他们你已经搬家了。

这种策略有两个问题:

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

第(2)点尤其重要。如果你是一家播客托管平台,为什么要提供一个帮助客户离开平台的功能呢?如果该平台为了维持运营而变得举步维艰,重定向很可能就是他们最先取消的功能之一。

那么,该怎么办呢?你需要给听众一个播客的 URL,那又如何避免这个问题呢?

自行托管你的 RSS 订阅源

播客托管平台实际上托管着两项独立的服务,尽管它们看起来像是同一回事。

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

  1. 你的音频/视频录制文件
  2. 你的播客 RSS 订阅源,即所有录制文件的索引

但这两项服务实际上是完全独立的。如果你愿意,完全可以让两个不同的服务商分别托管它们,一切都能正常运作。而这正是我自己的做法,也是我推荐其他播客主采用的方式。

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

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

你可以通过在播客服务商前端设置一个 CDN 来简单而廉价地托管你的 RSS 订阅源。该 CDN 将只负责提供你的 RSS 订阅源。播客播放器仍会直接从你的播客服务商那里获取大型的音频/视频文件。

订阅源图示

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

当你向听众和播客目录分发像 https://feeds.libsyn.com/12345/rss 这样的 URL 时,你就相当于与 Libsyn(或你的托管服务商)绑定了。

相反,你应该只分发你自己拥有的域名的 RSS URL。

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

  • myawesomedinosaurpodcast.com

注意:我不会讲解如何购买域名,因为这超出了本文范围,不过任何域名服务商都可以。我个人比较喜欢 DNSimple。

当你向听众和播客目录提供播客订阅源时,地址将是:

如果你更换播客托管方,听众完全无需做任何操作,因为他们仍会通过同一个 feeds.myawesomedinosaurpodcast.com URL 收听。他们从未见过任何 Libsyn 或 Podbean 的 URL。

自行托管 RSS 订阅源

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

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

创建 BunnyCDN 账户

首先,在 BunnyCDN 上创建一个账户。

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

添加 Pull Zone

在你的 Bunny 账户中,前往 CDN > Add Pull Zone。

为你的 Pull Zone 起一个名字。叫什么都无所谓。在本示例中,我使用的名字是 example12345

在 Origin Type 下,选择“Origin URL”,然后输入你的服务商的播客 RSS URL:

选择“Standard Tier”。

在“Pricing Zones”下,只需选择最便宜的选项并取消其余选项。你的 RSS 订阅源是否在每个地区都极速加载并不重要,因为这不会影响听众体验。

最后,点击“Add Pull Zone”。

测试你的 URL

当 Bunny 创建好你的 Pull Zone 后,尝试访问它在顶部创建的 b-cdn.net URL:

如果设置成功,访问该链接时你应该能看到播客的 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 的请求,最终让听众看到错误信息。

替换规范 URL

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

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

即使你分发的是 https://feeds.myawesomedinosaurpodcast.com URL,一些播客播放器也会优先使用 self 标签而非原始 URL,这会绕过你通过 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 订阅源。

完成了!

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

现在你拥有了一个由你掌控的 URL。如果将来更换播客平台,只需更新 BunnyCDN Pull Zone 中的“Origin”字段即可。你再也不用处理重定向,也不必担心旧平台会试图将你锁定。

原文由 Michael Lynch 发布

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