Skip to content
Merged
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
28 changes: 28 additions & 0 deletions drivers/quark_uc_share/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ import (
"context"
"errors"
"fmt"

quark "github.com/OpenListTeam/OpenList/v4/drivers/quark_uc"
"github.com/OpenListTeam/OpenList/v4/drivers/quark_uc_tv"
"github.com/OpenListTeam/OpenList/v4/internal/conf"
"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/internal/setting"
"github.com/OpenListTeam/OpenList/v4/internal/token"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
log "github.com/sirupsen/logrus"
Expand Down Expand Up @@ -86,6 +89,31 @@ func (d *QuarkUCShare) Link(ctx context.Context, file model.Obj, args model.Link
}

func (d *QuarkUCShare) link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
if setting.GetBool(conf.UssQuarkTv) {
var tvName string
if d.config.Name == "UCShare" {
tvName = "UCTV"
} else {
tvName = "QuarkTV"
}
storage := op.GetFirstDriver(tvName, idx)
if storage != nil {
uc := storage.(*quark_uc_tv.QuarkUCTV)
Cookie = uc.Cookie
log.Infof("[%v] 获取%s文件直链 %v %v %v", uc.ID, tvName, file.GetName(), file.GetID(), file.GetSize())
newFile, err := d.saveTvFile(ctx, uc, file.GetID())
if err != nil {
return nil, err
}

link, err := d.getTvDownloadUrl(ctx, uc, newFile, args)
if link != nil {
link.URL = link.URL + "#proxy=0"
}
return link, err
}
}

name := d.getDriverName()
storage := op.GetFirstDriver(name, idx)
idx++
Expand Down
115 changes: 110 additions & 5 deletions drivers/quark_uc_share/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,20 @@ package quark_uc_share
import (
"context"
"errors"
"math/rand"
"net/http"
"strconv"
"strings"
"time"

quark "github.com/OpenListTeam/OpenList/v4/drivers/quark_uc"
"github.com/OpenListTeam/OpenList/v4/drivers/quark_uc_tv"
"github.com/OpenListTeam/OpenList/v4/internal/conf"
"github.com/OpenListTeam/OpenList/v4/internal/model"
"github.com/OpenListTeam/OpenList/v4/internal/op"
"github.com/OpenListTeam/OpenList/v4/internal/setting"
"github.com/OpenListTeam/OpenList/v4/pkg/cookie"
"github.com/go-resty/resty/v2"
"math/rand"
"net/http"
"strconv"
"strings"
"time"

"github.com/OpenListTeam/OpenList/v4/drivers/base"
log "github.com/sirupsen/logrus"
Expand Down Expand Up @@ -194,6 +196,69 @@ func (d *QuarkUCShare) saveFile(quark *quark.QuarkOrUC, id string) (model.Obj, e
return nil, errors.New("save file failed")
}

func (d *QuarkUCShare) saveTvFile(ctx context.Context, quark *quark_uc_tv.QuarkUCTV, id string) (model.Obj, error) {
s := strings.Split(id, "-")
fileId := s[0]
fileTokenId := s[1]
pid := s[2]
for range 2 {
data := base.Json{
"fid_list": []string{fileId},
"fid_token_list": []string{fileTokenId},
"exclude_fids": []string{},
"to_pdir_fid": quark.TempDirId,
"pwd_id": d.ShareId,
"stoken": d.ShareToken,
"pdir_fid": "0",
"pdir_save_all": false,
"scene": "link",
}
query := map[string]string{
"pr": d.conf.pr,
"fr": "pc",
"uc_param_str": "",
"__dt": strconv.Itoa(rand.Int()),
"__t": strconv.FormatInt(time.Now().Unix(), 10),
}
var resp SaveResp
res, err := d.request("/share/sharepage/save", http.MethodPost, func(req *resty.Request) {
req.SetBody(data).SetQueryParams(query)
}, &resp)
log.Debugf("saveFile: %v %+v response: %v, error: %v", id, data, string(res), err)
if err != nil {
if strings.Contains(err.Error(), "token校验异常") {
fileTokenId, err = d.getFileToken(pid, fileId)
if err != nil {
return nil, err
}
continue
} else {
log.Warnf("save file failed: %v", err)
return nil, err
}
}
if resp.Status != 200 {
return nil, errors.New(resp.Message)
}
taskId := resp.Data.TaskId
log.Debugf("save file task id: %v", taskId)

newFileId, dirId, err := d.getSaveTaskResult(taskId)
if err != nil {
return nil, err
}
log.Debugf("new file id: %v dirId: %v", newFileId, dirId)
file, err := quark.GetTempFile(ctx, dirId, newFileId)
if err != nil {
log.Warnf("get temp file failed: %v", err)
return nil, err
}
log.Debugf("new file: %+v", file)
return file, nil
}
return nil, errors.New("save file failed")
}

func (d *QuarkUCShare) getSaveTaskResult(taskId string) (string, string, error) {
time.Sleep(200 * time.Millisecond)
for retry := 1; retry <= 60; {
Expand Down Expand Up @@ -232,6 +297,11 @@ func (d *QuarkUCShare) getDownloadUrl(ctx context.Context, quark *quark.QuarkOrU
return quark.Link(ctx, file, args)
}

func (d *QuarkUCShare) getTvDownloadUrl(ctx context.Context, quark *quark_uc_tv.QuarkUCTV, file model.Obj, args model.LinkArgs) (*model.Link, error) {
go d.deleteDelayTv(ctx, quark, file.GetID())
return quark.Link(ctx, file, args)
}

func (d *QuarkUCShare) deleteDelay(quark *quark.QuarkOrUC, fileId string) {
delayTime := setting.GetInt(conf.DeleteDelayTime, 900)
if delayTime == 0 {
Expand All @@ -247,6 +317,21 @@ func (d *QuarkUCShare) deleteDelay(quark *quark.QuarkOrUC, fileId string) {
d.deleteFile(quark, fileId)
}

func (d *QuarkUCShare) deleteDelayTv(ctx context.Context, quark *quark_uc_tv.QuarkUCTV, fileId string) {
delayTime := setting.GetInt(conf.DeleteDelayTime, 900)
if delayTime == 0 {
return
}
if delayTime < 5 {
delayTime = 5
}

name := d.getDriverName()
log.Infof("[%v] Delete %s temp file %v after %v seconds.", quark.ID, name, fileId, delayTime)
time.Sleep(time.Duration(delayTime) * time.Second)
d.deleteFileTv(ctx, quark, fileId)
}

func (d *QuarkUCShare) deleteFile(quark *quark.QuarkOrUC, fileId string) {
name := d.getDriverName()
log.Infof("[%v] Delete %s temp file: %v", quark.ID, name, fileId)
Expand All @@ -267,6 +352,26 @@ func (d *QuarkUCShare) deleteFile(quark *quark.QuarkOrUC, fileId string) {
}
}

func (d *QuarkUCShare) deleteFileTv(ctx context.Context, quark *quark_uc_tv.QuarkUCTV, fileId string) {
name := d.getDriverName()
log.Infof("[%v] Delete %s temp file: %v", quark.ID, name, fileId)
data := base.Json{
"action_type": 1,
"exclude_fids": []string{},
"filelist": []string{fileId},
}
var resp PlayResp
res, err := quark.Request(ctx, "/file/delete", http.MethodPost, func(req *resty.Request) {
req.SetBody(data)
}, &resp)
log.Debugf("[%v] Delete %s temp file: %v %v", quark.ID, name, fileId, string(res))
if err != nil {
log.Warnf("[%v] Delete %s temp file failed: %v %v", quark.ID, name, fileId, err)
} else if resp.Status != 200 {
log.Warnf("[%v] Delete %s temp file failed: %v %v", quark.ID, name, fileId, resp.Message)
}
}

func (d *QuarkUCShare) getShareFiles(id string) ([]File, error) {
log.Debugf("getShareFiles: %v", id)
s := strings.Split(id, "-")
Expand Down
3 changes: 3 additions & 0 deletions drivers/quark_uc_tv/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ type QuarkUCTV struct {
Addition
config driver.Config
conf Conf

TempDirId string
}

func (d *QuarkUCTV) Config() driver.Config {
Expand Down Expand Up @@ -84,6 +86,7 @@ func (d *QuarkUCTV) Init(ctx context.Context) error {
if err != nil {
return err
}
d.getTempFolder(ctx)
return nil
}

Expand Down
Loading