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() } }