100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
package pipeline
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"voltaserve/client"
|
|
"voltaserve/config"
|
|
"voltaserve/core"
|
|
"voltaserve/helper"
|
|
"voltaserve/identifier"
|
|
"voltaserve/infra"
|
|
"voltaserve/processor"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type imagePipeline struct {
|
|
imageProc *processor.ImageProcessor
|
|
s3 *infra.S3Manager
|
|
apiClient *client.APIClient
|
|
fileIdent *identifier.FileIdentifier
|
|
logger *zap.SugaredLogger
|
|
config config.Config
|
|
}
|
|
|
|
func NewImagePipeline() core.Pipeline {
|
|
logger, err := infra.GetLogger()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return &imagePipeline{
|
|
imageProc: processor.NewImageProcessor(),
|
|
s3: infra.NewS3Manager(),
|
|
apiClient: client.NewAPIClient(),
|
|
fileIdent: identifier.NewFileIdentifier(),
|
|
logger: logger,
|
|
config: config.GetConfig(),
|
|
}
|
|
}
|
|
|
|
func (p *imagePipeline) Run(opts core.PipelineRunOptions) error {
|
|
inputPath := filepath.FromSlash(os.TempDir() + "/" + helper.NewID() + filepath.Ext(opts.Key))
|
|
if err := p.s3.GetFile(opts.Key, inputPath, opts.Bucket); err != nil {
|
|
return err
|
|
}
|
|
stat, err := os.Stat(inputPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
imageProps, err := p.imageProc.MeasureImage(inputPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
updateOpts := core.SnapshotUpdateOptions{
|
|
Options: opts,
|
|
Original: &core.S3Object{
|
|
Bucket: opts.Bucket,
|
|
Key: opts.Key,
|
|
Image: &imageProps,
|
|
Size: stat.Size(),
|
|
},
|
|
}
|
|
if filepath.Ext(inputPath) == ".tiff" {
|
|
jpegPath := filepath.FromSlash(os.TempDir() + "/" + helper.NewID() + ".jpg")
|
|
if err := p.imageProc.ConvertImage(inputPath, jpegPath); err != nil {
|
|
return err
|
|
}
|
|
thumbnail, err := p.imageProc.Base64Thumbnail(jpegPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
updateOpts.Thumbnail = &thumbnail
|
|
updateOpts.Preview = &core.S3Object{
|
|
Bucket: opts.Bucket,
|
|
Key: opts.FileID + "/" + opts.SnapshotID + "/preview.jpg",
|
|
Size: stat.Size(),
|
|
}
|
|
if err := p.s3.PutFile(updateOpts.Preview.Key, jpegPath, helper.DetectMimeFromFile(jpegPath), updateOpts.Preview.Bucket); err != nil {
|
|
return err
|
|
}
|
|
if err := os.Remove(inputPath); err != nil {
|
|
return err
|
|
}
|
|
inputPath = jpegPath
|
|
} else {
|
|
thumbnail, err := p.imageProc.Base64Thumbnail(inputPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
updateOpts.Thumbnail = &thumbnail
|
|
}
|
|
if err := p.apiClient.UpdateSnapshot(updateOpts); err != nil {
|
|
return err
|
|
}
|
|
if err := os.Remove(inputPath); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|