mirror of
https://github.com/OpenListTeam/OpenList.git
synced 2025-09-19 20:26:26 +08:00

* feat(task): add task hook,batch task
refactor(move): move use CopyTask
* Update internal/task/batch_task/refresh.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Seven <53081179+Seven66677731@users.noreply.github.com>
* fix: upload task allFinish judge
* Update internal/task/batch_task/refresh.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Seven <53081179+Seven66677731@users.noreply.github.com>
* feat: enhance concurrency safety
* 优化代码
* 解压缩
* 修复死锁
* refactor(move): move as task
* 重构,优化
* .
* 优化,修复bug
* .
* 修复bug
* feat: add task retry judge
* 代理Task.SetState函数来判断Task的生命周期
* chore: use OnSucceeded、OnFailed、OnBeforeRetry functions
* 优化
* 优化,去除重复代码
* .
* 优化
* .
* webdav
* Revert "fix(fs):After the file is copied or moved, flush the cache of the directory that was copied or moved to."
This reverts commit 5f03edd683
.
---------
Signed-off-by: Seven <53081179+Seven66677731@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: j2rong4cn <j2rong@qq.com>
173 lines
4.0 KiB
Go
173 lines
4.0 KiB
Go
package thunder_browser
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/OpenListTeam/OpenList/v4/drivers/thunder_browser"
|
|
"github.com/OpenListTeam/OpenList/v4/internal/conf"
|
|
"github.com/OpenListTeam/OpenList/v4/internal/setting"
|
|
|
|
"github.com/OpenListTeam/OpenList/v4/internal/errs"
|
|
"github.com/OpenListTeam/OpenList/v4/internal/model"
|
|
"github.com/OpenListTeam/OpenList/v4/internal/offline_download/tool"
|
|
"github.com/OpenListTeam/OpenList/v4/internal/op"
|
|
)
|
|
|
|
type ThunderBrowser struct {
|
|
refreshTaskCache bool
|
|
}
|
|
|
|
func (t *ThunderBrowser) Name() string {
|
|
return "ThunderBrowser"
|
|
}
|
|
|
|
func (t *ThunderBrowser) Items() []model.SettingItem {
|
|
return nil
|
|
}
|
|
|
|
func (t *ThunderBrowser) Run(task *tool.DownloadTask) error {
|
|
return errs.NotSupport
|
|
}
|
|
|
|
func (t *ThunderBrowser) Init() (string, error) {
|
|
t.refreshTaskCache = false
|
|
return "ok", nil
|
|
}
|
|
|
|
func (t *ThunderBrowser) IsReady() bool {
|
|
tempDir := setting.GetStr(conf.ThunderBrowserTempDir)
|
|
if tempDir == "" {
|
|
return false
|
|
}
|
|
storage, _, err := op.GetStorageAndActualPath(tempDir)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
switch storage.(type) {
|
|
case *thunder_browser.ThunderBrowser, *thunder_browser.ThunderBrowserExpert:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func (t *ThunderBrowser) AddURL(args *tool.AddUrlArgs) (string, error) {
|
|
// 添加新任务刷新缓存
|
|
t.refreshTaskCache = true
|
|
storage, actualPath, err := op.GetStorageAndActualPath(args.TempDir)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
ctx := context.Background()
|
|
|
|
if err := op.MakeDir(ctx, storage, actualPath); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
parentDir, err := op.GetUnwrap(ctx, storage, actualPath)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
var task *thunder_browser.OfflineTask
|
|
switch v := storage.(type) {
|
|
case *thunder_browser.ThunderBrowser:
|
|
task, err = v.OfflineDownload(ctx, args.Url, parentDir, "")
|
|
case *thunder_browser.ThunderBrowserExpert:
|
|
task, err = v.OfflineDownload(ctx, args.Url, parentDir, "")
|
|
default:
|
|
return "", fmt.Errorf("unsupported storage driver for offline download, only ThunderBrowser is supported")
|
|
}
|
|
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to add offline download task: %w", err)
|
|
}
|
|
|
|
if task == nil {
|
|
return "", fmt.Errorf("failed to add offline download task: task is nil")
|
|
}
|
|
|
|
return task.ID, nil
|
|
}
|
|
|
|
func (t *ThunderBrowser) Remove(task *tool.DownloadTask) error {
|
|
storage, _, err := op.GetStorageAndActualPath(task.TempDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
ctx := context.Background()
|
|
|
|
switch v := storage.(type) {
|
|
case *thunder_browser.ThunderBrowser:
|
|
err = v.DeleteOfflineTasks(ctx, []string{task.GID})
|
|
case *thunder_browser.ThunderBrowserExpert:
|
|
err = v.DeleteOfflineTasks(ctx, []string{task.GID})
|
|
default:
|
|
return fmt.Errorf("unsupported storage driver for offline download, only ThunderBrowser is supported")
|
|
}
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (t *ThunderBrowser) Status(task *tool.DownloadTask) (*tool.Status, error) {
|
|
storage, _, err := op.GetStorageAndActualPath(task.TempDir)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var tasks []thunder_browser.OfflineTask
|
|
|
|
switch v := storage.(type) {
|
|
case *thunder_browser.ThunderBrowser:
|
|
tasks, err = t.GetTasks(v)
|
|
case *thunder_browser.ThunderBrowserExpert:
|
|
tasks, err = t.GetTasksExpert(v)
|
|
default:
|
|
return nil, fmt.Errorf("unsupported storage driver for offline download, only ThunderBrowser is supported")
|
|
}
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
s := &tool.Status{
|
|
Progress: 0,
|
|
NewGID: "",
|
|
Completed: false,
|
|
Status: "the task has been deleted",
|
|
Err: nil,
|
|
}
|
|
|
|
for _, t := range tasks {
|
|
if t.ID == task.GID {
|
|
s.Progress = float64(t.Progress)
|
|
s.Status = t.Message
|
|
s.Completed = t.Phase == "PHASE_TYPE_COMPLETE"
|
|
s.TotalBytes, err = strconv.ParseInt(t.FileSize, 10, 64)
|
|
if err != nil {
|
|
s.TotalBytes = 0
|
|
}
|
|
if t.Phase == "PHASE_TYPE_ERROR" {
|
|
s.Err = errors.New(t.Message)
|
|
}
|
|
return s, nil
|
|
}
|
|
}
|
|
|
|
s.Err = fmt.Errorf("the task has been deleted")
|
|
return s, nil
|
|
}
|
|
|
|
func init() {
|
|
tool.Tools.Add(&ThunderBrowser{})
|
|
}
|