71 lines
1.3 KiB
Go
71 lines
1.3 KiB
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
type reader struct {
|
|
bytes.Reader
|
|
io.Closer
|
|
}
|
|
|
|
func (a *reader) Seek(offset int64, whence int) (int64, error) {
|
|
return a.Reader.Seek(offset, whence)
|
|
}
|
|
|
|
func toSeeker(src io.ReadCloser) io.ReadCloser {
|
|
buf := &bytes.Buffer{}
|
|
_, _ = io.Copy(buf, src)
|
|
return &reader{
|
|
Reader: *bytes.NewReader(buf.Bytes()),
|
|
Closer: src,
|
|
}
|
|
}
|
|
|
|
func open(u string) io.ReadCloser {
|
|
p, _ := strings.CutPrefix(u, "file://")
|
|
f, e := os.Open(p)
|
|
if e != nil {
|
|
log.Printf("音频文件 [%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("音频文件 [%v] 下载失败: %v\n", u, e)
|
|
return nil
|
|
}
|
|
return resp.Body
|
|
}
|
|
|
|
// LinkAudio 链接音频,解析链接,直接提取为数据流
|
|
func LinkAudio(link string) (bgm io.ReadCloser) {
|
|
if link == "" {
|
|
return nil
|
|
}
|
|
u, err := url.Parse(link)
|
|
if err != nil {
|
|
log.Println("音频 URL 解析错误: ", err)
|
|
} else {
|
|
if u.Scheme == "file" {
|
|
bgm = open(link)
|
|
} else if u.Scheme == "http" || u.Scheme == "https" {
|
|
bgm = get(link)
|
|
} else {
|
|
log.Printf("不支持的音频文件协议: %v\n", u.String())
|
|
return
|
|
}
|
|
bgm = toSeeker(bgm)
|
|
}
|
|
return
|
|
}
|