refactor: imagor seek stream implementation
This commit is contained in:
parent
d307733d1d
commit
343d4903a1
3 changed files with 28 additions and 37 deletions
53
processor.go
53
processor.go
|
|
@ -8,7 +8,6 @@ import (
|
|||
"github.com/gabriel-vasile/mimetype"
|
||||
"go.uber.org/zap"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
|
|
@ -78,48 +77,40 @@ func (p *Processor) Process(ctx context.Context, in *imagor.Blob, params imagorp
|
|||
out = in
|
||||
return
|
||||
}
|
||||
var reader io.ReadCloser
|
||||
var r io.ReadCloser
|
||||
var rs io.ReadSeekCloser
|
||||
var size int64
|
||||
switch mime {
|
||||
case "video/webm", "video/x-matroska":
|
||||
// media types that does not require seek
|
||||
if reader, size, err = in.NewReader(); err != nil {
|
||||
if r, size, err = in.NewReader(); err != nil {
|
||||
return
|
||||
}
|
||||
default:
|
||||
reader, size, err = in.NewReadSeeker()
|
||||
if size <= 0 {
|
||||
// size must be known
|
||||
_ = r.Close()
|
||||
r = nil
|
||||
}
|
||||
}
|
||||
if reader == nil || size <= 0 {
|
||||
// write to temp file if read seeker not available or size unknown
|
||||
if reader == nil {
|
||||
if reader, _, err = in.NewReader(); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
var file *os.File
|
||||
if file, err = os.CreateTemp("", "imagor-"); err != nil {
|
||||
return
|
||||
}
|
||||
var filename = file.Name()
|
||||
defer func() {
|
||||
_ = os.Remove(filename)
|
||||
p.Logger.Debug("cleanup", zap.String("file", filename))
|
||||
}()
|
||||
if size, err = io.Copy(file, reader); err != nil {
|
||||
return
|
||||
}
|
||||
p.Logger.Debug("temp",
|
||||
zap.String("file", filename),
|
||||
zap.Int64("size", size))
|
||||
_ = file.Close()
|
||||
if reader, err = os.Open(filename); err != nil {
|
||||
if r == nil {
|
||||
if rs, size, err = in.NewReadSeeker(); err != nil {
|
||||
return
|
||||
}
|
||||
r = rs
|
||||
}
|
||||
defer func() {
|
||||
_ = reader.Close()
|
||||
_ = r.Close()
|
||||
}()
|
||||
av, err := ffmpeg.LoadAVContext(ctx, reader, size)
|
||||
if size <= 0 && rs != nil {
|
||||
// size must be known
|
||||
if size, err = rs.Seek(0, io.SeekEnd); err != nil {
|
||||
return
|
||||
}
|
||||
if _, err = rs.Seek(0, io.SeekStart); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
av, err := ffmpeg.LoadAVContext(ctx, r, size)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue