alist/drivers/wps/driver.go
2025-12-12 01:39:33 +08:00

140 lines
3.1 KiB
Go

package wps
import (
"context"
"fmt"
"net/http"
"github.com/alist-org/alist/v3/internal/driver"
"github.com/alist-org/alist/v3/internal/errs"
"github.com/alist-org/alist/v3/internal/model"
)
type Wps struct {
model.Storage
Addition
companyID string
}
func (d *Wps) Config() driver.Config {
return config
}
func (d *Wps) GetAddition() driver.Additional {
return &d.Addition
}
func (d *Wps) Init(ctx context.Context) error {
if d.Cookie == "" {
return fmt.Errorf("cookie is empty")
}
return d.ensureCompanyID(ctx)
}
func (d *Wps) Drop(ctx context.Context) error {
return nil
}
func (d *Wps) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
basePath := "/"
if dir != nil {
if p := dir.GetPath(); p != "" {
basePath = p
}
}
node, err := d.resolvePath(ctx, basePath)
if err != nil {
return nil, err
}
if node.kind == "root" {
groups, err := d.getGroups(ctx)
if err != nil {
return nil, err
}
res := make([]model.Obj, 0, len(groups))
for _, g := range groups {
path := joinPath(basePath, g.Name)
obj := &Obj{
id: path,
name: g.Name,
ctime: parseTime(0),
mtime: parseTime(0),
isDir: true,
path: path,
}
res = append(res, obj)
}
return res, nil
}
if node.kind != "group" && node.kind != "folder" {
return nil, nil
}
parentID := int64(0)
if node.file != nil && node.kind == "folder" {
parentID = node.file.ID
}
files, err := d.getFiles(ctx, node.group.GroupID, parentID)
if err != nil {
return nil, err
}
res := make([]model.Obj, 0, len(files))
for _, f := range files {
res = append(res, fileToObj(basePath, f))
}
return res, nil
}
func (d *Wps) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
path := file.GetPath()
node, err := d.resolvePath(ctx, path)
if err != nil {
return nil, err
}
if node.kind != "file" || node.file == nil {
return nil, errs.NotSupport
}
if node.file.FilePerms.Download == 0 {
return nil, fmt.Errorf("no download permission")
}
url := fmt.Sprintf("%s/3rd/drive/api/v5/groups/%d/files/%d/download?support_checksums=sha1", endpoint, node.group.GroupID, node.file.ID)
var resp downloadResp
_, err = d.request(ctx).SetResult(&resp).Get(url)
if err != nil {
return nil, err
}
if resp.URL == "" {
return nil, fmt.Errorf("empty download url")
}
link := &model.Link{
URL: resp.URL,
Header: http.Header{},
}
return link, nil
}
func (d *Wps) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
return errs.NotSupport
}
func (d *Wps) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
return errs.NotSupport
}
func (d *Wps) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
return errs.NotSupport
}
func (d *Wps) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
return errs.NotSupport
}
func (d *Wps) Remove(ctx context.Context, obj model.Obj) error {
return errs.NotSupport
}
func (d *Wps) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error {
return errs.NotSupport
}
var _ driver.Driver = (*Wps)(nil)