2022-09-05 05:35:01 +00:00
package _139
import (
"bytes"
"context"
"fmt"
"io"
"math"
"net/http"
"strconv"
"github.com/alist-org/alist/v3/drivers/base"
"github.com/alist-org/alist/v3/internal/driver"
"github.com/alist-org/alist/v3/internal/errs"
"github.com/alist-org/alist/v3/internal/model"
2022-12-21 07:03:09 +00:00
"github.com/alist-org/alist/v3/pkg/utils"
2022-09-05 05:35:01 +00:00
log "github.com/sirupsen/logrus"
)
type Yun139 struct {
model . Storage
Addition
}
func ( d * Yun139 ) Config ( ) driver . Config {
return config
}
func ( d * Yun139 ) GetAddition ( ) driver . Additional {
2022-12-13 10:03:30 +00:00
return & d . Addition
2022-09-05 05:35:01 +00:00
}
2022-12-13 10:03:30 +00:00
func ( d * Yun139 ) Init ( ctx context . Context ) error {
_ , err := d . post ( "/orchestration/personalCloud/user/v1.0/qryUserExternInfo" , base . Json {
2022-09-05 05:35:01 +00:00
"qryUserExternInfoReq" : base . Json {
"commonAccountInfo" : base . Json {
"account" : d . Account ,
"accountType" : 1 ,
} ,
} ,
} , nil )
return err
}
func ( d * Yun139 ) Drop ( ctx context . Context ) error {
return nil
}
func ( d * Yun139 ) List ( ctx context . Context , dir model . Obj , args model . ListArgs ) ( [ ] model . Obj , error ) {
if d . isFamily ( ) {
return d . familyGetFiles ( dir . GetID ( ) )
} else {
return d . getFiles ( dir . GetID ( ) )
}
}
func ( d * Yun139 ) Link ( ctx context . Context , file model . Obj , args model . LinkArgs ) ( * model . Link , error ) {
u , err := d . getLink ( file . GetID ( ) )
if err != nil {
return nil , err
}
return & model . Link { URL : u } , nil
}
func ( d * Yun139 ) MakeDir ( ctx context . Context , parentDir model . Obj , dirName string ) error {
data := base . Json {
"createCatalogExtReq" : base . Json {
"parentCatalogID" : parentDir . GetID ( ) ,
"newCatalogName" : dirName ,
"commonAccountInfo" : base . Json {
"account" : d . Account ,
"accountType" : 1 ,
} ,
} ,
}
pathname := "/orchestration/personalCloud/catalog/v1.0/createCatalogExt"
if d . isFamily ( ) {
data = base . Json {
"cloudID" : d . CloudID ,
"commonAccountInfo" : base . Json {
"account" : d . Account ,
"accountType" : 1 ,
} ,
"docLibName" : dirName ,
}
pathname = "/orchestration/familyCloud/cloudCatalog/v1.0/createCloudDoc"
}
_ , err := d . post ( pathname ,
data , nil )
return err
}
func ( d * Yun139 ) Move ( ctx context . Context , srcObj , dstDir model . Obj ) error {
if d . isFamily ( ) {
return errs . NotImplement
}
var contentInfoList [ ] string
var catalogInfoList [ ] string
if srcObj . IsDir ( ) {
catalogInfoList = append ( catalogInfoList , srcObj . GetID ( ) )
} else {
contentInfoList = append ( contentInfoList , srcObj . GetID ( ) )
}
data := base . Json {
"createBatchOprTaskReq" : base . Json {
"taskType" : 3 ,
"actionType" : "304" ,
"taskInfo" : base . Json {
"contentInfoList" : contentInfoList ,
"catalogInfoList" : catalogInfoList ,
"newCatalogID" : dstDir . GetID ( ) ,
} ,
"commonAccountInfo" : base . Json {
"account" : d . Account ,
"accountType" : 1 ,
} ,
} ,
}
pathname := "/orchestration/personalCloud/batchOprTask/v1.0/createBatchOprTask"
_ , err := d . post ( pathname , data , nil )
return err
}
func ( d * Yun139 ) Rename ( ctx context . Context , srcObj model . Obj , newName string ) error {
if d . isFamily ( ) {
return errs . NotImplement
}
var data base . Json
var pathname string
if srcObj . IsDir ( ) {
data = base . Json {
"catalogID" : srcObj . GetID ( ) ,
"catalogName" : newName ,
"commonAccountInfo" : base . Json {
"account" : d . Account ,
"accountType" : 1 ,
} ,
}
pathname = "/orchestration/personalCloud/catalog/v1.0/updateCatalogInfo"
} else {
data = base . Json {
"contentID" : srcObj . GetID ( ) ,
"contentName" : newName ,
"commonAccountInfo" : base . Json {
"account" : d . Account ,
"accountType" : 1 ,
} ,
}
pathname = "/orchestration/personalCloud/content/v1.0/updateContentInfo"
}
_ , err := d . post ( pathname , data , nil )
return err
}
func ( d * Yun139 ) Copy ( ctx context . Context , srcObj , dstDir model . Obj ) error {
if d . isFamily ( ) {
return errs . NotImplement
}
var contentInfoList [ ] string
var catalogInfoList [ ] string
if srcObj . IsDir ( ) {
catalogInfoList = append ( catalogInfoList , srcObj . GetID ( ) )
} else {
contentInfoList = append ( contentInfoList , srcObj . GetID ( ) )
}
data := base . Json {
"createBatchOprTaskReq" : base . Json {
"taskType" : 3 ,
"actionType" : 309 ,
"taskInfo" : base . Json {
"contentInfoList" : contentInfoList ,
"catalogInfoList" : catalogInfoList ,
"newCatalogID" : dstDir . GetID ( ) ,
} ,
"commonAccountInfo" : base . Json {
"account" : d . Account ,
"accountType" : 1 ,
} ,
} ,
}
pathname := "/orchestration/personalCloud/batchOprTask/v1.0/createBatchOprTask"
_ , err := d . post ( pathname , data , nil )
return err
}
func ( d * Yun139 ) Remove ( ctx context . Context , obj model . Obj ) error {
var contentInfoList [ ] string
var catalogInfoList [ ] string
if obj . IsDir ( ) {
catalogInfoList = append ( catalogInfoList , obj . GetID ( ) )
} else {
contentInfoList = append ( contentInfoList , obj . GetID ( ) )
}
data := base . Json {
"createBatchOprTaskReq" : base . Json {
"taskType" : 2 ,
"actionType" : 201 ,
"taskInfo" : base . Json {
"newCatalogID" : "" ,
"contentInfoList" : contentInfoList ,
"catalogInfoList" : catalogInfoList ,
} ,
"commonAccountInfo" : base . Json {
"account" : d . Account ,
"accountType" : 1 ,
} ,
} ,
}
pathname := "/orchestration/personalCloud/batchOprTask/v1.0/createBatchOprTask"
if d . isFamily ( ) {
data = base . Json {
"catalogList" : catalogInfoList ,
"contentList" : contentInfoList ,
"commonAccountInfo" : base . Json {
"account" : d . Account ,
"accountType" : 1 ,
} ,
"sourceCatalogType" : 1002 ,
"taskType" : 2 ,
}
pathname = "/orchestration/familyCloud/batchOprTask/v1.0/createBatchOprTask"
}
_ , err := d . post ( pathname , data , nil )
return err
}
func ( d * Yun139 ) Put ( ctx context . Context , dstDir model . Obj , stream model . FileStreamer , up driver . UpdateProgress ) error {
data := base . Json {
"manualRename" : 2 ,
"operation" : 0 ,
"fileCount" : 1 ,
"totalSize" : stream . GetSize ( ) ,
"uploadContentList" : [ ] base . Json { {
"contentName" : stream . GetName ( ) ,
"contentSize" : stream . GetSize ( ) ,
// "digest": "5a3231986ce7a6b46e408612d385bafa"
} } ,
"parentCatalogID" : dstDir . GetID ( ) ,
"newCatalogName" : "" ,
"commonAccountInfo" : base . Json {
"account" : d . Account ,
"accountType" : 1 ,
} ,
}
pathname := "/orchestration/personalCloud/uploadAndDownload/v1.0/pcUploadFileRequest"
if d . isFamily ( ) {
data = d . newJson ( base . Json {
"fileCount" : 1 ,
"manualRename" : 2 ,
"operation" : 0 ,
"path" : "" ,
"seqNo" : "" ,
"totalSize" : stream . GetSize ( ) ,
"uploadContentList" : [ ] base . Json { {
"contentName" : stream . GetName ( ) ,
"contentSize" : stream . GetSize ( ) ,
// "digest": "5a3231986ce7a6b46e408612d385bafa"
} } ,
} )
pathname = "/orchestration/familyCloud/content/v1.0/getFileUploadURL"
return errs . NotImplement
}
var resp UploadResp
_ , err := d . post ( pathname , data , & resp )
if err != nil {
return err
}
2022-12-18 09:48:09 +00:00
var Default int64 = 104857600
2022-09-05 05:35:01 +00:00
part := int ( math . Ceil ( float64 ( stream . GetSize ( ) ) / float64 ( Default ) ) )
var start int64 = 0
for i := 0 ; i < part ; i ++ {
2022-12-21 07:03:09 +00:00
if utils . IsCanceled ( ctx ) {
return ctx . Err ( )
}
2022-09-05 05:35:01 +00:00
byteSize := stream . GetSize ( ) - start
if byteSize > Default {
byteSize = Default
}
byteData := make ( [ ] byte , byteSize )
_ , err = io . ReadFull ( stream , byteData )
if err != nil {
return err
}
req , err := http . NewRequest ( "POST" , resp . Data . UploadResult . RedirectionURL , bytes . NewBuffer ( byteData ) )
if err != nil {
return err
}
2022-12-21 07:03:09 +00:00
req = req . WithContext ( ctx )
2022-09-05 05:35:01 +00:00
headers := map [ string ] string {
"Accept" : "*/*" ,
"Content-Type" : "text/plain;name=" + unicode ( stream . GetName ( ) ) ,
"contentSize" : strconv . FormatInt ( stream . GetSize ( ) , 10 ) ,
"range" : fmt . Sprintf ( "bytes=%d-%d" , start , start + byteSize - 1 ) ,
"content-length" : strconv . FormatInt ( byteSize , 10 ) ,
"uploadtaskID" : resp . Data . UploadResult . UploadTaskID ,
"rangeType" : "0" ,
"Referer" : "https://yun.139.com/" ,
"User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44" ,
"x-SvcType" : "1" ,
}
for k , v := range headers {
req . Header . Set ( k , v )
}
res , err := base . HttpClient . Do ( req )
if err != nil {
return err
}
log . Debugf ( "%+v" , res )
res . Body . Close ( )
start += byteSize
up ( i * 100 / part )
}
return nil
}
var _ driver . Driver = ( * Yun139 ) ( nil )