From a643c2f89e4bc8995a5282fd37927542d6eda348 Mon Sep 17 00:00:00 2001 From: withchao <993506633@qq.com> Date: Fri, 4 Aug 2023 19:10:36 +0800 Subject: [PATCH] feat: minio video snapshot --- config/config.yaml | 5 +++-- internal/rpc/third/third.go | 1 + pkg/common/config/config.go | 1 + pkg/common/db/s3/minio/minio.go | 27 ++++++++++++++++++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index 348aa2e93..4127b2f76 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -126,13 +126,14 @@ api: # Configuration for Aliyun OSS object: enable: "minio" - apiURL: http://127.0.0.1:10002/object/ + apiURL: http://127.0.0.1:10002 minio: bucket: "openim" endpoint: http://127.0.0.1:10005 accessKeyID: root secretAccessKey: openIM123 - sessionToken: "" + sessionToken: "" + thumbnailApi: "http://127.0.0.1:10003" cos: bucketURL: "https://temp-1252357374.cos.ap-chengdu.myqcloud.com" secretID: "" diff --git a/internal/rpc/third/third.go b/internal/rpc/third/third.go index 555e9371c..68bea9184 100644 --- a/internal/rpc/third/third.go +++ b/internal/rpc/third/third.go @@ -48,6 +48,7 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e if apiURL[len(apiURL)-1] != '/' { apiURL += "/" } + apiURL += "object/" rdb, err := cache.NewRedis() if err != nil { return err diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index 1e0bbba16..e6b6cde0f 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -119,6 +119,7 @@ type configStruct struct { AccessKeyID string `yaml:"accessKeyID"` SecretAccessKey string `yaml:"secretAccessKey"` SessionToken string `yaml:"sessionToken"` + ThumbnailApi string `yaml:"thumbnailApi"` } `yaml:"minio"` Cos struct { BucketURL string `yaml:"bucketURL"` diff --git a/pkg/common/db/s3/minio/minio.go b/pkg/common/db/s3/minio/minio.go index 19918d41a..dbc0d502e 100644 --- a/pkg/common/db/s3/minio/minio.go +++ b/pkg/common/db/s3/minio/minio.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "github.com/OpenIMSDK/tools/errs" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" "github.com/minio/minio-go/v7/pkg/signer" @@ -56,9 +57,17 @@ func NewMinio() (s3.Interface, error) { if err != nil { return nil, err } + imageApi := conf.ThumbnailApi + if imageApi != "" { + if imageApi[len(imageApi)-1] != '/' { + imageApi += "/" + } + imageApi += "image?" + } m := &Minio{ bucket: conf.Bucket, bucketURL: conf.Endpoint + "/" + conf.Bucket + "/", + imageApi: imageApi, opts: opts, core: &minio.Core{Client: client}, lock: &sync.Mutex{}, @@ -75,6 +84,7 @@ func NewMinio() (s3.Interface, error) { type Minio struct { bucket string bucketURL string + imageApi string opts *minio.Options core *minio.Core lock sync.Locker @@ -324,5 +334,20 @@ func (m *Minio) AccessURL(ctx context.Context, name string, expire time.Duration if err != nil { return "", err } - return u.String(), nil + if opt.Image == nil && opt.Video == nil { + return u.String(), nil + } + if m.imageApi == "" { + return "", errs.ErrInternalServer.Wrap("minio: thumbnail not configured") + } + query := make(url.Values) + query.Set("url", u.String()) + if opt.Image != nil { + query.Set("type", "image") + } + if opt.Video != nil { + query.Set("type", "video") + query.Set("time", strconv.Itoa(int(opt.Video.Time/time.Millisecond))) + } + return m.imageApi + query.Encode(), nil }