mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-04 20:46:37 +08:00
fix(emby): 网盘直链绑定 UA,第三方播放器保留同源一跳
115 直链与换取时的 User-Agent 逐字符绑定,换错一律 403。服务端换链用的是邮件客户端 API 层的 UA,而真正拉流的是播放器组件,RodelPlayer 2.2610 两层 UA 不一致(API 层带系统后缀)后会拿到 403 直链,表现为播放失败。非浏览器客户端改为 302 到同源 strm 端点,由播放器自己换链;浏览器仍走服务端换链一跳。
This commit is contained in:
@@ -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 请求」与「<video> 拉流」用同一个 User-Agent,因此也只有
|
||||
// 浏览器客户端可以安全地接受服务端换链后的 CDN 直链(见
|
||||
// service.WithClientSideSTRMResolve 说明)。原生播放器的播放器层与 API 层 UA
|
||||
// 不保证一致,必须让客户端自己去同源 strm 端点换链。
|
||||
func isBrowserLikeUserAgent(ua string) bool {
|
||||
ua = strings.ToLower(strings.TrimSpace(ua))
|
||||
if ua == "" {
|
||||
return false
|
||||
}
|
||||
for _, marker := range []string{"mozilla/", "applewebkit/", "gecko/"} {
|
||||
if strings.Contains(ua, marker) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func embyShouldRedirectVideoStreamToSTRM(c *gin.Context, svc *service.Container, mediaID, cloudMode string) bool {
|
||||
if c == nil || svc == nil || svc.Repo == nil || svc.Repo.Media == nil || cloudMode != service.CloudPlaybackModeRedirectProxy {
|
||||
return false
|
||||
|
||||
Reference in New Issue
Block a user