別跟你的 Podcast 託管平台綁死:自己託管 Podcast Feed
原文由 Michael Lynch 于 發布,訂閱此部落格
假設你的 Podcast 託管在 Libsyn 或 Podbean 這類平台上。如果你決定要更換 Podcast 平台,會發生什麼事?你已經把指向舊平台的 RSS URL 發給所有人了。
例如,Libsyn 會給你的 Podcast 一組像這樣的 RSS URL:
https://feeds.libsyn.com/12345/rss
當你把 Podcast 提交到 Apple Podcasts、並把 RSS URL 分享給聽眾時,你其實是讓他們直接連到你的 Podcast 託管平台。
一旦你搬家,所有聽眾的 Podcast App 都還是會到舊的 URL 去找你的節目。
別依賴重新導向
大多數 Podcast 在更換平台時,都會請舊平台幫忙設定重新導向。舉例來說,如果你要從 Libsyn 搬到 Podbean,就會到 Libsyn 的設定裡,把它指向新的 Podcast URL。
這樣一來,每當有聽眾嘗試存取你舊的 Libsyn RSS URL,Libsyn 就會告訴對方你已經搬家了。
這個做法有兩個問題:
- 並非所有 Podcast 播放器在看到重新導向後都會更新 URL,所以它們會永遠持續去檢查你的舊 Feed。
- 無法保證舊的 Podcast 託管商會一直幫你提供重新導向服務。
第二點尤其重要。如果你是 Podcast 託管平台,為什麼要提供一個幫助客戶離開你平台的功能?如果那個平台開始為了生存而掙扎,重新導向很可能就是他們最先砍掉的功能之一。
那該怎麼辦?你總得給聽眾一個 Podcast 的 URL,要怎麼避開這個問題?
自行託管 RSS Feed
Podcast 託管平台其實提供了兩種不同的服務,雖然看起來像是同一回事。
當你把 Podcast 託管在 Libsyn 或 Podbean 上時,他們實際上是幫你託管了兩種不同類型的檔案:
- 你的音訊/視訊錄音檔
- 你的 Podcast RSS Feed,也就是所有錄音檔的索引
但這兩項服務其實是完全獨立的。如果你願意,完全可以找兩家不同的廠商分別託管,運作上一點問題也沒有。這其實就是我的做法,也是我推薦其他 Podcast 經營者的做法。
這兩項服務在技術上都不難,但第二項的成本極低。
Podcast 的錄音檔通常都很大,依長度、品質以及是否有影像,大小從 50 MB 到 5 GB 不等。但 Podcast 的 RSS Feed 非常小,通常不到 1 MB。以託管成本來說,聽眾每檢查 10,000 次你的 Podcast Feed,你大概只需要付一美分。
你可以在 Podcast 供應商前面架一個 CDN,就能簡單又便宜地自行託管 RSS Feed。這個 CDN 只負責提供你的 RSS Feed,Podcast 播放器仍然會直接從你的 Podcast 供應商那裡抓取大型的音訊/視訊檔。
只發佈你自己擁有的自訂網域
當你把像 https://feeds.libsyn.com/12345/rss 這樣的 URL 發給聽眾和 Podcast 目錄時,你就等於跟 Libsyn(或你的託管商是誰)綁死了。
相反地,你應該只發佈你自己擁有的網域下的 RSS URL。
舉例來說,如果你的 Podcast 叫做「My Awesome Dinosaur Podcast」,你就可以為節目註冊這樣的網域:
- myawesomedinosaurpodcast.com
註:我不會在這裡說明如何購買網域,因為這超出本文範圍,不過任何網域註冊商都可以。我個人偏好 DNSimple。
當你把 Podcast Feed 發給聽眾和 Podcast 目錄時,用的就會是:
如果你更換 Podcast 託管商,聽眾完全不需要做任何事,因為他們仍然是透過同一個 feeds.myawesomedinosaurpodcast.com URL 來收聽。他們從頭到尾都不會看到任何 Libsyn 或 Podbean 的 URL。
自行託管 RSS Feed
在這個範例中,我會使用以下範例數值:
https://feeds.libsyn.com/12345/rss:你的 Podcast 託管商要你使用的 RSS Feed。https://feeds.myawesomedinosaurpodcast.com:你實際會使用的 URL。
建立 BunnyCDN 帳號
首先,到 BunnyCDN 建立一個帳號。
你可以用任何 CDN 來做這件事,但我喜歡 Bunny,因為它簡單又便宜。
新增 Pull Zone
在你的 Bunny 帳號中,前往 CDN > Add Pull Zone。
幫你的 Pull Zone 取個名字,取什麼都沒差。在這個範例中,我用的名字是 example12345。
在 Origin Type 下,選擇「Origin URL」,然後輸入你的廠商提供的 Podcast RSS URL:
選擇「Standard Tier」。
在「Pricing Zones」下,只要選擇最便宜的方案、取消其他選項即可。你的 RSS Feed 在每個地區是不是都超快並不重要,因為這對聽眾體驗沒有任何影響。
最後,點擊「Add Pull Zone」。
測試你的 URL
當 Bunny 建立好你的 Pull Zone 後,試著前往它在頂部建立的 b-cdn.net URL:
如果設定成功,瀏覽該連結時應該會看到你的 Podcast RSS Feed(瀏覽器可能會自動下載該檔案)。
如果一切正常,最困難的部分就完成了。接下來只需要設定你的自訂網域。
綁定你的自訂網域
在你剛建立的 Pull Zone 中,前往 General > Hostnames。
輸入你的 Podcast 網域,例如:
feeds.myawesomedinosaurpodcast.com
註:子網域不一定非得是 feeds,你可以取任何你想要的名稱,不過我覺得 feeds 是個實用的慣例。
Bunny 會給你一筆 DNS 紀錄,你需要在網域註冊商那邊啟用它。
回到你註冊網域的地方,加入 Bunny 顯示給你的那筆 DNS 紀錄。
在你的網域註冊商新增完 CNAME 紀錄後,回到 Bunny 的畫面,點擊「Verify & Activate SSL」。
覆寫快取設定
Bunny(以及所有 CDN)都會積極地快取資料。它們的設計目的是減輕其他伺服器的負擔,所以 Bunny 預設只會偶爾去檢查「Origin URL」(你的 Podcast 供應商)是否有更新。
這可能會妨礙聽眾及時收到更新。你不會希望更新了 Podcast 之後,卻因為 Bunny 還在提供舊的快取版本,導致一兩天內都沒人看到更新。
你可以前往 Pull Zone 的 Caching > General,防止 Bunny 提供過期的 Podcast Feed 快取。
將「Cache Expiration Time」改為「Override: 20 minutes」。
這會告訴 Bunny,你的 Podcast Feed 最多只快取 20 分鐘。你可以依自己的偏好調高或調低這個時間。
我不建議選「Do not cache」。如果你的 Podcast 很熱門,數百位聽眾可能同時檢查 Feed,這會導致 Bunny 同時對你的 Podcast 供應商發出數百個請求,進而可能讓供應商阻擋來自 Bunny 的請求,最後讓聽眾看到錯誤訊息。
取代標準 URL
RSS Feed 有一個細節是,它裡面包含一個看起來像這樣的 self 標籤:
<atom:link href="https://feeds.libsyn.com/12345/rss" rel="self" type="application/rss+xml"/>即使你發佈的是 https://feeds.myawesomedinosaurpodcast.com 這個 URL,有些 Podcast 播放器仍會優先採用 self 標籤而非原始 URL,這就會繞過你透過 CDN 託管的版本。
為了避免這種情況,你需要使用自訂的 Bunny edge script。
- 前往 Edge Platfrom > Scripting 並點擊「Add Script」。
- 選擇「Deploy and edit on Bunny.net」
- 將 Script 命名為「Replace RSS self tag」
- 將 Type 改為「Middleware」
- 點擊「Add Script」
- 在程式碼編輯器中,輸入以下程式碼:
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」按鈕,將這個 Script 綁定到你的 RSS Feed 上。
大功告成!
如果設定正確,你現在應該已經擁有一個提供 Podcast Feed 的自訂 URL 了。
你現在擁有一個完全由你掌控的 URL。未來如果要更換 Podcast 平台,只要更新 BunnyCDN Pull Zone 的「Origin」欄位即可。你再也不用處理重新導向,也不必擔心舊平台會想辦法把你綁住。
隨機一篇部落格



留言
登入後參與討論