|
package tool |
|
|
|
import ( |
|
"context" |
|
"path/filepath" |
|
|
|
"github.com/alist-org/alist/v3/internal/conf" |
|
"github.com/alist-org/alist/v3/internal/errs" |
|
"github.com/alist-org/alist/v3/internal/model" |
|
"github.com/alist-org/alist/v3/internal/op" |
|
"github.com/alist-org/alist/v3/pkg/tache" |
|
"github.com/google/uuid" |
|
"github.com/pkg/errors" |
|
) |
|
|
|
type DeletePolicy string |
|
|
|
const ( |
|
DeleteOnUploadSucceed DeletePolicy = "delete_on_upload_succeed" |
|
DeleteOnUploadFailed DeletePolicy = "delete_on_upload_failed" |
|
DeleteNever DeletePolicy = "delete_never" |
|
DeleteAlways DeletePolicy = "delete_always" |
|
) |
|
|
|
type AddURLArgs struct { |
|
URL string |
|
DstDirPath string |
|
Tool string |
|
DeletePolicy DeletePolicy |
|
} |
|
|
|
func AddURL(ctx context.Context, args *AddURLArgs) (tache.TaskWithInfo, error) { |
|
|
|
tool, err := Tools.Get(args.Tool) |
|
|
|
if err != nil { |
|
return nil, errors.Wrapf(err, "failed get tool") |
|
} |
|
|
|
if !tool.IsReady() { |
|
|
|
if _, err := tool.Init(); err != nil { |
|
return nil, errors.Wrapf(err, "failed init tool %s", args.Tool) |
|
} |
|
} |
|
|
|
storage, dstDirActualPath, err := op.GetStorageAndActualPath(args.DstDirPath) |
|
if err != nil { |
|
return nil, errors.WithMessage(err, "failed get storage") |
|
} |
|
|
|
if storage.Config().NoUpload { |
|
return nil, errors.WithStack(errs.UploadNotSupported) |
|
} |
|
|
|
obj, err := op.Get(ctx, storage, dstDirActualPath) |
|
if err != nil { |
|
if !errs.IsObjectNotFound(err) { |
|
return nil, errors.WithMessage(err, "failed get object") |
|
} |
|
} else { |
|
if !obj.IsDir() { |
|
|
|
return nil, errors.WithStack(errs.NotFolder) |
|
} |
|
} |
|
|
|
uid := uuid.NewString() |
|
tempDir := filepath.Join(conf.Conf.TempDir, args.Tool, uid) |
|
t := &DownloadTask{ |
|
Url: args.URL, |
|
DstDirPath: args.DstDirPath, |
|
TempDir: tempDir, |
|
DeletePolicy: args.DeletePolicy, |
|
tool: tool, |
|
} |
|
if tool.Name() == "storage" { |
|
args := model.FsOtherArgs{ |
|
Path: args.DstDirPath, |
|
Method: "offline", |
|
Data: args.URL, |
|
} |
|
_, err := op.Offline(ctx, obj, storage, args) |
|
if err != nil { |
|
return nil, errors.WithMessage(err, "failed add task") |
|
} |
|
} else { |
|
DownloadTaskManager.Add(t) |
|
} |
|
return t, nil |
|
|
|
} |
|
|