2022-01-05 17:14:32 +00:00
|
|
|
package mediatrack
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"github.com/Xhofe/alist/conf"
|
|
|
|
"github.com/Xhofe/alist/drivers/base"
|
|
|
|
"github.com/Xhofe/alist/model"
|
|
|
|
"github.com/Xhofe/alist/utils"
|
|
|
|
"github.com/go-resty/resty/v2"
|
2022-01-14 10:19:58 +00:00
|
|
|
log "github.com/sirupsen/logrus"
|
2022-01-05 17:14:32 +00:00
|
|
|
"path"
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type BaseResp struct {
|
|
|
|
Status string `json:"status"`
|
|
|
|
Message string `json:"message"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type T struct {
|
|
|
|
BaseResp
|
|
|
|
}
|
|
|
|
|
|
|
|
func (driver MediaTrack) Request(url string, method int, headers, query, form map[string]string, data interface{}, resp interface{}, account *model.Account) ([]byte, error) {
|
|
|
|
req := base.RestyClient.R()
|
|
|
|
req.SetHeader("Authorization", "Bearer "+account.AccessToken)
|
|
|
|
if headers != nil {
|
|
|
|
req.SetHeaders(headers)
|
|
|
|
}
|
|
|
|
if query != nil {
|
|
|
|
req.SetQueryParams(query)
|
|
|
|
}
|
|
|
|
if form != nil {
|
|
|
|
req.SetFormData(form)
|
|
|
|
}
|
|
|
|
if data != nil {
|
|
|
|
req.SetBody(data)
|
|
|
|
}
|
|
|
|
var e BaseResp
|
|
|
|
req.SetResult(&e)
|
|
|
|
var err error
|
|
|
|
var res *resty.Response
|
|
|
|
switch method {
|
|
|
|
case base.Get:
|
|
|
|
res, err = req.Get(url)
|
|
|
|
case base.Post:
|
|
|
|
res, err = req.Post(url)
|
|
|
|
case base.Delete:
|
|
|
|
res, err = req.Delete(url)
|
|
|
|
case base.Patch:
|
|
|
|
res, err = req.Patch(url)
|
|
|
|
case base.Put:
|
|
|
|
res, err = req.Put(url)
|
|
|
|
default:
|
|
|
|
return nil, base.ErrNotSupport
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2022-01-14 10:19:58 +00:00
|
|
|
log.Debugln(res.String())
|
2022-01-05 17:14:32 +00:00
|
|
|
if e.Status != "SUCCESS" {
|
|
|
|
return nil, errors.New(e.Message)
|
|
|
|
}
|
|
|
|
if resp != nil {
|
|
|
|
err = utils.Json.Unmarshal(res.Body(), resp)
|
|
|
|
}
|
|
|
|
return res.Body(), err
|
|
|
|
}
|
|
|
|
|
|
|
|
type File struct {
|
|
|
|
Category int `json:"category"`
|
|
|
|
ChildAssets []interface{} `json:"childAssets"`
|
|
|
|
CommentCount int `json:"comment_count"`
|
|
|
|
CoverAsset interface{} `json:"cover_asset"`
|
|
|
|
CoverAssetID string `json:"cover_asset_id"`
|
|
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
DeletedAt string `json:"deleted_at"`
|
|
|
|
Description string `json:"description"`
|
2022-01-06 11:21:13 +00:00
|
|
|
File *struct {
|
2022-01-05 17:14:32 +00:00
|
|
|
Cover string `json:"cover"`
|
|
|
|
Src string `json:"src"`
|
|
|
|
} `json:"file"`
|
|
|
|
//FileID string `json:"file_id"`
|
|
|
|
ID string `json:"id"`
|
|
|
|
|
|
|
|
Size string `json:"size"`
|
|
|
|
Thumbnails []interface{} `json:"thumbnails"`
|
|
|
|
Title string `json:"title"`
|
|
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (driver MediaTrack) formatFile(file *File) *model.File {
|
|
|
|
f := model.File{
|
|
|
|
Id: file.ID,
|
|
|
|
Name: file.Title,
|
|
|
|
Size: 0,
|
|
|
|
Driver: driver.Config().Name,
|
|
|
|
UpdatedAt: &file.UpdatedAt,
|
|
|
|
}
|
2022-01-06 11:21:13 +00:00
|
|
|
if file.File == nil {
|
2022-01-05 17:14:32 +00:00
|
|
|
// folder
|
|
|
|
f.Type = conf.FOLDER
|
|
|
|
} else {
|
|
|
|
size, _ := strconv.ParseInt(file.Size, 10, 64)
|
|
|
|
f.Size = size
|
|
|
|
f.Type = utils.GetFileType(path.Ext(file.Title))
|
|
|
|
if file.File.Cover != "" {
|
|
|
|
f.Thumbnail = "https://nano.mtres.cn/" + file.File.Cover
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return &f
|
|
|
|
}
|
|
|
|
|
|
|
|
type ChildrenResp struct {
|
|
|
|
Status string `json:"status"`
|
|
|
|
Data struct {
|
|
|
|
Total int `json:"total"`
|
|
|
|
Assets []File `json:"assets"`
|
|
|
|
} `json:"data"`
|
|
|
|
Path string `json:"path"`
|
|
|
|
TraceID string `json:"trace_id"`
|
|
|
|
RequestID string `json:"requestId"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (driver MediaTrack) GetFiles(parentId string, account *model.Account) ([]model.File, error) {
|
|
|
|
files := make([]model.File, 0)
|
|
|
|
url := fmt.Sprintf("https://jayce.api.mediatrack.cn/v4/assets/%s/children", parentId)
|
|
|
|
sort := ""
|
|
|
|
if account.OrderBy != "" {
|
|
|
|
if account.OrderDirection == "true" {
|
|
|
|
sort = "-"
|
|
|
|
}
|
|
|
|
sort += account.OrderBy
|
|
|
|
}
|
|
|
|
page := 1
|
|
|
|
for {
|
|
|
|
var resp ChildrenResp
|
|
|
|
_, err := driver.Request(url, base.Get, nil, map[string]string{
|
|
|
|
"page": strconv.Itoa(page),
|
|
|
|
"size": "50",
|
|
|
|
"sort": sort,
|
|
|
|
}, nil, nil, &resp, account)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if len(resp.Data.Assets) == 0 {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
page++
|
|
|
|
for _, file := range resp.Data.Assets {
|
|
|
|
files = append(files, *driver.formatFile(&file))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return files, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type UploadResp struct {
|
|
|
|
Status string `json:"status"`
|
|
|
|
Data struct {
|
|
|
|
Credentials struct {
|
|
|
|
TmpSecretID string `json:"TmpSecretId"`
|
|
|
|
TmpSecretKey string `json:"TmpSecretKey"`
|
|
|
|
Token string `json:"Token"`
|
|
|
|
ExpiredTime int `json:"ExpiredTime"`
|
|
|
|
Expiration time.Time `json:"Expiration"`
|
|
|
|
StartTime int `json:"StartTime"`
|
|
|
|
} `json:"credentials"`
|
|
|
|
Object string `json:"object"`
|
|
|
|
Bucket string `json:"bucket"`
|
|
|
|
Region string `json:"region"`
|
|
|
|
URL string `json:"url"`
|
|
|
|
Size string `json:"size"`
|
|
|
|
} `json:"data"`
|
|
|
|
Path string `json:"path"`
|
|
|
|
TraceID string `json:"trace_id"`
|
|
|
|
RequestID string `json:"requestId"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
base.RegisterDriver(&MediaTrack{})
|
|
|
|
}
|