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
|
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
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/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=
|
||||||
|
|
|
||||||
53
processor.go
53
processor.go
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue