⚡️ perf(media): 音频代理改为流式转发
- downloadMedia 拿到响应头即返回 Body,音频不再全量驻留内存,改由 io.Copy 流式写出 - 重试仅覆盖响应阶段;Body 读取中途失败由客户端自行重试 - 请求头设置提取为 setMediaHeaders 复用;data_uri 模式保持全量读取(本就需驻留内存) - 漫画代理因需解密后输出,维持原有全量方式
This commit is contained in:
1 parent
f89bee8ddc
commit
ad6d28fd85
3 files changed
+54
-47
No files matched your search
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"fanqie/internal/fqapi"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
)
|
||||
@@ -31,9 +32,9 @@ func HandleAudio(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprint(w, result)
|
||||
}
|
||||
|
||||
// HandleAudioProxy 音频代理处理
|
||||
// HandleAudioProxy 音频代理处理(流式转发,音频不全量驻留内存)
|
||||
func HandleAudioProxy(w http.ResponseWriter, r *http.Request) {
|
||||
incrementStat("total")
|
||||
incrementStat("total", "audio")
|
||||
|
||||
// 从URL路径提取key: /audio/proxy/{key}
|
||||
path := r.URL.Path
|
||||
@@ -44,11 +45,12 @@ func HandleAudioProxy(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
// 调用代理处理函数
|
||||
data, contentType, err := fqapi.HandleAudioProxy(key)
|
||||
body, contentType, err := fqapi.HandleAudioProxy(key)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
defer body.Close()
|
||||
|
||||
// 设置正确的Content-Type
|
||||
if contentType != "" {
|
||||
@@ -59,7 +61,7 @@ func HandleAudioProxy(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// 直接播放,不强制下载
|
||||
// 浏览器会根据Content-Type决定是播放还是下载
|
||||
w.Write(data)
|
||||
io.Copy(w, body)
|
||||
}
|
||||
|
||||
// HandleVideo 视频处理
|
||||
@@ -133,4 +135,3 @@ func HandleManga(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprint(w, string(jsonData))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user