diff --git a/internal/handler/emby_playback.go b/internal/handler/emby_playback.go index 0450f7a..b49446b 100644 --- a/internal/handler/emby_playback.go +++ b/internal/handler/emby_playback.go @@ -348,6 +348,12 @@ func embyVideoStreamHandler(svc *service.Container, cloudMode string) gin.Handle // 此前这里把所有错误一律吞成 404:云盘 Cookie 过期、直链解析失败、 // STRM 播放被关闭……在第三方播放器上全部表现为「404 不存在」, // 无法排查。现在区分:行不存在→404;云盘播放不可用/上游故障→502+原因。 + // + // 网盘直链与换取时的 UA 严格绑定,而 Emby 客户端的 API 层与播放器层 UA + // 不保证相同(浏览器一定相同),所以只有浏览器客户端允许服务端短路换链。 + if !isBrowserLikeUserAgent(c.GetHeader("User-Agent")) { + c.Request = c.Request.WithContext(service.WithClientSideSTRMResolve(c.Request.Context())) + } err = svc.Stream.ServeFileWithCloudMode(c.Writer, c.Request, c.Param("id"), cloudMode) switch { case err == nil: @@ -387,6 +393,25 @@ func embyPlaybackRedirectToken(c *gin.Context, svc *service.Container) string { return token } +// isBrowserLikeUserAgent 判断请求是否来自浏览器(含 WebView / Electron 客户端)。 +// +// 只有浏览器能保证「API 请求」与「