refactor: imagor seek stream implementation

This commit is contained in:
Adrian Shum 2022-10-11 16:55:24 +08:00 committed by GitHub
parent d307733d1d
commit 343d4903a1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 37 deletions

4
go.mod
View file

@ -3,7 +3,7 @@ module github.com/cshum/imagorvideo
go 1.18 go 1.18
require ( require (
github.com/cshum/imagor v1.1.10-0.20221010125033-19ba144615af github.com/cshum/imagor v1.1.10-0.20221011084155-100ed56d3c84
github.com/gabriel-vasile/mimetype v1.4.1 github.com/gabriel-vasile/mimetype v1.4.1
github.com/stretchr/testify v1.8.0 github.com/stretchr/testify v1.8.0
go.uber.org/zap v1.23.0 go.uber.org/zap v1.23.0
@ -14,7 +14,7 @@ require (
cloud.google.com/go/compute v1.7.0 // indirect cloud.google.com/go/compute v1.7.0 // indirect
cloud.google.com/go/iam v0.3.0 // indirect cloud.google.com/go/iam v0.3.0 // indirect
cloud.google.com/go/storage v1.27.0 // indirect cloud.google.com/go/storage v1.27.0 // indirect
github.com/aws/aws-sdk-go v1.44.106 // indirect github.com/aws/aws-sdk-go v1.44.114 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect github.com/golang/protobuf v1.5.2 // indirect

8
go.sum
View file

@ -66,8 +66,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/aws/aws-sdk-go v1.44.106 h1:FzINxRGt0gAzz01ixtKfkjiDOnnpd/uNbstW/qPW2QE= github.com/aws/aws-sdk-go v1.44.114 h1:plIkWc/RsHr3DXBj4MEw9sEW4CcL/e2ryokc+CKyq1I=
github.com/aws/aws-sdk-go v1.44.106/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.114/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
@ -85,8 +85,8 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cshum/imagor v1.1.10-0.20221010125033-19ba144615af h1:56ja1GAbhJ4AFDfnxQawcdAl1Ni010WOtdylJWOwD00= github.com/cshum/imagor v1.1.10-0.20221011084155-100ed56d3c84 h1:MQSxty/I5LxE3LXWbm9gUhI9UqusQVB3Sr2wCef2nzA=
github.com/cshum/imagor v1.1.10-0.20221010125033-19ba144615af/go.mod h1:7DEd2qtXj469uYoAj5SskR7GZKzwFowIhqYw/x3tlM4= github.com/cshum/imagor v1.1.10-0.20221011084155-100ed56d3c84/go.mod h1:6HJX2R4KlDkAtjXgWI42k1efPYRV179Ud4K7RTI0OMo=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

View file

@ -8,7 +8,6 @@ import (
"github.com/gabriel-vasile/mimetype" "github.com/gabriel-vasile/mimetype"
"go.uber.org/zap" "go.uber.org/zap"
"io" "io"
"os"
"strings" "strings"
) )
@ -78,48 +77,40 @@ func (p *Processor) Process(ctx context.Context, in *imagor.Blob, params imagorp
out = in out = in
return return
} }
var reader io.ReadCloser var r io.ReadCloser
var rs io.ReadSeekCloser
var size int64 var size int64
switch mime { switch mime {
case "video/webm", "video/x-matroska": case "video/webm", "video/x-matroska":
// media types that does not require seek // media types that does not require seek
if reader, size, err = in.NewReader(); err != nil { if r, size, err = in.NewReader(); err != nil {
return return
} }
default: if size <= 0 {
reader, size, err = in.NewReadSeeker() // size must be known
_ = r.Close()
r = nil
}
} }
if reader == nil || size <= 0 { if r == nil {
// write to temp file if read seeker not available or size unknown if rs, size, err = in.NewReadSeeker(); err != nil {
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 {
return return
} }
r = rs
} }
defer func() { 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 { if err != nil {
return return
} }