package service import ( "net/http" "net/url" "strings" ) // normalizeCloudPlayTarget 把存库的云盘播放 URL 规范化为相对路径。 // // STRMURL 是扫描时根据当时的 server_url/请求地址生成并固化进数据库的。 // 在 Windows 开发机上扫描、再部署到 Docker(或更换了内网 IP/域名)后, // 这些绝对 URL 会指向已失效的旧地址,第三方播放器跟随 302 就会拿到 // 连接失败/404。这里只要能从 URL 中解析出 provider+ref,就重建为相对 // /api/cloud/play 路径,由 absoluteInternalRedirect 基于「当前请求」补全 // host,从而对历史脏数据免疫。 func normalizeCloudPlayTarget(raw string) string { raw = strings.TrimSpace(raw) if raw == "" { return raw } if typ, ref, ok := parseCloudMediaPlaybackURL(raw); ok { return BuildRelativeCloudPlayURL(typ, ref) } if u, err := url.Parse(raw); err == nil { path := strings.ToLower(u.Path) if strings.HasPrefix(path, "/api/strm/play/") || strings.HasPrefix(path, "/api/cloud/play/") || strings.HasPrefix(path, "/api/stream/") { u.Scheme = "" u.Host = "" return u.String() } } return raw } // BuildRelativeCloudPlayURL 构造相对的云盘播放 API 路径。 func BuildRelativeCloudPlayURL(typ, ref string) string { return "/api/cloud/play/" + url.PathEscape(strings.TrimSpace(typ)) + "?" + url.Values{"ref": []string{ref}}.Encode() } // withAuthToken propagates the caller's auth token onto an internal redirect // target. A browser