Emby 多網域介面 emby_ext_domains
UHD 開源的 Emby 擴充服務:為 Emby 伺服器補上 ServerDomains 多網域介面,用戶端登入後自動取得全部線路。含介面定義、Emby token 驗證順序、Nginx 部署要點與用戶端對接建議。
提示
emby_ext_domains 是 UHD 開源的一個 Emby 生態擴充服務:為 Emby 伺服器補上一個「可用網域清單」介面,用戶端登入後就能自動取得該伺服器的全部線路網域,不必再讓使用者手動修改伺服器位址。儲存庫位址:github.com/uhdnow/emby_ext_domains,MIT 授權,以 Go 實作。
它解決什麼問題
Emby 協定裡沒有「一個伺服器有多個網域」的概念——用戶端只認登入時填的那一個位址。但真實營運中網域是會變的:新增邊緣節點、線路故障切換、舊網域無法使用,都需要使用者手動去用戶端裡改位址,成本很高。
這個擴充介面把這件事收歸伺服器端:
- 伺服器端維護一份網域清單,隨時可增刪
- 用戶端登入後呼叫一次介面,就取得完整線路清單
- 使用者在用戶端裡直接切換線路,不需要重新輸入位址、也不需要重新登入
目前已有多款第三方 Emby 播放器實作了這個介面,也有不少 Emby 伺服器基於它對外提供多網域訂閱與同步服務。
已支援該介面的第三方用戶端
SenPlayer、VidHub、Forward、Hills、AfuseKt、Flow、TVxEmby、CapyPlayer、LinPlayer。
介面定義
一個介面,掛在 Emby 的同源路徑下:
GET /emby/System/Ext/ServerDomains成功回應(200):
{
"data": [
{ "name": "Server 1", "url": "https://server1.example.com" },
{ "name": "Server 2", "url": "https://server2.example.com" }
],
"ok": true
}| 欄位 | 型別 | 說明 |
|---|---|---|
ok | boolean | 請求是否成功,用戶端應以此判斷 |
data[].name | string | 線路顯示名稱,呈現給使用者 |
data[].url | string | 線路完整位址,含通訊協定與連接埠 |
驗證失敗回傳 401:
{ "error": "Invalid token", "ok": false }error 有兩種取值:Token not found(請求裡沒帶 token)與 Invalid token(token 驗證沒過)。
驗證:沿用 Emby 自己的 token
介面不引入新的憑證體系,直接沿用呼叫方既有的 Emby token。伺服器端依以下順序取第一個非空值:
| 順序 | 位置 | 鍵名 |
|---|---|---|
| 1 | Query | X-Emby-Token |
| 2 | Header | X-Emby-Token |
| 3 | Query | api_key |
| 4 | Header | X-Emby-Authorization 中的 Token="..." |
| 5 | Cookie | Authorization |
| 6 | Header | Authorization |
| 7 | Query | token |
| 8 | Cookie | token |
| 9 | Header | token |
涵蓋這麼多位置,是為了讓不同框架寫出來的用戶端都能直接對接——無論它習慣把 token 放在查詢參數、請求標頭還是 Cookie 裡。
取得 token 後,伺服器端拿它去問 Emby 本體:
GET {emby_server_url}/emby/System/Info?X-Emby-Token={token}Emby 回傳 200 即認定 token 有效,其餘情況一律視為無效。參考實作的驗證逾時是 3 秒,且不快取驗證結果——每次請求都會回源驗證一次。
部署參考實作

設定檔 config.yaml:
emby:
server_url: "https://your-emby-server.com" # Emby 本體位址
server:
port: 52143 # 本服務監聽連接埠
domains:
- name: "Server 1"
url: "https://server1.example.com"
- name: "Server 2"
url: "https://server2.example.com"儲存庫附了 Dockerfile 與 docker-compose.yml,直接啟動:
docker compose up -d關鍵一步是反向代理:這個介面必須和 Emby 同網域同路徑對外,用戶端才會用同一個 base URL 請求到它。在 Emby 的 Nginx 設定裡加一條精確比對:
location = /emby/System/Ext/ServerDomains {
proxy_pass http://127.0.0.1:52143;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass_request_headers on; # token 相關的標頭必須透傳
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
proxy_send_timeout 10s;
}重要
proxy_pass_request_headers on 不能省。token 可能藏在 X-Emby-Authorization 或 Cookie 裡,代理層一旦丟掉標頭,介面就只會回傳 Token not found。
部署時還有兩點要注意:
- 本服務必須能連到設定裡的 Emby 位址,否則所有 token 都驗證不過
- 網域清單在啟動時從設定檔讀入,改完需要重新啟動服務才會生效
UHD 的實作
UHD 正式環境沒有直接跑這份參考實作,而是依同一套介面重新實作了一份,對外行為與本文描述保持對齊。所以:
- 對用戶端開發者:依本文的介面對接即可,不需要為 UHD 另外適配
- 對 UHD 使用者:線路清單由伺服器端維護並下發,用戶端有支援的話就能直接看到全部可用線路
給用戶端開發者的建議
- 登入成功後再呼叫,此時才有可用 token
- 以
ok欄位判斷成功與否,不要只看 HTTP 狀態碼 - 介面不存在(404)或逾時是常態——大量 Emby 伺服器並沒有部署這個擴充,此時應靜默沿用使用者目前填寫的位址,不要報錯打斷使用
- 取得清單後在本機快取,不必每次進入 App 都請求
- 不要把 token 寫進記錄檔、當機回報或截圖