mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-06 16:40:32 +00:00
62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package fetcher
|
|
|
|
import (
|
|
"github.com/monkeyWie/gopeed/internal/controller"
|
|
"github.com/monkeyWie/gopeed/pkg/base"
|
|
)
|
|
|
|
// 对应协议的下载支持
|
|
type Fetcher interface {
|
|
Setup(ctl controller.Controller) error
|
|
// 解析请求
|
|
Resolve(req *base.Request) (res *base.Resource, err error)
|
|
// 创建任务
|
|
Create(res *base.Resource, opts *base.Options) (err error)
|
|
Start() (err error)
|
|
Pause() (err error)
|
|
Continue() (err error)
|
|
Close() (err error)
|
|
|
|
// 获取任务各个文件下载进度
|
|
Progress() Progress
|
|
// 该方法会一直阻塞,直到任务下载结束
|
|
Wait() (err error)
|
|
}
|
|
|
|
type FetcherBuilder interface {
|
|
Schemes() []string
|
|
Build() Fetcher
|
|
|
|
// Store 存储任务
|
|
Store(fetcher Fetcher) (any, error)
|
|
// Restore 恢复任务
|
|
Restore() (v any, f func(res *base.Resource, opts *base.Options, v any) Fetcher)
|
|
}
|
|
|
|
type DefaultFetcher struct {
|
|
Ctl controller.Controller
|
|
DoneCh chan error
|
|
}
|
|
|
|
func (f *DefaultFetcher) Setup(ctl controller.Controller) (err error) {
|
|
f.Ctl = ctl
|
|
f.DoneCh = make(chan error, 1)
|
|
return
|
|
}
|
|
|
|
func (f *DefaultFetcher) Wait() (err error) {
|
|
return <-f.DoneCh
|
|
}
|
|
|
|
// 获取任务中各个文件的已下载字节数
|
|
type Progress []int64
|
|
|
|
// TotalDownloaded 获取任务总下载字节数
|
|
func (p Progress) TotalDownloaded() int64 {
|
|
total := int64(0)
|
|
for _, d := range p {
|
|
total += d
|
|
}
|
|
return total
|
|
}
|