|
package lanzou |
|
|
|
import ( |
|
"context" |
|
"net/http" |
|
|
|
"github.com/alist-org/alist/v3/drivers/base" |
|
"github.com/alist-org/alist/v3/internal/driver" |
|
"github.com/alist-org/alist/v3/internal/errs" |
|
"github.com/alist-org/alist/v3/internal/model" |
|
"github.com/alist-org/alist/v3/pkg/utils" |
|
"github.com/go-resty/resty/v2" |
|
) |
|
|
|
type LanZou struct { |
|
Addition |
|
model.Storage |
|
uid string |
|
vei string |
|
|
|
flag int32 |
|
} |
|
|
|
func (d *LanZou) Config() driver.Config { |
|
return config |
|
} |
|
|
|
func (d *LanZou) GetAddition() driver.Additional { |
|
return &d.Addition |
|
} |
|
|
|
func (d *LanZou) Init(ctx context.Context) (err error) { |
|
if d.UserAgent == "" { |
|
d.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.39 (KHTML, like Gecko) Chrome/89.0.4389.111 Safari/537.39" |
|
} |
|
switch d.Type { |
|
case "account": |
|
_, err := d.Login() |
|
if err != nil { |
|
return err |
|
} |
|
fallthrough |
|
case "cookie": |
|
if d.RootFolderID == "" { |
|
d.RootFolderID = "-1" |
|
} |
|
d.vei, d.uid, err = d.getVeiAndUid() |
|
} |
|
return |
|
} |
|
|
|
func (d *LanZou) Drop(ctx context.Context) error { |
|
d.uid = "" |
|
return nil |
|
} |
|
|
|
|
|
func (d *LanZou) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) { |
|
if d.IsCookie() || d.IsAccount() { |
|
return d.GetAllFiles(dir.GetID()) |
|
} else { |
|
return d.GetFileOrFolderByShareUrl(dir.GetID(), d.SharePassword) |
|
} |
|
} |
|
|
|
func (d *LanZou) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) { |
|
var ( |
|
err error |
|
dfile *FileOrFolderByShareUrl |
|
) |
|
switch file := file.(type) { |
|
case *FileOrFolder: |
|
|
|
sfile := file.GetShareInfo() |
|
if sfile == nil { |
|
sfile, err = d.getFileShareUrlByID(file.GetID()) |
|
if err != nil { |
|
return nil, err |
|
} |
|
file.SetShareInfo(sfile) |
|
} |
|
|
|
|
|
dfile, err = d.GetFilesByShareUrl(sfile.FID, sfile.Pwd) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
if d.RepairFileInfo && !file.repairFlag { |
|
size, time := d.getFileRealInfo(dfile.Url) |
|
if size != nil { |
|
file.size = size |
|
file.repairFlag = true |
|
} |
|
if file.time != nil { |
|
file.time = time |
|
} |
|
} |
|
case *FileOrFolderByShareUrl: |
|
dfile, err = d.GetFilesByShareUrl(file.GetID(), file.Pwd) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
if d.RepairFileInfo && !file.repairFlag { |
|
size, time := d.getFileRealInfo(dfile.Url) |
|
if size != nil { |
|
file.size = size |
|
file.repairFlag = true |
|
} |
|
if file.time != nil { |
|
file.time = time |
|
} |
|
} |
|
} |
|
exp := GetExpirationTime(dfile.Url) |
|
return &model.Link{ |
|
URL: dfile.Url, |
|
Header: http.Header{ |
|
"User-Agent": []string{base.UserAgent}, |
|
}, |
|
Expiration: &exp, |
|
}, nil |
|
} |
|
|
|
func (d *LanZou) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error) { |
|
if d.IsCookie() || d.IsAccount() { |
|
data, err := d.doupload(func(req *resty.Request) { |
|
req.SetContext(ctx) |
|
req.SetFormData(map[string]string{ |
|
"task": "2", |
|
"parent_id": parentDir.GetID(), |
|
"folder_name": dirName, |
|
"folder_description": "", |
|
}) |
|
}, nil) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return &FileOrFolder{ |
|
Name: dirName, |
|
FolID: utils.Json.Get(data, "text").ToString(), |
|
}, nil |
|
} |
|
return nil, errs.NotSupport |
|
} |
|
|
|
func (d *LanZou) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) { |
|
if d.IsCookie() || d.IsAccount() { |
|
if !srcObj.IsDir() { |
|
_, err := d.doupload(func(req *resty.Request) { |
|
req.SetContext(ctx) |
|
req.SetFormData(map[string]string{ |
|
"task": "20", |
|
"folder_id": dstDir.GetID(), |
|
"file_id": srcObj.GetID(), |
|
}) |
|
}, nil) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return srcObj, nil |
|
} |
|
} |
|
return nil, errs.NotSupport |
|
} |
|
|
|
func (d *LanZou) Rename(ctx context.Context, srcObj model.Obj, newName string) (model.Obj, error) { |
|
if d.IsCookie() || d.IsAccount() { |
|
if !srcObj.IsDir() { |
|
_, err := d.doupload(func(req *resty.Request) { |
|
req.SetContext(ctx) |
|
req.SetFormData(map[string]string{ |
|
"task": "46", |
|
"file_id": srcObj.GetID(), |
|
"file_name": newName, |
|
"type": "2", |
|
}) |
|
}, nil) |
|
if err != nil { |
|
return nil, err |
|
} |
|
srcObj.(*FileOrFolder).NameAll = newName |
|
return srcObj, nil |
|
} |
|
} |
|
return nil, errs.NotSupport |
|
} |
|
|
|
func (d *LanZou) Remove(ctx context.Context, obj model.Obj) error { |
|
if d.IsCookie() || d.IsAccount() { |
|
_, err := d.doupload(func(req *resty.Request) { |
|
req.SetContext(ctx) |
|
if obj.IsDir() { |
|
req.SetFormData(map[string]string{ |
|
"task": "3", |
|
"folder_id": obj.GetID(), |
|
}) |
|
} else { |
|
req.SetFormData(map[string]string{ |
|
"task": "6", |
|
"file_id": obj.GetID(), |
|
}) |
|
} |
|
}, nil) |
|
return err |
|
} |
|
return errs.NotSupport |
|
} |
|
|
|
func (d *LanZou) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) (model.Obj, error) { |
|
if d.IsCookie() || d.IsAccount() { |
|
var resp RespText[[]FileOrFolder] |
|
_, err := d._post(d.BaseUrl+"/html5up.php", func(req *resty.Request) { |
|
req.SetFormData(map[string]string{ |
|
"task": "1", |
|
"vie": "2", |
|
"ve": "2", |
|
"id": "WU_FILE_0", |
|
"name": stream.GetName(), |
|
"folder_id_bb_n": dstDir.GetID(), |
|
}).SetFileReader("upload_file", stream.GetName(), stream).SetContext(ctx) |
|
}, &resp, true) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return &resp.Text[0], nil |
|
} |
|
return nil, errs.NotSupport |
|
} |
|
|