diff --git a/drivers/123_open/driver.go b/drivers/123_open/driver.go index ac75e51d7..b12bd8322 100644 --- a/drivers/123_open/driver.go +++ b/drivers/123_open/driver.go @@ -103,7 +103,7 @@ func (d *Open123) Link(ctx context.Context, file model.Obj, args model.LinkArgs) }, nil } - res, err := d.getDownloadInfo(fileId) + res, err := d.GetDownloadInfo(fileId) if err != nil { return nil, err } @@ -138,7 +138,7 @@ func (d *Open123) Copy(ctx context.Context, srcObj, dstDir model.Obj) error { return fmt.Errorf("parse parentFileID error: %v", err) } etag := srcObj.(File).Etag - createResp, err := d.create(parentFileId, srcObj.GetName(), etag, srcObj.GetSize(), 2, false) + createResp, err := d.Create(parentFileId, srcObj.GetName(), etag, srcObj.GetSize(), 2, false) if err != nil { return err } @@ -170,7 +170,7 @@ func (d *Open123) Put(ctx context.Context, dstDir model.Obj, file model.FileStre return nil, err } } - createResp, err := d.create(parentFileId, file.GetName(), etag, file.GetSize(), 2, false) + createResp, err := d.Create(parentFileId, file.GetName(), etag, file.GetSize(), 2, false) if err != nil { return nil, err } diff --git a/drivers/123_open/upload.go b/drivers/123_open/upload.go index 73395fcfd..d6863fb7d 100644 --- a/drivers/123_open/upload.go +++ b/drivers/123_open/upload.go @@ -23,7 +23,7 @@ import ( ) // 创建文件 V2 -func (d *Open123) create(parentFileID int64, filename string, etag string, size int64, duplicate int, containDir bool) (*UploadCreateResp, error) { +func (d *Open123) Create(parentFileID int64, filename string, etag string, size int64, duplicate int, containDir bool) (*UploadCreateResp, error) { var resp UploadCreateResp _, err := d.Request(UploadCreate, http.MethodPost, func(req *resty.Request) { req.SetBody(base.Json{ diff --git a/drivers/123_open/util.go b/drivers/123_open/util.go index b09d9eb8b..da5784b69 100644 --- a/drivers/123_open/util.go +++ b/drivers/123_open/util.go @@ -196,7 +196,7 @@ func (d *Open123) getFiles(parentFileId int64, limit int, lastFileId int64) (*Fi return &resp, nil } -func (d *Open123) getDownloadInfo(fileId int64) (*DownloadInfoResp, error) { +func (d *Open123) GetDownloadInfo(fileId int64) (*DownloadInfoResp, error) { var resp DownloadInfoResp _, err := d.Request(DownloadInfo, http.MethodGet, func(req *resty.Request) { diff --git a/drivers/123_share/driver.go b/drivers/123_share/driver.go index b769bfe0d..3ac95cd8d 100644 --- a/drivers/123_share/driver.go +++ b/drivers/123_share/driver.go @@ -12,6 +12,7 @@ import ( "golang.org/x/time/rate" _123 "github.com/OpenListTeam/OpenList/v4/drivers/123" + _123_open "github.com/OpenListTeam/OpenList/v4/drivers/123_open" "github.com/OpenListTeam/OpenList/v4/drivers/base" "github.com/OpenListTeam/OpenList/v4/internal/driver" "github.com/OpenListTeam/OpenList/v4/internal/errs" @@ -26,6 +27,7 @@ type Pan123Share struct { Addition apiRateLimit sync.Map ref *_123.Pan123 + refOpen *_123_open.Open123 } func (d *Pan123Share) Config() driver.Config { @@ -43,12 +45,14 @@ func (d *Pan123Share) Init(ctx context.Context) error { } func (d *Pan123Share) InitReference(storage driver.Driver) error { - refStorage, ok := storage.(*_123.Pan123) - if ok { + if refStorage, ok := storage.(*_123.Pan123); ok { d.ref = refStorage return nil + } else if refStorage, ok := storage.(*_123_open.Open123); ok { + d.refOpen = refStorage + return nil } - return fmt.Errorf("ref: storage is not 123Pan") + return fmt.Errorf("ref: storage is not 123Pan or 123Open") } func (d *Pan123Share) Drop(ctx context.Context) error { @@ -70,6 +74,23 @@ func (d *Pan123Share) List(ctx context.Context, dir model.Obj, args model.ListAr func (d *Pan123Share) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) { // TODO return link of file, required if f, ok := file.(File); ok { + if d.refOpen != nil { + // 1. 转存到缓存文件夹 + s, err := d.refOpen.Create(d.Addition.TempDirID, f.FileName, f.Etag, f.Size, 2, false) + if err != nil { + return nil, err + } + if !s.Data.Reuse { + return nil, fmt.Errorf("failed to transfer share file") + } + // 2. 获取直链 + res, err := d.refOpen.GetDownloadInfo(s.Data.FileID) + if err != nil { + return nil, err + } + exp := 5 * time.Minute + return &model.Link{URL: res.Data.DownloadUrl, Expiration: &exp}, nil + } data := base.Json{ "shareKey": d.ShareKey, "SharePwd": d.SharePwd, diff --git a/drivers/123_share/meta.go b/drivers/123_share/meta.go index 12c620d7a..5a379bf00 100644 --- a/drivers/123_share/meta.go +++ b/drivers/123_share/meta.go @@ -12,6 +12,7 @@ type Addition struct { //OrderBy string `json:"order_by" type:"select" options:"file_name,size,update_at" default:"file_name"` //OrderDirection string `json:"order_direction" type:"select" options:"asc,desc" default:"asc"` AccessToken string `json:"accesstoken" type:"text"` + TempDirID int64 `json:"temp_dir_id" type:"number" default:"0" help:"Directory ID for transfer share files. (123Open Only)"` } var config = driver.Config{