Skip to content

Commit cecb63c

Browse files
committed
local video,image
1 parent a9ea25b commit cecb63c

File tree

2 files changed

+64
-34
lines changed

2 files changed

+64
-34
lines changed

pkg/clz/clz.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,8 @@ type MyVideoElement struct {
1414
UploadingCover io.ReadSeeker // 待上传的封面 发送时需要
1515
UploadingVideo io.ReadSeeker // 待上传的视频 发送时需要
1616
}
17+
18+
type LocalImageElement struct {
19+
message.ImageElement
20+
Stream io.ReadSeeker
21+
}

service/bot/proto2mirai.go

Lines changed: 59 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -83,23 +83,31 @@ func ProtoTextToMiraiText(data map[string]string) message.IMessageElement {
8383

8484
func ProtoImageToMiraiImage(data map[string]string) message.IMessageElement {
8585
url, ok := data["url"]
86-
if !ok || !strings.Contains(url, "http") {
86+
if !ok {
8787
url, ok = data["src"] // TODO 为了兼容我的旧代码偷偷加的
88-
if !ok || !strings.Contains(url, "http") {
88+
if !ok {
8989
url, ok = data["file"]
9090
}
9191
}
92-
if !ok || !strings.Contains(url, "http") {
92+
if !ok {
9393
log.Warnf("imageUrl不存在")
9494
return EmptyText()
9595
}
96-
log.Infof("下载图片: %+v", url)
97-
b, err := util.GetBytes(url)
98-
if err != nil {
99-
log.Errorf("下载图片失败")
100-
return EmptyText()
96+
if strings.Contains(url, "http://") || strings.Contains(url, "https://") {
97+
b, err := util.GetBytes(url)
98+
if err != nil {
99+
log.Errorf("failed to download image")
100+
return EmptyText()
101+
}
102+
return &clz.LocalImageElement{Stream: bytes.NewReader(b)}
103+
} else {
104+
imageFile, err := os.Open(url)
105+
if err != nil {
106+
log.Errorf("failed to open local image")
107+
return EmptyText()
108+
}
109+
return &clz.LocalImageElement{Stream: imageFile}
101110
}
102-
return message.NewImage(b)
103111
}
104112

105113
func ProtoVoiceToMiraiVoice(data map[string]string) message.IMessageElement {
@@ -305,53 +313,70 @@ func ProtoTtsToMiraiTts(cli *client.QQClient, data map[string]string) (m message
305313
}
306314

307315
func ProtoVideoToMiraiVideo(cli *client.QQClient, data map[string]string) (m message.IMessageElement) {
316+
elem := &clz.MyVideoElement{}
308317
coverUrl, ok := data["cover"]
309318
if !ok {
310319
log.Warnf("video cover不存在")
311320
return EmptyText()
312321
}
313322
url, ok := data["url"]
314-
if !ok || !strings.Contains(url, "http") {
323+
if !ok {
315324
url, ok = data["file"]
316-
if !ok || !strings.Contains(url, "http") {
325+
if !ok {
317326
log.Warnf("video url不存在")
318327
return EmptyText()
319328
}
320329
}
321-
coverBytes, err := util.GetBytes(coverUrl)
322-
if err != nil {
323-
log.Errorf("failed to download cover, err: %+v", err)
324-
return EmptyText()
325-
}
326-
327-
if !util.PathExists("video") {
328-
err := os.MkdirAll("video", 0777)
330+
if strings.Contains(coverUrl, "http://") || strings.Contains(coverUrl, "https://") {
331+
coverBytes, err := util.GetBytes(coverUrl)
329332
if err != nil {
330-
log.Errorf("failed to mkdir, err: %+v", err)
333+
log.Errorf("failed to download cover, err: %+v", err)
331334
return EmptyText()
332335
}
333-
}
334-
filepath := path.Join("video", util.MustMd5(url)+".mp4")
335-
if util.PathExists(filepath) {
336-
if err := os.Remove(filepath); err != nil {
337-
log.Errorf("删除缓存文件 %v 时出现错误: %v", filepath, err)
336+
elem.UploadingCover = bytes.NewReader(coverBytes)
337+
} else {
338+
coverFile, err := os.Open(coverUrl)
339+
if err != nil {
340+
log.Errorf("failed to open file, err: %+v", err)
338341
return EmptyText()
339342
}
343+
elem.UploadingCover = coverFile
340344
}
341-
//videoBytes, err := util.GetBytes(url)
342-
if err := util.DownloadFileMultiThreading(url, filepath, 100*1024*1024, 8, nil); err != nil {
343-
log.Errorf("failed to download video file, err: %+v", err)
344-
return EmptyText()
345+
346+
videoFilePath := path.Join("video", util.MustMd5(url)+".mp4")
347+
if strings.Contains(url, "http://") || strings.Contains(url, "https://") {
348+
if !util.PathExists("video") {
349+
err := os.MkdirAll("video", 0777)
350+
if err != nil {
351+
log.Errorf("failed to mkdir, err: %+v", err)
352+
return EmptyText()
353+
}
354+
}
355+
if !util.PathExists(videoFilePath) {
356+
if err := util.DownloadFileMultiThreading(url, videoFilePath, 100*1024*1024, 8, nil); err != nil {
357+
log.Errorf("failed to download video file, err: %+v", err)
358+
return EmptyText()
359+
}
360+
} else if data["cache"] == "0" {
361+
if err := os.Remove(videoFilePath); err != nil {
362+
log.Errorf("删除缓存文件 %v 时出现错误: %v", videoFilePath, err)
363+
return EmptyText()
364+
}
365+
if err := util.DownloadFileMultiThreading(url, videoFilePath, 100*1024*1024, 8, nil); err != nil {
366+
log.Errorf("failed to download video file, err: %+v", err)
367+
return EmptyText()
368+
}
369+
}
370+
} else {
371+
videoFilePath = url
345372
}
346-
videoFile, err := os.Open(filepath)
373+
374+
videoFile, err := os.Open(videoFilePath)
347375
if err != nil {
348376
log.Errorf("failed to open video file")
349377
return EmptyText()
350378
}
351-
elem := &clz.MyVideoElement{
352-
UploadingCover: bytes.NewReader(coverBytes), // 实际发送使用
353-
UploadingVideo: videoFile, // 实际发送使用
354-
}
379+
elem.UploadingVideo = videoFile
355380
elem.Url = url // 仅用于发送日志展示
356381
elem.CoverUrl = coverUrl // 仅用于发送日志展示
357382
return elem

0 commit comments

Comments
 (0)