fix emby clients and cloud playback controls

This commit is contained in:
ShukeBta
2026-06-13 12:08:57 +08:00
parent ba43117a57
commit a177dc61dd
28 changed files with 2031 additions and 138 deletions
+4 -4
View File
@@ -18,8 +18,8 @@ const EmbyCtxUserID = "emby_user_id"
// 按优先级尝试以下认证方式:
// 1. X-Emby-Token / X-MediaBrowser-Token 请求头
// 2. Authorization: Bearer <token> / MediaBrowser Token="<token>" 请求头
// 3. X-Emby-Authorization: MediaBrowser Token="<token>"
// 4. ?token= / ?api_key= / ?apiKey= URL 参数
// 3. X-Emby-Authorization / X-MediaBrowser-Authorization: MediaBrowser Token="<token>"
// 4. ?token= / ?api_key= / ?apiKey= / ?X-Emby-Token= URL 参数
func EmbyAuthRequired(secret string) gin.HandlerFunc {
return func(c *gin.Context) {
token := extractEmbyToken(c)
@@ -66,7 +66,7 @@ func extractEmbyToken(c *gin.Context) string {
}
}
for _, header := range []string{"Authorization", "X-Emby-Authorization"} {
for _, header := range []string{"Authorization", "X-Emby-Authorization", "X-MediaBrowser-Authorization"} {
if value := strings.TrimSpace(c.GetHeader(header)); value != "" {
if token := tokenFromAuthHeader(value); token != "" {
return token
@@ -74,7 +74,7 @@ func extractEmbyToken(c *gin.Context) string {
}
}
for _, key := range []string{"token", "api_key", "apiKey", "ApiKey"} {
for _, key := range []string{"token", "api_key", "apiKey", "ApiKey", "X-Emby-Token", "X-MediaBrowser-Token"} {
if value := strings.TrimSpace(c.Query(key)); value != "" {
return value
}
+3
View File
@@ -25,7 +25,10 @@ func TestEmbyAuthRequiredAcceptsEmbyClientTokenFormats(t *testing.T) {
{name: "x mediabrowser token", headerKey: "X-MediaBrowser-Token", headerVal: token},
{name: "authorization mediabrowser token", headerKey: "Authorization", headerVal: `MediaBrowser Client="Infuse", Token="` + token + `"`},
{name: "x emby authorization", headerKey: "X-Emby-Authorization", headerVal: `MediaBrowser Client="VidHub", Token="` + token + `"`},
{name: "x mediabrowser authorization", headerKey: "X-MediaBrowser-Authorization", headerVal: `MediaBrowser Client="Emby Theater", Token="` + token + `"`},
{name: "query api key", query: "?api_key=" + token},
{name: "query x emby token", query: "?X-Emby-Token=" + token},
{name: "query x mediabrowser token", query: "?X-MediaBrowser-Token=" + token},
}
for _, tt := range tests {