diff --git a/drivers/alias/driver.go b/drivers/alias/driver.go index 6954f2b5..ea3c2539 100644 --- a/drivers/alias/driver.go +++ b/drivers/alias/driver.go @@ -79,21 +79,45 @@ func (d *Alias) Get(ctx context.Context, path string) (model.Obj, error) { if !ok { return nil, errs.ObjectNotFound } + var ret *model.Object + provider := "" for _, dst := range dsts { - obj, err := fs.Get(ctx, stdpath.Join(dst, sub), &fs.GetArgs{NoLog: true}) + rawPath := stdpath.Join(dst, sub) + obj, err := fs.Get(ctx, rawPath, &fs.GetArgs{NoLog: true}) if err != nil { continue } - return &model.Object{ - Path: path, - Name: obj.GetName(), - Size: obj.GetSize(), - Modified: obj.ModTime(), - IsFolder: obj.IsDir(), - HashInfo: obj.GetHash(), + storage, err := fs.GetStorage(rawPath, &fs.GetStoragesArgs{}) + if ret == nil { + ret = &model.Object{ + Path: path, + Name: obj.GetName(), + Size: obj.GetSize(), + Modified: obj.ModTime(), + IsFolder: obj.IsDir(), + HashInfo: obj.GetHash(), + } + if !d.ProviderPassThrough || err != nil { + break + } + provider = storage.Config().Name + } else if err != nil || provider != storage.GetStorage().Driver { + provider = "" + break + } + } + if ret == nil { + return nil, errs.ObjectNotFound + } + if provider != "" { + return &model.ObjectProvider{ + Object: *ret, + Provider: model.Provider{ + Provider: provider, + }, }, nil } - return nil, errs.ObjectNotFound + return ret, nil } func (d *Alias) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) { @@ -186,6 +210,35 @@ func (d *Alias) Link(ctx context.Context, file model.Obj, args model.LinkArgs) ( return nil, errs.ObjectNotFound } +func (d *Alias) Other(ctx context.Context, args model.OtherArgs) (interface{}, error) { + root, sub := d.getRootAndPath(args.Obj.GetPath()) + dsts, ok := d.pathMap[root] + if !ok { + return nil, errs.ObjectNotFound + } + for _, dst := range dsts { + rawPath := stdpath.Join(dst, sub) + storage, actualPath, err := op.GetStorageAndActualPath(rawPath) + if err != nil { + continue + } + other, ok := storage.(driver.Other) + if !ok { + continue + } + obj, err := op.GetUnwrap(ctx, storage, actualPath) + if err != nil { + continue + } + return other.Other(ctx, model.OtherArgs{ + Obj: obj, + Method: args.Method, + Data: args.Data, + }) + } + return nil, errs.NotImplement +} + func (d *Alias) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error { if !d.Writable { return errs.PermissionDenied diff --git a/drivers/alias/meta.go b/drivers/alias/meta.go index 83e8bba0..27c2f8f2 100644 --- a/drivers/alias/meta.go +++ b/drivers/alias/meta.go @@ -15,6 +15,7 @@ type Addition struct { DownloadConcurrency int `json:"download_concurrency" default:"0" required:"false" type:"number" help:"Need to enable proxy"` DownloadPartSize int `json:"download_part_size" default:"0" type:"number" required:"false" help:"Need to enable proxy. Unit: KB"` Writable bool `json:"writable" type:"bool" default:"false"` + ProviderPassThrough bool `json:"provider_pass_through" type:"bool" default:"false"` } var config = driver.Config{ diff --git a/internal/model/obj.go b/internal/model/obj.go index 836904fc..b3bf5ebe 100644 --- a/internal/model/obj.go +++ b/internal/model/obj.go @@ -80,6 +80,10 @@ type SetPath interface { SetPath(path string) } +type ObjWithProvider interface { + GetProvider() string +} + func SortFiles(objs []Obj, orderBy, orderDirection string) { if orderBy == "" { return @@ -166,6 +170,16 @@ func GetUrl(obj Obj) (url string, ok bool) { return url, false } +func GetProvider(obj Obj) (string, bool) { + if obj, ok := obj.(ObjWithProvider); ok { + return obj.GetProvider(), true + } + if unwrap, ok := obj.(ObjUnwrap); ok { + return GetProvider(unwrap.Unwrap()) + } + return "unknown", false +} + func GetRawObject(obj Obj) *Object { switch v := obj.(type) { case *ObjThumbURL: @@ -174,6 +188,8 @@ func GetRawObject(obj Obj) *Object { return &v.Object case *ObjectURL: return &v.Object + case *ObjectProvider: + return &v.Object case *Object: return v } diff --git a/internal/model/object.go b/internal/model/object.go index b6940746..8e5cdf04 100644 --- a/internal/model/object.go +++ b/internal/model/object.go @@ -99,3 +99,16 @@ type ObjThumbURL struct { Thumbnail Url } + +type Provider struct { + Provider string +} + +func (p Provider) GetProvider() string { + return p.Provider +} + +type ObjectProvider struct { + Object + Provider +} diff --git a/server/handles/fsread.go b/server/handles/fsread.go index b9a4f09d..88a9b62b 100644 --- a/server/handles/fsread.go +++ b/server/handles/fsread.go @@ -301,8 +301,8 @@ func FsGet(c *gin.Context, req *FsGetReq, user *model.User) { var rawURL string storage, err := fs.GetStorage(reqPath, &fs.GetStoragesArgs{}) - provider := "unknown" - if err == nil { + provider, ok := model.GetProvider(obj) + if !ok && err == nil { provider = storage.Config().Name } if !obj.IsDir() {