fix: add buffer to utils
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package discover
|
package discover
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -13,6 +14,7 @@ import (
|
|||||||
"backend/modules/medias"
|
"backend/modules/medias"
|
||||||
"backend/pkg/media_store"
|
"backend/pkg/media_store"
|
||||||
"backend/pkg/path"
|
"backend/pkg/path"
|
||||||
|
"backend/pkg/utils"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
@@ -61,6 +63,12 @@ func (d *DiscoverMedias) RunE(from, to string) error {
|
|||||||
return errors.Wrapf(err, "get file md5: %s", video)
|
return errors.Wrapf(err, "get file md5: %s", video)
|
||||||
}
|
}
|
||||||
name := filepath.Base(video)[0:strings.LastIndex(filepath.Base(video), ".")]
|
name := filepath.Base(video)[0:strings.LastIndex(filepath.Base(video), ".")]
|
||||||
|
d.log.Infof("start process video: %s, md5: %s, name: %s", video, md5, name)
|
||||||
|
|
||||||
|
if name == "" {
|
||||||
|
d.log.Errorf("video name is empty: %s", video)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if info, ok := store.HashExists(md5); ok {
|
if info, ok := store.HashExists(md5); ok {
|
||||||
info.Name = name
|
info.Name = name
|
||||||
@@ -68,6 +76,7 @@ func (d *DiscoverMedias) RunE(from, to string) error {
|
|||||||
if err := store.Save(to); err != nil {
|
if err := store.Save(to); err != nil {
|
||||||
return errors.Wrapf(err, "save store: %s", to)
|
return errors.Wrapf(err, "save store: %s", to)
|
||||||
}
|
}
|
||||||
|
d.log.Infof("video exists: %s", video)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,11 +165,18 @@ func (d *DiscoverMedias) extractAudio(video string, output string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
d.log.Infof("cmd: ffmpeg %s", strings.Join(args, " "))
|
d.log.Infof("cmd: ffmpeg %s", strings.Join(args, " "))
|
||||||
logs, err := exec.Command("ffmpeg", args...).CombinedOutput()
|
|
||||||
if err != nil {
|
cmd := exec.Command("ffmpeg", args...)
|
||||||
return errors.Wrapf(err, "extract audio: %s", video)
|
var buf bytes.Buffer
|
||||||
|
logWriter := utils.NewLogBuffer(func(line string) {
|
||||||
|
d.log.Info(line)
|
||||||
|
})
|
||||||
|
cmd.Stdout = utils.NewCombinedBuffer(&buf, logWriter)
|
||||||
|
cmd.Stderr = utils.NewCombinedBuffer(&buf, logWriter)
|
||||||
|
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return errors.Wrapf(err, "extract audio failed: %s\n%s", video, buf.String())
|
||||||
}
|
}
|
||||||
d.log.Infof("extract audio: %s", logs)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -206,12 +222,19 @@ func (d *DiscoverMedias) ffmpegVideoToM3U8(input, output, hash string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("cmd: ffmpeg %s", strings.Join(args, " "))
|
log.Infof("cmd: ffmpeg %s", strings.Join(args, " "))
|
||||||
logs, err := exec.Command("ffmpeg", args...).CombinedOutput()
|
|
||||||
if err != nil {
|
cmd := exec.Command("ffmpeg", args...)
|
||||||
return errors.Wrapf(err, "ffmpeg video to m3u8: %s", input)
|
var buf bytes.Buffer
|
||||||
|
logWriter := utils.NewLogBuffer(func(line string) {
|
||||||
|
d.log.Info(line)
|
||||||
|
})
|
||||||
|
cmd.Stdout = utils.NewCombinedBuffer(&buf, logWriter)
|
||||||
|
cmd.Stderr = utils.NewCombinedBuffer(&buf, logWriter)
|
||||||
|
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return errors.Wrapf(err, "ffmpeg video to m3u8 failed: %s\n%s", input, buf.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
d.log.Infof("ffmpeg video to m3u8: %s", logs)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,12 +257,19 @@ func (d *DiscoverMedias) ffmpegAudioToM3U8(input, output, hash string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("cmd: ffmpeg %s", strings.Join(args, " "))
|
log.Infof("cmd: ffmpeg %s", strings.Join(args, " "))
|
||||||
logs, err := exec.Command("ffmpeg", args...).CombinedOutput()
|
|
||||||
if err != nil {
|
cmd := exec.Command("ffmpeg", args...)
|
||||||
return errors.Wrapf(err, "ffmpeg audio to m3u8: %s", input)
|
var buf bytes.Buffer
|
||||||
|
logWriter := utils.NewLogBuffer(func(line string) {
|
||||||
|
d.log.Info(line)
|
||||||
|
})
|
||||||
|
cmd.Stdout = utils.NewCombinedBuffer(&buf, logWriter)
|
||||||
|
cmd.Stderr = utils.NewCombinedBuffer(&buf, logWriter)
|
||||||
|
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return errors.Wrapf(err, "ffmpeg audio to m3u8 failed: %s\n%s", input, buf.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
d.log.Infof("ffmpeg audio to m3u8: %s", logs)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,8 +304,8 @@ func (d *DiscoverMedias) runCleanup(to string) {
|
|||||||
|
|
||||||
// getSnapshot get the snapshot of target seconds of a video
|
// getSnapshot get the snapshot of target seconds of a video
|
||||||
func (d *DiscoverMedias) ffmpegVideoToPoster(video string, output string) error {
|
func (d *DiscoverMedias) ffmpegVideoToPoster(video string, output string) error {
|
||||||
// ffmpeg -i input_video.mp4 -ss N -vframes 1 -vf "scale=width:height" output_image.jpg
|
|
||||||
args := []string{
|
args := []string{
|
||||||
|
"-y", // 添加 -y 参数强制覆盖
|
||||||
"-i", video,
|
"-i", video,
|
||||||
"-ss", "00:00:01",
|
"-ss", "00:00:01",
|
||||||
"-vframes", "1",
|
"-vframes", "1",
|
||||||
@@ -284,12 +314,19 @@ func (d *DiscoverMedias) ffmpegVideoToPoster(video string, output string) error
|
|||||||
}
|
}
|
||||||
|
|
||||||
d.log.Infof("cmd: ffmpeg %s", strings.Join(args, " "))
|
d.log.Infof("cmd: ffmpeg %s", strings.Join(args, " "))
|
||||||
logs, err := exec.Command("ffmpeg", args...).CombinedOutput()
|
|
||||||
if err != nil {
|
cmd := exec.Command("ffmpeg", args...)
|
||||||
return errors.Wrapf(err, "get snapshot: %s", video)
|
var buf bytes.Buffer
|
||||||
|
logWriter := utils.NewLogBuffer(func(line string) {
|
||||||
|
d.log.Info(line)
|
||||||
|
})
|
||||||
|
cmd.Stdout = utils.NewCombinedBuffer(&buf, logWriter)
|
||||||
|
cmd.Stderr = utils.NewCombinedBuffer(&buf, logWriter)
|
||||||
|
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return errors.Wrapf(err, "get snapshot failed: %s\n%s", video, buf.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
d.log.Infof("get snapshot: %s", logs)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
26
backend/pkg/utils/buffer.go
Normal file
26
backend/pkg/utils/buffer.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewLogBuffer creates a buffer that can be used to capture output stream
|
||||||
|
// and write to a logger in real time
|
||||||
|
func NewLogBuffer(output func(string)) io.Writer {
|
||||||
|
reader, writer := io.Pipe()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
scanner := bufio.NewScanner(reader)
|
||||||
|
for scanner.Scan() {
|
||||||
|
output(scanner.Text())
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return writer
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCombinedBuffer combines multiple io.Writers
|
||||||
|
func NewCombinedBuffer(writers ...io.Writer) io.Writer {
|
||||||
|
return io.MultiWriter(writers...)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user