feat: add lanzou driver
This commit is contained in:
171
drivers/lanzou/driver.go
Normal file
171
drivers/lanzou/driver.go
Normal file
@ -0,0 +1,171 @@
|
||||
package lanzou
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"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"
|
||||
)
|
||||
|
||||
var upClient = base.NewRestyClient().SetTimeout(120 * time.Second)
|
||||
|
||||
type LanZou struct {
|
||||
Addition
|
||||
model.Storage
|
||||
}
|
||||
|
||||
func (d *LanZou) Config() driver.Config {
|
||||
return config
|
||||
}
|
||||
|
||||
func (d *LanZou) GetAddition() driver.Additional {
|
||||
return d.Addition
|
||||
}
|
||||
|
||||
func (d *LanZou) Init(ctx context.Context, storage model.Storage) error {
|
||||
d.Storage = storage
|
||||
err := utils.Json.UnmarshalFromString(d.Storage.Addition, &d.Addition)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if d.IsCookie() {
|
||||
if d.RootFolderID == "" {
|
||||
d.RootFolderID = "-1"
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *LanZou) Drop(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 获取的大小和时间不准确
|
||||
func (d *LanZou) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
|
||||
if d.IsCookie() {
|
||||
return d.GetFiles(ctx, dir.GetID())
|
||||
} else {
|
||||
return d.GetFileOrFolderByShareUrl(ctx, dir.GetID(), d.SharePassword)
|
||||
}
|
||||
}
|
||||
|
||||
func (d *LanZou) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
|
||||
downID := file.GetID()
|
||||
pwd := d.SharePassword
|
||||
if d.IsCookie() {
|
||||
share, err := d.getFileShareUrlByID(ctx, file.GetID())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
downID = share.FID
|
||||
pwd = share.Pwd
|
||||
}
|
||||
fileInfo, err := d.getFilesByShareUrl(ctx, downID, pwd, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &model.Link{
|
||||
URL: fileInfo.Url,
|
||||
Header: http.Header{
|
||||
"User-Agent": []string{base.UserAgent},
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (d *LanZou) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
|
||||
if d.IsCookie() {
|
||||
_, err := d.post(d.BaseUrl+"/doupload.php", func(req *resty.Request) {
|
||||
req.SetContext(ctx)
|
||||
req.SetFormData(map[string]string{
|
||||
"task": "2",
|
||||
"parent_id": parentDir.GetID(),
|
||||
"folder_name": dirName,
|
||||
"folder_description": "",
|
||||
})
|
||||
}, nil)
|
||||
return err
|
||||
}
|
||||
return errs.NotImplement
|
||||
}
|
||||
|
||||
func (d *LanZou) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
|
||||
if d.IsCookie() {
|
||||
if !srcObj.IsDir() {
|
||||
_, err := d.post(d.BaseUrl+"/doupload.php", func(req *resty.Request) {
|
||||
req.SetContext(ctx)
|
||||
req.SetFormData(map[string]string{
|
||||
"task": "20",
|
||||
"folder_id": dstDir.GetID(),
|
||||
"file_id": srcObj.GetID(),
|
||||
})
|
||||
}, nil)
|
||||
return err
|
||||
}
|
||||
}
|
||||
return errs.NotImplement
|
||||
}
|
||||
|
||||
func (d *LanZou) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
|
||||
if d.IsCookie() {
|
||||
if !srcObj.IsDir() {
|
||||
_, err := d.post(d.BaseUrl+"/doupload.php", func(req *resty.Request) {
|
||||
req.SetContext(ctx)
|
||||
req.SetFormData(map[string]string{
|
||||
"task": "46",
|
||||
"file_id": srcObj.GetID(),
|
||||
"file_name": newName,
|
||||
"type": "2",
|
||||
})
|
||||
}, nil)
|
||||
return err
|
||||
}
|
||||
}
|
||||
return errs.NotImplement
|
||||
}
|
||||
|
||||
func (d *LanZou) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
|
||||
return errs.NotImplement
|
||||
}
|
||||
|
||||
func (d *LanZou) Remove(ctx context.Context, obj model.Obj) error {
|
||||
if d.IsCookie() {
|
||||
_, err := d.post(d.BaseUrl+"/doupload.php", 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.NotImplement
|
||||
}
|
||||
|
||||
func (d *LanZou) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error {
|
||||
if d.IsCookie() {
|
||||
_, err := d._post(d.BaseUrl+"/fileup.php", func(req *resty.Request) {
|
||||
req.SetFormData(map[string]string{
|
||||
"task": "1",
|
||||
"id": "WU_FILE_0",
|
||||
"name": stream.GetName(),
|
||||
"folder_id": dstDir.GetID(),
|
||||
}).SetFileReader("upload_file", stream.GetName(), stream)
|
||||
}, nil, true)
|
||||
return err
|
||||
}
|
||||
return errs.NotImplement
|
||||
}
|
Reference in New Issue
Block a user