mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-05-05 19:43:49 +08:00
commit
9beae584de
@ -354,7 +354,7 @@ func (bot *CQBot) CQSendPrivateMessage(userId int64, i interface{}, autoEscape b
|
||||
var str string
|
||||
if m, ok := i.(gjson.Result); ok {
|
||||
if m.Type == gjson.JSON {
|
||||
elem := bot.ConvertObjectMessage(m, true)
|
||||
elem := bot.ConvertObjectMessage(m, false)
|
||||
mid := bot.SendPrivateMessage(userId, &message.SendingMessage{Elements: elem})
|
||||
if mid == -1 {
|
||||
return Failed(100, "SEND_MSG_API_ERROR", "请参考输出")
|
||||
|
@ -895,9 +895,7 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video, group bool) (
|
||||
}
|
||||
hasCacheFile:
|
||||
if video {
|
||||
return &LocalVideoElement{
|
||||
File: cacheFile,
|
||||
}, nil
|
||||
return &LocalVideoElement{File: cacheFile}, nil
|
||||
}
|
||||
return &LocalImageElement{File: cacheFile}, nil
|
||||
}
|
||||
@ -917,21 +915,36 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video, group bool) (
|
||||
return nil, err
|
||||
}
|
||||
if video {
|
||||
goto videos
|
||||
}
|
||||
if info.Size() == 0 || info.Size() >= maxImageSize {
|
||||
return nil, errors.New("invalid image size")
|
||||
}
|
||||
return &LocalImageElement{File: fu.Path}, nil
|
||||
videos:
|
||||
if info.Size() == 0 || info.Size() >= maxVideoSize {
|
||||
return nil, errors.New("invalid video size")
|
||||
}
|
||||
return &LocalVideoElement{File: fu.Path}, nil
|
||||
}
|
||||
if info.Size() == 0 || info.Size() >= maxImageSize {
|
||||
return nil, errors.New("invalid image size")
|
||||
}
|
||||
return &LocalImageElement{File: fu.Path}, nil
|
||||
}
|
||||
rawPath := path.Join(global.IMAGE_PATH, f)
|
||||
if video {
|
||||
goto video
|
||||
rawPath = path.Join(global.VIDEO_PATH, f)
|
||||
if !global.PathExists(rawPath) {
|
||||
return nil, errors.New("invalid video")
|
||||
}
|
||||
if path.Ext(rawPath) == ".video" {
|
||||
b, _ := ioutil.ReadFile(rawPath)
|
||||
r := binary.NewReader(b)
|
||||
return &LocalVideoElement{ShortVideoElement: message.ShortVideoElement{ // todo 检查缓存是否有效
|
||||
Md5: r.ReadBytes(16),
|
||||
ThumbMd5: r.ReadBytes(16),
|
||||
Size: r.ReadInt32(),
|
||||
ThumbSize: r.ReadInt32(),
|
||||
Name: r.ReadString(),
|
||||
Uuid: r.ReadAvailable(),
|
||||
}}, nil
|
||||
} else {
|
||||
return &LocalVideoElement{File: rawPath}, nil
|
||||
}
|
||||
}
|
||||
if strings.HasPrefix(f, "base64") {
|
||||
b, err := base64.StdEncoding.DecodeString(strings.ReplaceAll(f, "base64://", ""))
|
||||
@ -1012,25 +1025,6 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video, group bool) (
|
||||
return rsp, nil
|
||||
}
|
||||
return nil, errors.New("invalid image")
|
||||
video:
|
||||
rawPath = path.Join(global.VIDEO_PATH, f)
|
||||
if !global.PathExists(rawPath) {
|
||||
return nil, errors.New("invalid video")
|
||||
}
|
||||
if path.Ext(rawPath) == ".video" {
|
||||
b, _ := ioutil.ReadFile(rawPath)
|
||||
r := binary.NewReader(b)
|
||||
return &LocalVideoElement{ShortVideoElement: message.ShortVideoElement{ // todo 检查缓存是否有效
|
||||
Md5: r.ReadBytes(16),
|
||||
ThumbMd5: r.ReadBytes(16),
|
||||
Size: r.ReadInt32(),
|
||||
ThumbSize: r.ReadInt32(),
|
||||
Name: r.ReadString(),
|
||||
Uuid: r.ReadAvailable(),
|
||||
}}, nil
|
||||
} else {
|
||||
return &LocalVideoElement{File: rawPath}, nil
|
||||
}
|
||||
}
|
||||
|
||||
//makeShowPic 一种xml 方式发送的群消息图片
|
||||
|
@ -15,7 +15,7 @@ var useSilkCodec = true
|
||||
|
||||
func InitCodec() {
|
||||
log.Info("正在加载silk编码器...")
|
||||
err := codec.Init("data/cache", "codec")
|
||||
err := codec.Init()
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
useSilkCodec = false
|
||||
|
@ -13,17 +13,13 @@ import (
|
||||
"runtime"
|
||||
)
|
||||
|
||||
var (
|
||||
codecDir string
|
||||
encoderPath string
|
||||
cachePath string
|
||||
const (
|
||||
silkCachePath = "data/cache"
|
||||
encoderPath = "codec"
|
||||
)
|
||||
|
||||
func downloadCodec(url string, path string) (err error) {
|
||||
func downloadCodec(url string) (err error) {
|
||||
resp, err := http.Get(url)
|
||||
if runtime.GOOS == "windows" {
|
||||
path = path + ".exe"
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -32,40 +28,37 @@ func downloadCodec(url string, path string) (err error) {
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = ioutil.WriteFile(path, body, os.ModePerm)
|
||||
err = ioutil.WriteFile(getEncoderFilePath(), body, os.ModePerm)
|
||||
return
|
||||
}
|
||||
|
||||
func Init(cachePath, codecPath string) error {
|
||||
appPath, err := os.Executable()
|
||||
appPath = path.Dir(appPath)
|
||||
if err != nil {
|
||||
return err
|
||||
func getEncoderFilePath() string {
|
||||
encoderFile := path.Join(encoderPath, runtime.GOOS+"-"+runtime.GOARCH+"-encoder")
|
||||
if runtime.GOOS == "windows" {
|
||||
encoderFile = encoderFile + ".exe"
|
||||
}
|
||||
cachePath = path.Join(appPath, cachePath)
|
||||
codecDir = path.Join(appPath, codecPath)
|
||||
if !fileExist(codecDir) {
|
||||
_ = os.MkdirAll(codecDir, os.ModePerm)
|
||||
return encoderFile
|
||||
}
|
||||
if !fileExist(cachePath) {
|
||||
_ = os.MkdirAll(cachePath, os.ModePerm)
|
||||
|
||||
func Init() error {
|
||||
if !fileExist(silkCachePath) {
|
||||
_ = os.MkdirAll(silkCachePath, os.ModePerm)
|
||||
}
|
||||
encoderFile := runtime.GOOS + "-" + runtime.GOARCH + "-encoder"
|
||||
encoderPath = path.Join(codecDir, encoderFile)
|
||||
if !fileExist(encoderPath) {
|
||||
if err = downloadCodec("https://cdn.jsdelivr.net/gh/wdvxdr1123/tosilk/codec/"+encoderFile, encoderPath); err != nil {
|
||||
_ = os.MkdirAll(encoderPath, os.ModePerm)
|
||||
}
|
||||
p := getEncoderFilePath()
|
||||
if !fileExist(p) {
|
||||
if err := downloadCodec("https://cdn.jsdelivr.net/gh/wdvxdr1123/tosilk/codec/" + runtime.GOOS + "-" + runtime.GOARCH + "-encoder"); err != nil {
|
||||
return errors.New("下载依赖失败")
|
||||
}
|
||||
}
|
||||
if runtime.GOOS == "windows" {
|
||||
encoderPath = encoderPath + ".exe"
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error) {
|
||||
// 1. 写入缓存文件
|
||||
rawPath := path.Join(cachePath, tempName+".wav")
|
||||
rawPath := path.Join(silkCachePath, tempName+".wav")
|
||||
err := ioutil.WriteFile(rawPath, record, os.ModePerm)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -73,7 +66,7 @@ func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error)
|
||||
defer os.Remove(rawPath)
|
||||
|
||||
// 2.转换pcm
|
||||
pcmPath := path.Join(cachePath, tempName+".pcm")
|
||||
pcmPath := path.Join(silkCachePath, tempName+".pcm")
|
||||
cmd := exec.Command("ffmpeg", "-i", rawPath, "-f", "s16le", "-ar", "24000", "-ac", "1", pcmPath)
|
||||
if err = cmd.Run(); err != nil {
|
||||
return nil, err
|
||||
@ -81,8 +74,8 @@ func EncodeToSilk(record []byte, tempName string, useCache bool) ([]byte, error)
|
||||
defer os.Remove(pcmPath)
|
||||
|
||||
// 3. 转silk
|
||||
silkPath := path.Join(cachePath, tempName+".silk")
|
||||
cmd = exec.Command(encoderPath, pcmPath, silkPath, "-rate", "24000", "-quiet", "-tencent")
|
||||
silkPath := path.Join(silkCachePath, tempName+".silk")
|
||||
cmd = exec.Command(getEncoderFilePath(), pcmPath, silkPath, "-rate", "24000", "-quiet", "-tencent")
|
||||
if err = cmd.Run(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user