refactor: imagor seek stream implementation
This commit is contained in:
parent
d307733d1d
commit
343d4903a1
3 changed files with 28 additions and 37 deletions
4
go.mod
4
go.mod
|
|
@ -3,7 +3,7 @@ module github.com/cshum/imagorvideo
|
|||
go 1.18
|
||||
|
||||
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/stretchr/testify v1.8.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/iam v0.3.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/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/protobuf v1.5.2 // indirect
|
||||
|
|
|
|||
8
go.sum
8
go.sum
|
|
@ -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/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/aws/aws-sdk-go v1.44.106 h1:FzINxRGt0gAzz01ixtKfkjiDOnnpd/uNbstW/qPW2QE=
|
||||
github.com/aws/aws-sdk-go v1.44.106/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
|
||||
github.com/aws/aws-sdk-go v1.44.114 h1:plIkWc/RsHr3DXBj4MEw9sEW4CcL/e2ryokc+CKyq1I=
|
||||
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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
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-20211001041855-01bcc9b48dfe/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.20221010125033-19ba144615af/go.mod h1:7DEd2qtXj469uYoAj5SskR7GZKzwFowIhqYw/x3tlM4=
|
||||
github.com/cshum/imagor v1.1.10-0.20221011084155-100ed56d3c84 h1:MQSxty/I5LxE3LXWbm9gUhI9UqusQVB3Sr2wCef2nzA=
|
||||
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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
|
|
|
|||
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