fix: proxy transparent MP4 effect ranges
This commit is contained in:
parent
6d52cffc44
commit
9a27923d69
@ -20,6 +20,7 @@ var (
|
|||||||
"media.haiyihy.com": {},
|
"media.haiyihy.com": {},
|
||||||
}
|
}
|
||||||
effectMediaProxyExtensions = map[string]string{
|
effectMediaProxyExtensions = map[string]string{
|
||||||
|
".mp4": "video/mp4",
|
||||||
".pag": "application/octet-stream",
|
".pag": "application/octet-stream",
|
||||||
".svga": "application/octet-stream",
|
".svga": "application/octet-stream",
|
||||||
}
|
}
|
||||||
@ -42,6 +43,11 @@ func (h *Handler) proxyEffectMedia(writer http.ResponseWriter, request *http.Req
|
|||||||
}
|
}
|
||||||
upstreamRequest.Header.Set("Accept", "application/octet-stream,*/*")
|
upstreamRequest.Header.Set("Accept", "application/octet-stream,*/*")
|
||||||
upstreamRequest.Header.Set("User-Agent", "hyapp-gateway-effect-media-proxy/1.0")
|
upstreamRequest.Header.Set("User-Agent", "hyapp-gateway-effect-media-proxy/1.0")
|
||||||
|
// 透明 MP4 的浏览器播放器需要 seek 多个采样帧来拆分 RGB/Alpha 通道;透传 Range
|
||||||
|
// 才能让 video 元素按需取片段,而不是每次检测都重新下载整段动效。
|
||||||
|
if value := strings.TrimSpace(request.Header.Get("Range")); value != "" {
|
||||||
|
upstreamRequest.Header.Set("Range", value)
|
||||||
|
}
|
||||||
|
|
||||||
upstream, err := effectMediaProxyHTTPClient.Do(upstreamRequest)
|
upstream, err := effectMediaProxyHTTPClient.Do(upstreamRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -66,11 +72,17 @@ func (h *Handler) proxyEffectMedia(writer http.ResponseWriter, request *http.Req
|
|||||||
header.Set("Content-Type", contentType)
|
header.Set("Content-Type", contentType)
|
||||||
header.Set("Cache-Control", "public, max-age=86400")
|
header.Set("Cache-Control", "public, max-age=86400")
|
||||||
header.Set("X-Content-Type-Options", "nosniff")
|
header.Set("X-Content-Type-Options", "nosniff")
|
||||||
|
if value := strings.TrimSpace(upstream.Header.Get("Accept-Ranges")); value != "" {
|
||||||
|
header.Set("Accept-Ranges", value)
|
||||||
|
}
|
||||||
|
if value := strings.TrimSpace(upstream.Header.Get("Content-Range")); value != "" {
|
||||||
|
header.Set("Content-Range", value)
|
||||||
|
}
|
||||||
if upstream.ContentLength >= 0 {
|
if upstream.ContentLength >= 0 {
|
||||||
header.Set("Content-Length", strconv.FormatInt(upstream.ContentLength, 10))
|
header.Set("Content-Length", strconv.FormatInt(upstream.ContentLength, 10))
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.WriteHeader(http.StatusOK)
|
writer.WriteHeader(upstream.StatusCode)
|
||||||
_, _ = io.Copy(writer, io.LimitReader(upstream.Body, effectMediaProxyMaxBytes+1))
|
_, _ = io.Copy(writer, io.LimitReader(upstream.Body, effectMediaProxyMaxBytes+1))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,11 @@ func TestValidateEffectMediaProxyURL(t *testing.T) {
|
|||||||
url string
|
url string
|
||||||
ok bool
|
ok bool
|
||||||
}{
|
}{
|
||||||
|
{
|
||||||
|
name: "mp4 media host",
|
||||||
|
url: "https://media.haiyihy.com/admin/files/1/20260602/file.mp4?sign=1",
|
||||||
|
ok: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "svga media host",
|
name: "svga media host",
|
||||||
url: "https://media.haiyihy.com/admin/files/1/20260602/file.svga",
|
url: "https://media.haiyihy.com/admin/files/1/20260602/file.svga",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user