From b2b91a92814487f52125d17691963bd19bfb6713 Mon Sep 17 00:00:00 2001 From: MadDogOwner Date: Sun, 27 Apr 2025 20:00:25 +0800 Subject: [PATCH] feat(doubao): add get_download_info API and download_api option (#8428) --- drivers/doubao/driver.go | 64 +++++++++++++++++++++++++--------------- drivers/doubao/meta.go | 1 + drivers/doubao/types.go | 14 ++++++++- 3 files changed, 55 insertions(+), 24 deletions(-) diff --git a/drivers/doubao/driver.go b/drivers/doubao/driver.go index a066feee..0d421946 100644 --- a/drivers/doubao/driver.go +++ b/drivers/doubao/driver.go @@ -3,6 +3,11 @@ package doubao import ( "context" "errors" + "net/http" + "strconv" + "strings" + "time" + "github.com/alist-org/alist/v3/drivers/base" "github.com/alist-org/alist/v3/internal/driver" "github.com/alist-org/alist/v3/internal/errs" @@ -10,10 +15,6 @@ import ( "github.com/alist-org/alist/v3/pkg/utils" "github.com/go-resty/resty/v2" "github.com/google/uuid" - "net/http" - "strconv" - "strings" - "time" ) type Doubao struct { @@ -97,33 +98,50 @@ func (d *Doubao) Link(ctx context.Context, file model.Obj, args model.LinkArgs) var downloadUrl string if u, ok := file.(*Object); ok { - switch u.NodeType { - case VideoType, AudioType: - var r GetVideoFileUrlResp - _, err := d.request("/samantha/media/get_play_info", http.MethodPost, func(req *resty.Request) { + switch d.DownloadApi { + case "get_download_info": + var r GetDownloadInfoResp + _, err := d.request("/samantha/aispace/get_download_info", http.MethodPost, func(req *resty.Request) { req.SetBody(base.Json{ - "key": u.Key, - "node_id": file.GetID(), + "requests": []base.Json{{"node_id": file.GetID()}}, }) }, &r) if err != nil { return nil, err } - downloadUrl = r.Data.OriginalMediaInfo.MainURL + downloadUrl = r.Data.DownloadInfos[0].MainURL + case "get_file_url": + switch u.NodeType { + case VideoType, AudioType: + var r GetVideoFileUrlResp + _, err := d.request("/samantha/media/get_play_info", http.MethodPost, func(req *resty.Request) { + req.SetBody(base.Json{ + "key": u.Key, + "node_id": file.GetID(), + }) + }, &r) + if err != nil { + return nil, err + } + + downloadUrl = r.Data.OriginalMediaInfo.MainURL + default: + var r GetFileUrlResp + _, err := d.request("/alice/message/get_file_url", http.MethodPost, func(req *resty.Request) { + req.SetBody(base.Json{ + "uris": []string{u.Key}, + "type": FileNodeType[u.NodeType], + }) + }, &r) + if err != nil { + return nil, err + } + + downloadUrl = r.Data.FileUrls[0].MainURL + } default: - var r GetFileUrlResp - _, err := d.request("/alice/message/get_file_url", http.MethodPost, func(req *resty.Request) { - req.SetBody(base.Json{ - "uris": []string{u.Key}, - "type": FileNodeType[u.NodeType], - }) - }, &r) - if err != nil { - return nil, err - } - - downloadUrl = r.Data.FileUrls[0].MainURL + return nil, errs.NotImplement } // 生成标准的Content-Disposition diff --git a/drivers/doubao/meta.go b/drivers/doubao/meta.go index c3d8eb34..7735e5ff 100644 --- a/drivers/doubao/meta.go +++ b/drivers/doubao/meta.go @@ -12,6 +12,7 @@ type Addition struct { // define other Cookie string `json:"cookie" type:"text"` UploadThread string `json:"upload_thread" default:"3"` + DownloadApi string `json:"download_api" type:"select" options:"get_file_url,get_download_info" default:"get_file_url"` } var config = driver.Config{ diff --git a/drivers/doubao/types.go b/drivers/doubao/types.go index 4264eb7d..ae747f88 100644 --- a/drivers/doubao/types.go +++ b/drivers/doubao/types.go @@ -3,8 +3,9 @@ package doubao import ( "encoding/json" "fmt" - "github.com/alist-org/alist/v3/internal/model" "time" + + "github.com/alist-org/alist/v3/internal/model" ) type BaseResp struct { @@ -38,6 +39,17 @@ type File struct { UpdateTime int64 `json:"update_time"` } +type GetDownloadInfoResp struct { + BaseResp + Data struct { + DownloadInfos []struct { + NodeID string `json:"node_id"` + MainURL string `json:"main_url"` + BackupURL string `json:"backup_url"` + } `json:"download_infos"` + } `json:"data"` +} + type GetFileUrlResp struct { BaseResp Data struct {