66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
package middleware
|
|
|
|
import (
|
|
"bytes"
|
|
"game-driver/internal/schema"
|
|
"game-driver/leaf"
|
|
"game-driver/pkg/audio"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
func open(u string) io.ReadCloser {
|
|
p, _ := strings.CutPrefix(u, "file://")
|
|
f, e := os.Open(p)
|
|
if e != nil {
|
|
log.Printf("BGM 文件 [%v] 打开错误: %v\n", u, e)
|
|
return nil
|
|
}
|
|
return f
|
|
}
|
|
|
|
func get(u string) io.ReadCloser {
|
|
resp, e := http.Get(u)
|
|
if e != nil {
|
|
log.Printf("BGM 文件 [%v] 下载失败: %v\n", u, e)
|
|
return nil
|
|
}
|
|
return resp.Body
|
|
}
|
|
|
|
func toBuffer(b io.ReadCloser) io.ReadCloser {
|
|
data := &bytes.Buffer{}
|
|
_, _ = data.ReadFrom(b)
|
|
defer b.Close()
|
|
return io.NopCloser(data)
|
|
}
|
|
|
|
func PlayBgm() leaf.HandlerFunc {
|
|
return func(c *leaf.Context) {
|
|
pm := leaf.Value[*schema.PlayModal](c, PayloadJSONKey)
|
|
u, err := url.Parse(pm.BGM)
|
|
if err != nil {
|
|
log.Println("BGM URL 解析错误: ", err)
|
|
} else {
|
|
var bgm io.ReadCloser
|
|
if u.Scheme == "file" {
|
|
bgm = open(u.String())
|
|
} else if u.Scheme == "http" || u.Scheme == "https" {
|
|
bgm = get(u.String())
|
|
} else {
|
|
log.Printf("不支持的BGM文件协议: %v\n", u.String())
|
|
}
|
|
// 获取到了资源进行播放
|
|
if bgm != nil {
|
|
go audio.PlayMP3(c, toBuffer(bgm))
|
|
}
|
|
}
|
|
|
|
c.Next()
|
|
}
|
|
}
|