mirror of https://github.com/Xhofe/alist
231 lines
5.4 KiB
Go
231 lines
5.4 KiB
Go
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
|
|
}
|