mirror of
https://github.com/tickstep/aliyunpan.git
synced 2025-01-23 14:32:14 +08:00
add upload indicator for sync command
This commit is contained in:
parent
87d3770e5b
commit
a02638272f
@ -4,7 +4,7 @@
|
|||||||
// you may not use this file except in compliance with the License.
|
// you may not use this file except in compliance with the License.
|
||||||
// You may obtain a copy of the License at
|
// You may obtain a copy of the License at
|
||||||
//
|
//
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
//
|
//
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@ -42,11 +42,21 @@ func (us *UploadStatus) TotalSize() int64 {
|
|||||||
return us.totalSize
|
return us.totalSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetTotalSize 设置总大小
|
||||||
|
func (us *UploadStatus) SetTotalSize(size int64) {
|
||||||
|
us.totalSize = size
|
||||||
|
}
|
||||||
|
|
||||||
// Uploaded 返回已上传数据
|
// Uploaded 返回已上传数据
|
||||||
func (us *UploadStatus) Uploaded() int64 {
|
func (us *UploadStatus) Uploaded() int64 {
|
||||||
return us.uploaded
|
return us.uploaded
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetUploaded 设置已上传数据
|
||||||
|
func (us *UploadStatus) SetUploaded(size int64) {
|
||||||
|
us.uploaded = size
|
||||||
|
}
|
||||||
|
|
||||||
// SpeedsPerSecond 返回每秒的上传速度
|
// SpeedsPerSecond 返回每秒的上传速度
|
||||||
func (us *UploadStatus) SpeedsPerSecond() int64 {
|
func (us *UploadStatus) SpeedsPerSecond() int64 {
|
||||||
return us.speedsPerSecond
|
return us.speedsPerSecond
|
||||||
|
@ -598,6 +598,7 @@ func (f *FileActionTask) uploadFile(ctx context.Context) error {
|
|||||||
f.syncItem.Status = SyncFileStatusSuccess
|
f.syncItem.Status = SyncFileStatusSuccess
|
||||||
f.syncItem.StatusUpdateTime = utils.NowTimeStr()
|
f.syncItem.StatusUpdateTime = utils.NowTimeStr()
|
||||||
f.syncFileDb.Update(f.syncItem)
|
f.syncFileDb.Update(f.syncItem)
|
||||||
|
PromptPrintln("上传完毕:" + f.syncItem.getPanFileFullPath())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -633,17 +634,7 @@ func (f *FileActionTask) uploadFile(ctx context.Context) error {
|
|||||||
// 但是不支持分片同时上传,必须单线程,并且按照顺序从1开始一个一个上传
|
// 但是不支持分片同时上传,必须单线程,并且按照顺序从1开始一个一个上传
|
||||||
worker := panupload.NewPanUpload(f.panClient, f.syncItem.getPanFileFullPath(), f.syncItem.DriveId, f.syncItem.UploadEntity)
|
worker := panupload.NewPanUpload(f.panClient, f.syncItem.getPanFileFullPath(), f.syncItem.DriveId, f.syncItem.UploadEntity)
|
||||||
|
|
||||||
// 限速配置
|
// 初始化上传Range
|
||||||
var rateLimit *speeds.RateLimit
|
|
||||||
if f.maxUploadRate > 0 {
|
|
||||||
rateLimit = speeds.NewRateLimit(f.maxUploadRate)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 上传客户端
|
|
||||||
uploadClient := requester.NewHTTPClient()
|
|
||||||
uploadClient.SetTimeout(0)
|
|
||||||
uploadClient.SetKeepAlive(true)
|
|
||||||
|
|
||||||
if f.syncItem.UploadRange == nil {
|
if f.syncItem.UploadRange == nil {
|
||||||
f.syncItem.UploadRange = &transfer.Range{
|
f.syncItem.UploadRange = &transfer.Range{
|
||||||
Begin: 0,
|
Begin: 0,
|
||||||
@ -651,6 +642,47 @@ func (f *FileActionTask) uploadFile(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 限速配置
|
||||||
|
var rateLimit *speeds.RateLimit
|
||||||
|
if f.maxUploadRate > 0 {
|
||||||
|
rateLimit = speeds.NewRateLimit(f.maxUploadRate)
|
||||||
|
}
|
||||||
|
// 速度指示器
|
||||||
|
speedsStat := &speeds.Speeds{}
|
||||||
|
// 进度指示器
|
||||||
|
status := &uploader.UploadStatus{}
|
||||||
|
status.SetTotalSize(f.syncItem.LocalFile.FileSize)
|
||||||
|
completed := make(chan struct{}, 0)
|
||||||
|
rand.Seed(time.Now().UnixNano())
|
||||||
|
go func() {
|
||||||
|
ticker := time.NewTicker(1 * time.Second)
|
||||||
|
defer ticker.Stop()
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-completed:
|
||||||
|
return
|
||||||
|
case <-ticker.C:
|
||||||
|
status.SetUploaded(f.syncItem.UploadRange.Begin)
|
||||||
|
time.Sleep(time.Duration(rand.Intn(10)*33) * time.Millisecond) // 延迟随机时间
|
||||||
|
builder := &strings.Builder{}
|
||||||
|
uploadedPercentage := fmt.Sprintf("%.2f%%", float64(status.Uploaded())/float64(status.TotalSize())*100)
|
||||||
|
fmt.Fprintf(builder, "\r上传到网盘:%s ↑ %s/%s(%s) %s/s............",
|
||||||
|
f.syncItem.getPanFileFullPath(),
|
||||||
|
converter.ConvertFileSize(status.Uploaded(), 2),
|
||||||
|
converter.ConvertFileSize(status.TotalSize(), 2),
|
||||||
|
uploadedPercentage,
|
||||||
|
converter.ConvertFileSize(speedsStat.GetSpeeds(), 2),
|
||||||
|
)
|
||||||
|
PromptPrint(builder.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// 上传客户端
|
||||||
|
uploadClient := requester.NewHTTPClient()
|
||||||
|
uploadClient.SetTimeout(0)
|
||||||
|
uploadClient.SetKeepAlive(true)
|
||||||
|
|
||||||
// 标记上传状态
|
// 标记上传状态
|
||||||
f.syncItem.Status = SyncFileStatusUploading
|
f.syncItem.Status = SyncFileStatusUploading
|
||||||
f.syncItem.StatusUpdateTime = utils.NowTimeStr()
|
f.syncItem.StatusUpdateTime = utils.NowTimeStr()
|
||||||
@ -662,13 +694,14 @@ func (f *FileActionTask) uploadFile(ctx context.Context) error {
|
|||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
// cancel routine & done
|
// cancel routine & done
|
||||||
logger.Verboseln("file upload routine cancel")
|
logger.Verboseln("file upload routine cancel")
|
||||||
|
close(completed)
|
||||||
return errors.New("file upload routine cancel")
|
return errors.New("file upload routine cancel")
|
||||||
default:
|
default:
|
||||||
logger.Verboseln("do file upload process")
|
logger.Verboseln("do file upload process")
|
||||||
if f.syncItem.UploadRange.End > f.syncItem.LocalFile.FileSize {
|
if f.syncItem.UploadRange.End > f.syncItem.LocalFile.FileSize {
|
||||||
f.syncItem.UploadRange.End = f.syncItem.LocalFile.FileSize
|
f.syncItem.UploadRange.End = f.syncItem.LocalFile.FileSize
|
||||||
}
|
}
|
||||||
fileReader := uploader.NewBufioSplitUnit(rio.NewFileReaderAtLen64(localFile.GetFile()), *f.syncItem.UploadRange, nil, rateLimit, nil)
|
fileReader := uploader.NewBufioSplitUnit(rio.NewFileReaderAtLen64(localFile.GetFile()), *f.syncItem.UploadRange, speedsStat, rateLimit, nil)
|
||||||
|
|
||||||
if uploadDone, terr := worker.UploadFile(ctx, f.syncItem.UploadPartSeq, f.syncItem.UploadRange.Begin, f.syncItem.UploadRange.End, fileReader, uploadClient); terr == nil {
|
if uploadDone, terr := worker.UploadFile(ctx, f.syncItem.UploadPartSeq, f.syncItem.UploadRange.Begin, f.syncItem.UploadRange.End, fileReader, uploadClient); terr == nil {
|
||||||
if uploadDone {
|
if uploadDone {
|
||||||
@ -681,6 +714,8 @@ func (f *FileActionTask) uploadFile(ctx context.Context) error {
|
|||||||
f.syncItem.Status = SyncFileStatusSuccess
|
f.syncItem.Status = SyncFileStatusSuccess
|
||||||
f.syncItem.StatusUpdateTime = utils.NowTimeStr()
|
f.syncItem.StatusUpdateTime = utils.NowTimeStr()
|
||||||
f.syncFileDb.Update(f.syncItem)
|
f.syncFileDb.Update(f.syncItem)
|
||||||
|
close(completed)
|
||||||
|
PromptPrintln("上传完毕:" + f.syncItem.getPanFileFullPath())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -555,7 +555,7 @@ func (f *FileActionTaskManager) fileActionTaskExecutor(ctx context.Context) {
|
|||||||
prompt := ""
|
prompt := ""
|
||||||
if f.task.Mode == UploadOnly {
|
if f.task.Mode == UploadOnly {
|
||||||
prompt = "完成全部文件的同步上传,等待下一次扫描"
|
prompt = "完成全部文件的同步上传,等待下一次扫描"
|
||||||
} else if f.task.Mode == UploadOnly {
|
} else if f.task.Mode == DownloadOnly {
|
||||||
prompt = "完成全部文件的同步下载,等待下一次扫描"
|
prompt = "完成全部文件的同步下载,等待下一次扫描"
|
||||||
} else {
|
} else {
|
||||||
prompt = "完成全部文件的同步,等待下一次扫描"
|
prompt = "完成全部文件的同步,等待下一次扫描"
|
||||||
|
@ -461,7 +461,7 @@ func (t *SyncTask) scanLocalFile(ctx context.Context) {
|
|||||||
fileInfo: rootFolder,
|
fileInfo: rootFolder,
|
||||||
path: t.LocalFolderPath,
|
path: t.LocalFolderPath,
|
||||||
})
|
})
|
||||||
delayTimeCount = TimeSecondsOf30Seconds
|
delayTimeCount = TimeSecondsOfOneMinute
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
item := obj.(*folderItem)
|
item := obj.(*folderItem)
|
||||||
@ -483,7 +483,7 @@ func (t *SyncTask) scanLocalFile(ctx context.Context) {
|
|||||||
// 检查JS插件
|
// 检查JS插件
|
||||||
localFile := newLocalFileItem(file, item.path+"/"+file.Name())
|
localFile := newLocalFileItem(file, item.path+"/"+file.Name())
|
||||||
if t.skipLocalFile(localFile) {
|
if t.skipLocalFile(localFile) {
|
||||||
fmt.Println("插件禁止扫描本地文件: ", localFile.Path)
|
PromptPrintln("插件禁止扫描本地文件: " + localFile.Path)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -493,7 +493,7 @@ func (t *SyncTask) scanLocalFile(ctx context.Context) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Verboseln("扫描到本地文件:" + item.path + "/" + file.Name())
|
PromptPrintln("扫描到本地文件:" + item.path + "/" + file.Name())
|
||||||
// 文件夹需要增加到扫描队列
|
// 文件夹需要增加到扫描队列
|
||||||
if file.IsDir() {
|
if file.IsDir() {
|
||||||
folderQueue.Push(&folderItem{
|
folderQueue.Push(&folderItem{
|
||||||
@ -682,7 +682,7 @@ func (t *SyncTask) scanPanFile(ctx context.Context) {
|
|||||||
|
|
||||||
// 无限循环模式,继续下一次扫描
|
// 无限循环模式,继续下一次扫描
|
||||||
folderQueue.Push(rootPanFile)
|
folderQueue.Push(rootPanFile)
|
||||||
delayTimeCount = TimeSecondsOf30Seconds
|
delayTimeCount = TimeSecondsOfOneMinute
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
item := obj.(*aliyunpan.FileEntity)
|
item := obj.(*aliyunpan.FileEntity)
|
||||||
@ -703,11 +703,11 @@ func (t *SyncTask) scanPanFile(ctx context.Context) {
|
|||||||
|
|
||||||
// 检查JS插件
|
// 检查JS插件
|
||||||
if t.skipPanFile(panFile) {
|
if t.skipPanFile(panFile) {
|
||||||
logger.Verboseln("插件禁止扫描云盘文件: ", panFile.Path)
|
PromptPrintln("插件禁止扫描云盘文件: " + panFile.Path)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("扫描到云盘文件:" + file.Path)
|
PromptPrintln("扫描到云盘文件:" + file.Path)
|
||||||
panFile.ScanTimeAt = utils.NowTimeStr()
|
panFile.ScanTimeAt = utils.NowTimeStr()
|
||||||
panFileScanList = append(panFileScanList, panFile)
|
panFileScanList = append(panFileScanList, panFile)
|
||||||
logger.Verboseln("scan pan file: ", utils.ObjectToJsonStr(panFile, false))
|
logger.Verboseln("scan pan file: ", utils.ObjectToJsonStr(panFile, false))
|
||||||
|
Loading…
Reference in New Issue
Block a user