From e8d45398d6563eda3efc1f3decae27ff7390ccca Mon Sep 17 00:00:00 2001 From: Dgs <47767754+dgscyg@users.noreply.github.com> Date: Thu, 17 Jul 2025 14:24:16 +0800 Subject: [PATCH] feat(quark_uc_tv): add streaming link api (#728) --- drivers/quark_uc_tv/driver.go | 22 ++++------------- drivers/quark_uc_tv/meta.go | 8 ++++--- drivers/quark_uc_tv/types.go | 27 ++++++++++++++++++++- drivers/quark_uc_tv/util.go | 45 +++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 21 deletions(-) diff --git a/drivers/quark_uc_tv/driver.go b/drivers/quark_uc_tv/driver.go index 83f2b50d..f611fc98 100644 --- a/drivers/quark_uc_tv/driver.go +++ b/drivers/quark_uc_tv/driver.go @@ -126,25 +126,13 @@ func (d *QuarkUCTV) List(ctx context.Context, dir model.Obj, args model.ListArgs } func (d *QuarkUCTV) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) { - var fileLink FileLink - _, err := d.request(ctx, "/file", "GET", func(req *resty.Request) { - req.SetQueryParams(map[string]string{ - "method": "download", - "group_by": "source", - "fid": file.GetID(), - "resolution": "low,normal,high,super,2k,4k", - "support": "dolby_vision", - }) - }, &fileLink) - if err != nil { - return nil, err + f := file.(*Files) + + if d.Addition.VideoLinkMethod == "streaming" && f.Category == 1 && f.Size > 0 { + return d.getTranscodingLink(ctx, file) } - return &model.Link{ - URL: fileLink.Data.DownloadURL, - Concurrency: 3, - PartSize: 10 * utils.MB, - }, nil + return d.getDownloadLink(ctx, file) } func (d *QuarkUCTV) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error) { diff --git a/drivers/quark_uc_tv/meta.go b/drivers/quark_uc_tv/meta.go index f8b3d4ce..558d121a 100644 --- a/drivers/quark_uc_tv/meta.go +++ b/drivers/quark_uc_tv/meta.go @@ -14,6 +14,8 @@ type Addition struct { DeviceID string `json:"device_id" required:"false" default:""` // 登陆所用的数据 无需手动填写 QueryToken string `json:"query_token" required:"false" default:"" help:"don't edit'"` + // 视频文件链接获取方式 download(可获取源视频) or streaming(获取转码后的视频) + VideoLinkMethod string `json:"link_method" required:"true" type:"select" options:"download,streaming" default:"download"` } type Conf struct { @@ -38,8 +40,8 @@ func init() { api: "https://open-api-drive.quark.cn", clientID: "d3194e61504e493eb6222857bccfed94", signKey: "kw2dvtd7p4t3pjl2d9ed9yc8yej8kw2d", - appVer: "1.5.6", - channel: "CP", + appVer: "1.8.2.2", + channel: "GENERAL", codeApi: "http://api.extscreen.com/quarkdrive", }, } @@ -56,7 +58,7 @@ func init() { api: "https://open-api-drive.uc.cn", clientID: "5acf882d27b74502b7040b0c65519aa7", signKey: "l3srvtd7p42l0d0x1u8d7yc8ye9kki4d", - appVer: "1.6.5", + appVer: "1.7.2.2", channel: "UCTVOFFICIALWEB", codeApi: "http://api.extscreen.com/ucdrive", }, diff --git a/drivers/quark_uc_tv/types.go b/drivers/quark_uc_tv/types.go index 64abedc7..b8e04f18 100644 --- a/drivers/quark_uc_tv/types.go +++ b/drivers/quark_uc_tv/types.go @@ -92,7 +92,32 @@ type FilesData struct { } `json:"data"` } -type FileLink struct { +type StreamingFileLink struct { + CommonRsp + Data struct { + DefaultResolution string `json:"default_resolution"` + LastPlayTime int `json:"last_play_time"` + VideoInfo []struct { + Resolution string `json:"resolution"` + Accessable int `json:"accessable"` + TransStatus string `json:"trans_status"` + Duration int `json:"duration,omitempty"` + Size int64 `json:"size,omitempty"` + Format string `json:"format,omitempty"` + Width int `json:"width,omitempty"` + Height int `json:"height,omitempty"` + URL string `json:"url,omitempty"` + Bitrate float64 `json:"bitrate,omitempty"` + DolbyVision struct { + Profile int `json:"profile"` + Level int `json:"level"` + } `json:"dolby_vision,omitempty"` + } `json:"video_info"` + AudioInfo []interface{} `json:"audio_info"` + } `json:"data"` +} + +type DownloadFileLink struct { CommonRsp Data struct { Fid string `json:"fid"` diff --git a/drivers/quark_uc_tv/util.go b/drivers/quark_uc_tv/util.go index f5a18f29..5fbab984 100644 --- a/drivers/quark_uc_tv/util.go +++ b/drivers/quark_uc_tv/util.go @@ -6,6 +6,7 @@ import ( "crypto/sha256" "encoding/hex" "errors" + "github.com/OpenListTeam/OpenList/v4/internal/model" "net/http" "strconv" "time" @@ -210,3 +211,47 @@ func (d *QuarkUCTV) generateReqSign(method string, pathname string, key string) return timestamp, xPanTokenHex, reqIDHex } + +func (d *QuarkUCTV) getTranscodingLink(ctx context.Context, file model.Obj) (*model.Link, error) { + var fileLink StreamingFileLink + _, err := d.request(ctx, "/file", "GET", func(req *resty.Request) { + req.SetQueryParams(map[string]string{ + "method": "streaming", + "group_by": "source", + "fid": file.GetID(), + "resolution": "low,normal,high,super,2k,4k", + "support": "dolby_vision", + }) + }, &fileLink) + if err != nil { + return nil, err + } + + return &model.Link{ + URL: fileLink.Data.VideoInfo[0].URL, + Concurrency: 3, + PartSize: 10 * utils.MB, + }, nil +} + +func (d *QuarkUCTV) getDownloadLink(ctx context.Context, file model.Obj) (*model.Link, error) { + var fileLink DownloadFileLink + _, err := d.request(ctx, "/file", "GET", func(req *resty.Request) { + req.SetQueryParams(map[string]string{ + "method": "download", + "group_by": "source", + "fid": file.GetID(), + "resolution": "low,normal,high,super,2k,4k", + "support": "dolby_vision", + }) + }, &fileLink) + if err != nil { + return nil, err + } + + return &model.Link{ + URL: fileLink.Data.DownloadURL, + Concurrency: 3, + PartSize: 10 * utils.MB, + }, nil +}