Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions drivers/139_grouplink/driver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package _139_grouplink

import (
"context"
"errors"
"fmt"
"sync/atomic"
_139 "github.com/OpenListTeam/OpenList/v4/drivers/139"
"github.com/OpenListTeam/OpenList/v4/internal/driver"
"github.com/OpenListTeam/OpenList/v4/internal/model"
"github.com/OpenListTeam/OpenList/v4/internal/op"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
log "github.com/sirupsen/logrus"
"time"
)

var _ driver.Driver = (*Yun139GroupLink)(nil)

func (d *Yun139GroupLink) Init(ctx context.Context) error {
return nil
}

func (d *Yun139GroupLink) Drop(ctx context.Context) error {
return nil
}

func (d *Yun139GroupLink) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
files, err := d.list(dir.GetID())
if err != nil {
log.Warnf("获取文件列表失败: %v", err)
return nil, err
}

return utils.SliceConvert(files, func(src File) (model.Obj, error) {
return src, nil
})
}

func (d *Yun139GroupLink) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
f, ok := file.(File)
if !ok {
return nil, errors.New("文件格式错误")
}

if f.URL != "" {
exp := 15 * time.Minute
return &model.Link{
URL: f.URL,
Expiration: &exp,
Concurrency: 5,
PartSize: 10 * utils.MB,
}, nil
}

count := op.GetDriverCount("139Yun")
if count == 0 {
return nil, errors.New("未配置139Yun账号,无法获取高速下载链接")
}

var lastErr error
for i := 0; i < count; i++ {
link, err := d.myLink(ctx, f)
if err == nil {
return link, nil
}
lastErr = err
atomic.AddInt32(&idx, 1)
}
return nil, fmt.Errorf("所有%d个139Yun账号均获取直链失败:%v", count, lastErr)
}

func (d *Yun139GroupLink) myLink(ctx context.Context, f File) (*model.Link, error) {
driverIdx := int(atomic.LoadInt32(&idx) % int32(op.GetDriverCount("139Yun")))
storage := op.GetFirstDriver("139Yun", driverIdx)
if storage == nil {
return nil, errors.New("找不到139云盘账号")
}
yun139 := storage.(*_139.Yun139)
log.Infof("[139Yun-%d] 为grouplink文件获取高速直链:%s(ID:%s)", yun139.ID, f.Name, f.ID)
url, err := d.getDownloadUrl(f.ID)
if err != nil {
return nil, err
}

exp := 15 * time.Minute
return &model.Link{
URL: url + fmt.Sprintf("#storageId=%d", yun139.ID),
Expiration: &exp,
Concurrency: yun139.Concurrency,
PartSize: yun139.ChunkSize,
}, nil
}
42 changes: 42 additions & 0 deletions drivers/139_grouplink/meta.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package _139_grouplink

import (
"github.com/OpenListTeam/OpenList/v4/internal/driver"
"github.com/OpenListTeam/OpenList/v4/internal/model"
"github.com/OpenListTeam/OpenList/v4/internal/op"
)

type Addition struct {
ShareId string `json:"shareId" required:"true"`
SharePwd string `json:"sharePwd" required:"true"`
RootID string `json:"rootId" default:"root"`
}

var config = driver.Config{
Name: "139GroupLink",
NoUpload: true,
NoOverwriteUpload: true,
DefaultRoot: "root",
}

type Yun139GroupLink struct {
Storage model.Storage
Addition
UserDomainId string
}

func (d *Yun139GroupLink) GetAddition() driver.Additional { return &d.Addition }
func (d *Yun139GroupLink) Config() driver.Config { return config }
func (d *Yun139GroupLink) GetStorage() *model.Storage { return &d.Storage }
func (d *Yun139GroupLink) SetStorage(s model.Storage) { d.Storage = s }
func (d *Yun139GroupLink) GetRootId() string { return d.RootID }

func (d *Yun139GroupLink) GetDownloadUrl(fileId string) (string, error) {
return d.getDownloadUrl(fileId)
}

func init() {
op.RegisterDriver(func() driver.Driver {
return &Yun139GroupLink{}
})
}
116 changes: 116 additions & 0 deletions drivers/139_grouplink/types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package _139_grouplink

import (
"time"

"github.com/OpenListTeam/OpenList/v4/pkg/utils"
)

type GetOutLinkInfoReq struct {
LinkId string `json:"linkId"`
Passwd string `json:"passwd"`
CaSrt int `json:"caSrt"`
CoSrt int `json:"coSrt"`
SrtDr int `json:"srtDr"`
PageNum int `json:"pageNum"`
PCaId string `json:"pCaId"`
PageSize int `json:"pageSize"`
NextPageCursor interface{} `json:"nextPageCursor"`
}

type GetOutLinkInfoResp struct {
Success bool `json:"success"`
Code string `json:"code"`
Message string `json:"message"`
Data struct {
NodNum interface{} `json:"nodNum"`
AssetsList []Assets `json:"assetsList"`
IsCreator string `json:"isCreator"`
OutLink OutLink `json:"outLink"`
NextPageCursor interface{} `json:"nextPageCursor"`
PcaId string `json:"pCaId"`
} `json:"data"`
}

type Assets struct {
AssetsId string `json:"assetsId"`
AssetsName string `json:"assetsName"`
Category int `json:"category"`
CoType int `json:"coType"`
CoSuffix string `json:"coSuffix"`
CoSize int64 `json:"coSize"`
UdTime string `json:"udTime"`
ThumbnailURL string `json:"thumbnailURL"`
BthumbnailURL string `json:"bthumbnailURL"`
PresentURL string `json:"presentURL"`
Path string `json:"path"`
IsDir bool `json:"-"`
Time time.Time `json:"-"`
}

type OutLink struct {
LinkId string `json:"linkId"`
LinkCode string `json:"linkCode"`
ChannelId string `json:"channelId"`
Passwd string `json:"passwd"`
Url string `json:"url"`
LkName string `json:"lkName"`
CtTime string `json:"ctTime"`
LastUdTime string `json:"lastUdTime"`
OwnerUserId string `json:"ownerUserId"`
}

type File struct {
Name string
Path string
Size int64
ID string
IsDirFlag bool
Time time.Time
URL string
}

func (f File) GetID() string {
return f.ID
}

func (f File) GetName() string {
return f.Name
}

func (f File) GetSize() int64 {
return f.Size
}

func (f File) GetPath() string {
return f.Path
}

func (f File) IsDir() bool {
return f.IsDirFlag
}

func (f File) ModTime() time.Time {
return f.Time
}

func (f File) CreateTime() time.Time {
return f.Time
}

func (f File) GetHash() utils.HashInfo {
return utils.HashInfo{}
}

func fileToObj(src Assets) File {
parsedTime, _ := time.Parse("20060102150405", src.UdTime)
return File{
ID: src.AssetsId,
Name: src.AssetsName,
Size: src.CoSize,
Path: src.Path,
IsDirFlag: false,
Time: parsedTime,
URL: "",
}
}
Loading