From 77aae6660ef3281293f6b9db9cd62f34d8c00774 Mon Sep 17 00:00:00 2001 From: Xhofe Date: Tue, 30 Mar 2021 10:22:07 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=A2=9E=E5=8A=A0=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- alidrive/post_json.go | 81 ++++++++++++++++++++++++++++ alidrive/req_bean.go | 6 +++ alidrive/request.go | 82 ++++------------------------- alidrive/resp_bean.go | 42 +++------------ alidrive/utils.go | 41 +++++++++++++++ conf/const.go | 2 +- server/controllers/offie_preview.go | 1 + server/controllers/video_preview.go | 33 ++++++++++++ server/router.go | 1 + 9 files changed, 182 insertions(+), 107 deletions(-) create mode 100644 alidrive/post_json.go create mode 100644 alidrive/utils.go create mode 100644 server/controllers/video_preview.go diff --git a/alidrive/post_json.go b/alidrive/post_json.go new file mode 100644 index 00000000..fb20a442 --- /dev/null +++ b/alidrive/post_json.go @@ -0,0 +1,81 @@ +package alidrive + +import ( + "bytes" + "encoding/json" + "fmt" + "github.com/Xhofe/alist/conf" + log "github.com/sirupsen/logrus" + "io/ioutil" + "net/http" + "strings" + "time" +) + +// convert body to json +func BodyToJson(url string, req interface{}, resp RespHandle, drive *conf.Drive) error { + if body, err := DoPost(url, req, drive.AccessToken); err != nil { + log.Errorf("doPost出错:%s", err.Error()) + return err + } else { + if err = json.Unmarshal(body, &resp); err != nil { + log.Errorf("解析json[%s]出错:%s", string(body), err.Error()) + return err + } + } + if resp.IsAvailable() { + return nil + } + if resp.GetCode() == conf.AccessTokenInvalid { + resp.SetCode("") + if RefreshToken(drive) { + return BodyToJson(url, req, resp, drive) + } + } + return fmt.Errorf(resp.GetMessage()) +} + +// do post request +func DoPost(url string, request interface{}, auth string) (body []byte, err error) { + var ( + resp *http.Response + ) + requestBody := new(bytes.Buffer) + err = json.NewEncoder(requestBody).Encode(request) + if err != nil { + log.Errorf("创建requestBody出错:%s", err.Error()) + } + req, err := http.NewRequest("POST", url, requestBody) + log.Debugf("do_post_req:%+v", req) + if err != nil { + log.Errorf("创建request出错:%s", err.Error()) + return + } + if auth != "" { + req.Header.Set("authorization", conf.Bearer+auth) + } + req.Header.Add("content-type", "application/json") + req.Header.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36") + req.Header.Add("origin", "https://aliyundrive.com") + req.Header.Add("accept", "*/*") + req.Header.Add("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3") + req.Header.Add("Connection", "keep-alive") + + for retryCount := 3; retryCount >= 0; retryCount-- { + if resp, err = conf.Client.Do(req); err != nil && strings.Contains(err.Error(), "timeout") { + <-time.After(time.Second) + } else { + break + } + } + if err != nil { + log.Errorf("请求阿里云盘api时出错:%s", err.Error()) + return + } + if body, err = ioutil.ReadAll(resp.Body); err != nil { + log.Errorf("读取api返回内容失败") + } + log.Debugf("请求返回信息:%s", string(body)) + return +} + diff --git a/alidrive/req_bean.go b/alidrive/req_bean.go index 6ac315a0..a1607ee8 100644 --- a/alidrive/req_bean.go +++ b/alidrive/req_bean.go @@ -65,3 +65,9 @@ type OfficePreviewUrlReq struct { DriveId string `json:"drive_id"` FileId string `json:"file_id"` } + +// video preview url request bean +type VideoPreviewUrlReq struct { + DriveId string `json:"drive_id"` + FileId string `json:"file_id"` +} \ No newline at end of file diff --git a/alidrive/request.go b/alidrive/request.go index fd677b41..08bcd039 100644 --- a/alidrive/request.go +++ b/alidrive/request.go @@ -1,15 +1,8 @@ package alidrive import ( - "bytes" - "encoding/json" "fmt" "github.com/Xhofe/alist/conf" - log "github.com/sirupsen/logrus" - "io/ioutil" - "net/http" - "strings" - "time" ) // get file @@ -115,69 +108,16 @@ func GetOfficePreviewUrl(fileId string, drive *conf.Drive) (*OfficePreviewUrlRes return &resp, nil } -// convert body to json -func BodyToJson(url string, req interface{}, resp RespHandle, drive *conf.Drive) error { - if body, err := DoPost(url, req, drive.AccessToken); err != nil { - log.Errorf("doPost出错:%s", err.Error()) - return err - } else { - if err = json.Unmarshal(body, &resp); err != nil { - log.Errorf("解析json[%s]出错:%s", string(body), err.Error()) - return err - } +// get video preview url +func GetVideoPreviewUrl(fileId string, drive *conf.Drive) (*VideoPreviewUrlResp, error) { + url := conf.Conf.AliDrive.ApiUrl + "/databox/get_video_play_info" + req := VideoPreviewUrlReq{ + DriveId: drive.DefaultDriveId, + FileId: fileId, } - if resp.IsAvailable() { - return nil + var resp VideoPreviewUrlResp + if err := BodyToJson(url, req, &resp, drive); err != nil { + return nil, err } - if resp.GetCode() == conf.AccessTokenInvalid { - resp.SetCode("") - if RefreshToken(drive) { - return BodyToJson(url, req, resp, drive) - } - } - return fmt.Errorf(resp.GetMessage()) -} - -// do post request -func DoPost(url string, request interface{}, auth string) (body []byte, err error) { - var ( - resp *http.Response - ) - requestBody := new(bytes.Buffer) - err = json.NewEncoder(requestBody).Encode(request) - if err != nil { - log.Errorf("创建requestBody出错:%s", err.Error()) - } - req, err := http.NewRequest("POST", url, requestBody) - log.Debugf("do_post_req:%+v", req) - if err != nil { - log.Errorf("创建request出错:%s", err.Error()) - return - } - if auth != "" { - req.Header.Set("authorization", conf.Bearer+auth) - } - req.Header.Add("content-type", "application/json") - req.Header.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36") - req.Header.Add("origin", "https://aliyundrive.com") - req.Header.Add("accept", "*/*") - req.Header.Add("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3") - req.Header.Add("Connection", "keep-alive") - - for retryCount := 3; retryCount >= 0; retryCount-- { - if resp, err = conf.Client.Do(req); err != nil && strings.Contains(err.Error(), "timeout") { - <-time.After(time.Second) - } else { - break - } - } - if err != nil { - log.Errorf("请求阿里云盘api时出错:%s", err.Error()) - return - } - if body, err = ioutil.ReadAll(resp.Body); err != nil { - log.Errorf("读取api返回内容失败") - } - log.Debugf("请求返回信息:%s", string(body)) - return -} + return &resp, nil +} \ No newline at end of file diff --git a/alidrive/resp_bean.go b/alidrive/resp_bean.go index ce786ff0..5c5118d9 100644 --- a/alidrive/resp_bean.go +++ b/alidrive/resp_bean.go @@ -1,10 +1,6 @@ package alidrive import ( - log "github.com/sirupsen/logrus" - "io/ioutil" - "net/http" - "strings" "time" ) @@ -150,35 +146,11 @@ type OfficePreviewUrlResp struct { AccessToken string `json:"access_token"` } -// check password -func HasPassword(files *Files) string { - fileList := files.Items - for i, file := range fileList { - if strings.HasPrefix(file.Name, ".password-") { - files.Items = fileList[:i+copy(fileList[i:], fileList[i+1:])] - return file.Name[10:] - } - } - return "" -} - -// Deprecated: check readme, implemented by the front end now -func HasReadme(files *Files) string { - fileList := files.Items - for _, file := range fileList { - if file.Name == "Readme.md" { - resp, err := http.Get(file.Url) - if err != nil { - log.Errorf("Get Readme出错:%s", err.Error()) - return "" - } - data, err := ioutil.ReadAll(resp.Body) - if err != nil { - log.Errorf("读取 Readme出错:%s", err.Error()) - return "" - } - return string(data) - } - } - return "" +type VideoPreviewUrlResp struct { + RespError + TemplateList []struct { + TemplateId string `json:"template_id"` + Status string `json:"status"` + Url string `json:"url"` + } `json:"template_list"` } diff --git a/alidrive/utils.go b/alidrive/utils.go new file mode 100644 index 00000000..1b9f4e1f --- /dev/null +++ b/alidrive/utils.go @@ -0,0 +1,41 @@ +package alidrive + +import ( + log "github.com/sirupsen/logrus" + "io/ioutil" + "net/http" + "strings" +) + +// check password +func HasPassword(files *Files) string { + fileList := files.Items + for i, file := range fileList { + if strings.HasPrefix(file.Name, ".password-") { + files.Items = fileList[:i+copy(fileList[i:], fileList[i+1:])] + return file.Name[10:] + } + } + return "" +} + +// Deprecated: check readme, implemented by the front end now +func HasReadme(files *Files) string { + fileList := files.Items + for _, file := range fileList { + if file.Name == "Readme.md" { + resp, err := http.Get(file.Url) + if err != nil { + log.Errorf("Get Readme出错:%s", err.Error()) + return "" + } + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Errorf("读取 Readme出错:%s", err.Error()) + return "" + } + return string(data) + } + } + return "" +} diff --git a/conf/const.go b/conf/const.go index 5795b137..22428aec 100644 --- a/conf/const.go +++ b/conf/const.go @@ -22,7 +22,7 @@ var ( var Conf = new(Config) const ( - VERSION = "v1.0.1" + VERSION = "v1.0.2" ImageThumbnailProcess = "image/resize,w_50" VideoThumbnailProcess = "video/snapshot,t_0,f_jpg,w_50" diff --git a/server/controllers/offie_preview.go b/server/controllers/offie_preview.go index a286e77c..ae5676c1 100644 --- a/server/controllers/offie_preview.go +++ b/server/controllers/offie_preview.go @@ -31,3 +31,4 @@ func OfficePreview(c *gin.Context) { } c.JSON(200, DataResponse(preview)) } + diff --git a/server/controllers/video_preview.go b/server/controllers/video_preview.go new file mode 100644 index 00000000..a77dec01 --- /dev/null +++ b/server/controllers/video_preview.go @@ -0,0 +1,33 @@ +package controllers + +import ( + "github.com/Xhofe/alist/alidrive" + "github.com/Xhofe/alist/utils" + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +type VideoPreviewReq struct { + FileId string `json:"file_id" binding:"required"` +} + +// handle video_preview request +func VideoPreview(c *gin.Context) { + drive := utils.GetDriveByName(c.Param("drive")) + if drive == nil { + c.JSON(200, MetaResponse(400, "drive isn't exist.")) + return + } + var req VideoPreviewReq + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(200, MetaResponse(400, "Bad Request:"+err.Error())) + return + } + log.Debugf("preview_req:%+v", req) + preview, err := alidrive.GetVideoPreviewUrl(req.FileId, drive) + if err != nil { + c.JSON(200, MetaResponse(500, err.Error())) + return + } + c.JSON(200, DataResponse(preview)) +} diff --git a/server/router.go b/server/router.go index ec4c61ca..8b31d819 100644 --- a/server/router.go +++ b/server/router.go @@ -27,6 +27,7 @@ func InitApiRouter(engine *gin.Engine) { apiV2.POST("/get", controllers.Get) apiV2.POST("/path", controllers.Path) apiV2.POST("/office_preview/:drive", controllers.OfficePreview) + apiV2.POST("/video_preview/:drive", controllers.VideoPreview) apiV2.POST("/local_search", controllers.LocalSearch) apiV2.POST("/global_search", controllers.GlobalSearch) apiV2.GET("/rebuild/:drive/:password", controllers.RebuildTree)