feat: support create task directly (#262)

This commit is contained in:
Levi authored and GitHub committed 2023-11-09 16:52:02 +08:00
1 parent aae79c2449
commit af52c4ce7e
12 files changed
+343 -297

No files matched your search

+2 -2
View File
@@ -161,7 +161,7 @@ func (f *Fetcher) Wait() (err error) {
} }
} }
if !selected { if !selected {
util.SafeRemove(filepath.Join(f.meta.Opts.Path, file.Path())) util.SafeRemove(filepath.Join(f.meta.Opts.Path, f.meta.Res.Name, file.Path()))
} }
} }
break break
@@ -202,7 +202,7 @@ func (f *Fetcher) updateRes() {
Size: file.Length(), Size: file.Length(),
} }
} }
res.CalcSize() res.CalcSize(nil)
f.meta.Res = res f.meta.Res = res
if f.meta.Opts != nil { if f.meta.Opts != nil {
f.meta.Opts.InitSelectFiles(len(res.Files)) f.meta.Opts.InitSelectFiles(len(res.Files))
+6 -3
View File
@@ -3,6 +3,7 @@ package base
import ( import (
"fmt" "fmt"
"github.com/GopeedLab/gopeed/pkg/util" "github.com/GopeedLab/gopeed/pkg/util"
"golang.org/x/exp/slices"
) )
// Request download request // Request download request
@@ -47,10 +48,12 @@ func (r *Resource) Validate() error {
return nil return nil
} }
func (r *Resource) CalcSize() { func (r *Resource) CalcSize(selectFiles []int) {
var size int64 var size int64
for _, file := range r.Files { for i, file := range r.Files {
size += file.Size if len(selectFiles) == 0 || slices.Contains(selectFiles, i) {
size += file.Size
}
} }
r.Size = size r.Size = size
} }
+15 -7
View File
@@ -540,11 +540,17 @@ func (d *Downloader) GetTask(id string) *Task {
} }
func (d *Downloader) GetTasks() []*Task { func (d *Downloader) GetTasks() []*Task {
// reverse tasks, so that the latest task is in the front
tasks := make([]*Task, len(d.tasks)) tasks := make([]*Task, len(d.tasks))
for i := 0; i < len(d.tasks); i++ { for i := 0; i < len(d.tasks); i++ {
tasks[i] = d.tasks[len(d.tasks)-i-1] tasks[i] = d.tasks[i]
} }
// sort tasks by status, order by Status(if(running,1,0)) desc, CreatedAt desc
sort.Slice(tasks, func(i, j int) bool {
if tasks[i].Status != tasks[j].Status {
return tasks[i].Status == base.DownloadStatusRunning
}
return tasks[i].CreatedAt.After(tasks[j].CreatedAt)
})
return tasks return tasks
} }
@@ -579,16 +585,16 @@ func (d *Downloader) watch(task *Task) {
d.emit(EventKeyError, task, err) d.emit(EventKeyError, task, err)
} else { } else {
task.Progress.Used = task.timer.Used() task.Progress.Used = task.timer.Used()
if task.Size == 0 { if task.Meta.Res.Size == 0 {
task.Size = task.fetcher.Progress().TotalDownloaded() task.Meta.Res.Size = task.fetcher.Progress().TotalDownloaded()
task.Meta.Res.Size = task.Size
} }
used := task.Progress.Used / int64(time.Second) used := task.Progress.Used / int64(time.Second)
if used == 0 { if used == 0 {
used = 1 used = 1
} }
task.Progress.Speed = task.Size / used totalSize := task.Meta.Res.Size
task.Progress.Downloaded = task.Size task.Progress.Speed = totalSize / used
task.Progress.Downloaded = totalSize
task.Status = base.DownloadStatusDone task.Status = base.DownloadStatusDone
d.storage.Put(bucketTask, task.ID, task.clone()) d.storage.Put(bucketTask, task.ID, task.clone())
d.emit(EventKeyDone, task) d.emit(EventKeyDone, task)
@@ -741,6 +747,8 @@ func (d *Downloader) doStart(task *Task) (err error) {
} }
task.Meta.Opts.Name = newName task.Meta.Opts.Name = newName
} }
task.Meta.Res.CalcSize(task.Meta.Opts.SelectFiles)
} }
task.Progress.Speed = 0 task.Progress.Speed = 0
+1 -1
View File
@@ -243,7 +243,7 @@ func (d *Downloader) triggerOnResolve(req *base.Request) (res *base.Resource) {
gopeed.Logger.logger.Warn().Err(err).Msgf("[%s] resource invalid", ext.buildIdentity()) gopeed.Logger.logger.Warn().Err(err).Msgf("[%s] resource invalid", ext.buildIdentity())
return return
} }
ctx.Res.CalcSize() ctx.Res.CalcSize(nil)
} }
res = ctx.Res res = ctx.Res
}, },
-2
View File
@@ -22,7 +22,6 @@ type Task struct {
Meta *fetcher.FetcherMeta `json:"meta"` Meta *fetcher.FetcherMeta `json:"meta"`
Status base.Status `json:"status"` Status base.Status `json:"status"`
Progress *Progress `json:"progress"` Progress *Progress `json:"progress"`
Size int64 `json:"size"`
CreatedAt time.Time `json:"createdAt"` CreatedAt time.Time `json:"createdAt"`
fetcherBuilder fetcher.FetcherBuilder fetcherBuilder fetcher.FetcherBuilder
@@ -50,7 +49,6 @@ func (t *Task) clone() *Task {
Meta: t.Meta, Meta: t.Meta,
Status: t.Status, Status: t.Status,
Progress: t.Progress, Progress: t.Progress,
Size: t.Size,
CreatedAt: t.CreatedAt, CreatedAt: t.CreatedAt,
} }
} }
+1
View File
@@ -12,6 +12,7 @@
"donate": "Donate", "donate": "Donate",
"exit": "Exit", "exit": "Exit",
"create": "Create Task", "create": "Create Task",
"directDownload": "Direct Download",
"advancedOptions": "Advanced Options", "advancedOptions": "Advanced Options",
"downloadLink": "Download Link", "downloadLink": "Download Link",
"downloadLinkValid": "Please enter the download link", "downloadLinkValid": "Please enter the download link",
+1
View File
@@ -12,6 +12,7 @@
"donate": "打赏", "donate": "打赏",
"exit": "退出", "exit": "退出",
"create": "创建任务", "create": "创建任务",
"directDownload": "直接下载",
"advancedOptions": "高级选项", "advancedOptions": "高级选项",
"downloadLink": "下载链接", "downloadLink": "下载链接",
"downloadLinkValid": "请输入下载链接", "downloadLinkValid": "请输入下载链接",
-2
View File
@@ -12,7 +12,6 @@ class Task {
Meta meta; Meta meta;
Status status; Status status;
Progress progress; Progress progress;
int size;
DateTime createdAt; DateTime createdAt;
Task({ Task({
@@ -20,7 +19,6 @@ class Task {
required this.meta, required this.meta,
required this.status, required this.status,
required this.progress, required this.progress,
required this.size,
required this.createdAt, required this.createdAt,
}); });
-2
View File
@@ -11,7 +11,6 @@ Task _$TaskFromJson(Map<String, dynamic> json) => Task(
meta: Meta.fromJson(json['meta'] as Map<String, dynamic>), meta: Meta.fromJson(json['meta'] as Map<String, dynamic>),
status: $enumDecode(_$StatusEnumMap, json['status']), status: $enumDecode(_$StatusEnumMap, json['status']),
progress: Progress.fromJson(json['progress'] as Map<String, dynamic>), progress: Progress.fromJson(json['progress'] as Map<String, dynamic>),
size: json['size'] as int,
createdAt: DateTime.parse(json['createdAt'] as String), createdAt: DateTime.parse(json['createdAt'] as String),
); );
@@ -20,7 +19,6 @@ Map<String, dynamic> _$TaskToJson(Task instance) => <String, dynamic>{
'meta': instance.meta.toJson(), 'meta': instance.meta.toJson(),
'status': _$StatusEnumMap[instance.status]!, 'status': _$StatusEnumMap[instance.status]!,
'progress': instance.progress.toJson(), 'progress': instance.progress.toJson(),
'size': instance.size,
'createdAt': instance.createdAt.toIso8601String(), 'createdAt': instance.createdAt.toIso8601String(),
}; };
@@ -10,8 +10,9 @@ class CreateController extends GetxController
final RxList fileInfos = [].obs; final RxList fileInfos = [].obs;
final RxList openedFolders = [].obs; final RxList openedFolders = [].obs;
final selectedIndexes = <int>[].obs; final selectedIndexes = <int>[].obs;
final isResolving = false.obs; final isConfirming = false.obs;
final showAdvanced = false.obs; final showAdvanced = false.obs;
final directDownload = false.obs;
late TabController advancedTabController; late TabController advancedTabController;
final oldUrl = "".obs; final oldUrl = "".obs;
final fileDataUri = "".obs; final fileDataUri = "".obs;
File diff suppressed because it is too large. Load diff
+3
View File
@@ -28,6 +28,7 @@ class LocaleKeys {
static const donate = 'donate'; static const donate = 'donate';
static const exit = 'exit'; static const exit = 'exit';
static const create = 'create'; static const create = 'create';
static const directDownload = 'directDownload';
static const advancedOptions = 'advancedOptions'; static const advancedOptions = 'advancedOptions';
static const downloadLink = 'downloadLink'; static const downloadLink = 'downloadLink';
static const downloadLinkValid = 'downloadLinkValid'; static const downloadLinkValid = 'downloadLinkValid';
@@ -106,6 +107,7 @@ class Locales {
'donate': 'Donate', 'donate': 'Donate',
'exit': 'Exit', 'exit': 'Exit',
'create': 'Create Task', 'create': 'Create Task',
'directDownload': 'Direct Download',
'advancedOptions': 'Advanced Options', 'advancedOptions': 'Advanced Options',
'downloadLink': 'Download Link', 'downloadLink': 'Download Link',
'downloadLinkValid': 'Please enter the download link', 'downloadLinkValid': 'Please enter the download link',
@@ -379,6 +381,7 @@ class Locales {
'donate': '打赏', 'donate': '打赏',
'exit': '退出', 'exit': '退出',
'create': '创建任务', 'create': '创建任务',
'directDownload': '直接下载',
'advancedOptions': '高级选项', 'advancedOptions': '高级选项',
'downloadLink': '下载链接', 'downloadLink': '下载链接',
'downloadLinkValid': '请输入下载链接', 'downloadLinkValid': '请输入下载链接',