From 6af0e5fdcfcd65fdc5a92a02d1602bf0542d8d9c Mon Sep 17 00:00:00 2001 From: truewhile <62226914+truewhile@users.noreply.github.com> Date: Tue, 1 Sep 2026 11:06:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Emby=20=E8=BF=9C=E7=A8=8B=E6=8C=82?= =?UTF-8?q?=E8=BD=BD=E6=92=AD=E6=94=BE=E5=9C=B0=E5=9D=80=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E4=B8=8B=E5=8F=91=20+=20=E5=87=AD=E6=8D=AE=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PlaybackInfo 始终构造 DirectStreamUrl(远程 PlaybackInfo 默认不带该字段, 此前客户端拿不到播放地址):默认指向远程 Emby 原地址(不代理), 开启代理时指向 MMTL /Videos/{encoded} 反代端点 - HasStrmAccountCredential 对 emby_remote 放宽为 url+用户名/密码 即视为 已配置(此前只认 api_key,导致列表误显示「凭据:未配置」) --- internal/service/emby_remote.go | 8 +++++--- internal/service/strm_service.go | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/internal/service/emby_remote.go b/internal/service/emby_remote.go index 924cb4c..598616a 100644 --- a/internal/service/emby_remote.go +++ b/internal/service/emby_remote.go @@ -406,6 +406,9 @@ func (r *EmbyRemoteService) RemotePlaybackInfo(ctx context.Context, acct *model. } // rewritePlayURLs 按代理模式重写载荷内 MediaSources 的播放地址。 +// 远程 Emby 的 PlaybackInfo 通常不返回 DirectStreamUrl(客户端靠它拼 +// /Videos/{Id}/stream),因此这里总是强制构造播放地址,完全由 MMTL 掌控 +// 直连(远程绝对 URL)或代理(本地 /Videos/{encoded})的最终去向。 func (r *EmbyRemoteService) rewritePlayURLs(value any, acct *model.StrmAccount, cfg *EmbyRemoteConfig, remoteID string) { encoded := EncodeEmbyRemoteID(acct.ID, remoteID) sources := collectMediaSources(value) @@ -426,9 +429,8 @@ func (r *EmbyRemoteService) rewritePlayURLs(value any, acct *model.StrmAccount, } subtitlePlayURL = base + "/Videos/" + url.PathEscape(remoteID) } - if _, exists := src["DirectStreamUrl"]; exists { - src["DirectStreamUrl"] = streamPath - } + // 直连/代理地址总是下发(PlaybackInfo 语义:客户端直接请求该 URL)。 + src["DirectStreamUrl"] = streamPath if _, exists := src["TranscodingUrl"]; exists { src["TranscodingUrl"] = streamPath } diff --git a/internal/service/strm_service.go b/internal/service/strm_service.go index 994669e..ca46671 100644 --- a/internal/service/strm_service.go +++ b/internal/service/strm_service.go @@ -273,9 +273,10 @@ func HasStrmAccountCredential(acct *model.StrmAccount) bool { case model.StrmProviderOpenList: return strings.Contains(acct.Config, `"token"`) || strings.Contains(acct.Config, `"password"`) case model.StrmProviderEmbyRemote: - // 远程 Emby:已保存接入地址与认证凭据(自动认证得到的 token 或手动 api_key)。 + // 远程 Emby:接入地址 + (自动认证凭据 或 手动 api_key) 即视为已配置。 return strings.Contains(acct.Config, `"url"`) && - (strings.Contains(acct.Config, `"token"`) || strings.Contains(acct.Config, `"api_key"`)) + (strings.Contains(acct.Config, `"token"`) || strings.Contains(acct.Config, `"api_key"`) || + (strings.Contains(acct.Config, `"username"`) && strings.Contains(acct.Config, `"password"`))) default: return strings.Contains(acct.Config, `"password"`) || strings.Contains(acct.Config, `"token"`) }