rain

package module
v0.4.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 3, 2023 License: MIT Imports: 26 Imported by: 1

README

📦 rain - 超快下载 http 资源

Release

rain 一款 golang 包,可以让你快速实现 http 协议的资源下载,为此 rain 拥有一些方便的特性,比如:多协程、断点续传、自动重命名、限速等。

🚀 安装

使用 go get 安装 rain

go get -u github.com/rock-rabbit/rain

✨ 特性

  • 多协程分块下载
  • 断点下载
  • 限速下载
  • 文件自动重命名
  • 文件名非法字符过滤
  • 磁盘缓冲区
  • 下载进度和状态监听
  • 可自定义的命令行进度条
  • 运行时修改配置
  • 非阻塞下载

当前测试覆盖: coverage: 81.2% of statements

🛠️ 使用方法

简单使用方法

package main

import (
	"fmt"
	"github.com/rock-rabbit/rain"
)

func main() {
	uri := "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4"
	ctl, err := rain.New(uri, rain.WithOutdir("./tmp"), rain.WithBar()).Run()
	if err != nil {
		panic(err)
	}
	fmt.Printf("下载完成:%s\n", ctl.Outpath())
}

监听下载

type EventExtend struct{}

// Change 下载进度
func (ee *EventExtend) Change(stat *rain.EventExtend) {
	fmt.Println("change", stat.Progress)
}

// Error 错误
func (ee *EventExtend) Error(stat *rain.EventExtend) {
	fmt.Println("error", stat.Error)
}

// Close 执行 Close
func (ee *EventExtend) Close(stat *rain.EventExtend) {
	fmt.Println("close")
}

// Finish 成功下载
func (ee *EventExtend) Finish(stat *rain.EventExtend) {
	fmt.Println("finish", stat.Progress)
}

var _ rain.ProgressEventExtend = &EventExtend{}

func main() {
	uri := "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4"
	ctl, err := rain.New(uri, rain.WithEventExtend(&EventExtend{})).Run()
	if err != nil {
		panic(err)
	}
	fmt.Printf("下载完成:%s\n", ctl.Outpath())
}

非阻塞下载

func main() {
	uri := "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4"
	ctl, err := rain.New(uri, rain.WithOutdir("./tmp"), rain.WithBar()).Start()
	if err != nil {
		panic(err)
	}

	// ... 其他逻辑

	_, err = ctl.Run()
	if err != nil {
		panic(err)
	}
	fmt.Printf("下载完成:%s\n", ctl.Outpath())
}

暂停下载

func main() {
	uri := "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4"
	ctl, err := rain.New(uri, rain.WithOutdir("./tmp"), rain.WithBar()).Start()
	if err != nil {
		panic(err)
	}

	go func() {
		time.Sleep(time.Second * 2)
		// 暂停下载
		ctl.Close()
	}()

	err = ctl.Wait()
	if err != nil {
		panic(err)
	}

	// 继续下载
	_, err = ctl.Run()
	if err != nil {
		panic(err)
	}

	fmt.Printf("下载完成:%s\n", ctl.Outpath())
}

... 有很多参数可以自行去查看使用。

🎨 项目

以下项目使用到了 rain :

Documentation

Index

Constants

View Source
const (
	STATUS_NOTSTART = Status(iota - 1)
	// STATUS_BEGIN 准备中
	STATUS_BEGIN
	// STATUS_RUNNING 运行中
	STATUS_RUNNING
	// STATUS_CLOSE 关闭
	STATUS_CLOSE
	// STATUS_ERROR 错误
	STATUS_ERROR
	// STATUS_FINISH 完成
	STATUS_FINISH
)
View Source
const COPY_BUFFER_SIZE = 1024 * 32

COPY_BUFFER_SIZE 接收数据的 buffer 大小

Variables

This section is empty.

Functions

func AddOptions added in v0.3.0

func AddOptions(opt ...OptionFunc)

AddOptions 添加 New 时的 option

func ReplaceHeader

func ReplaceHeader(h http.Header)

ReplaceHeader 替换默认请求的 Header

func SetAllowOverwrite

func SetAllowOverwrite(d bool)

SetAllowOverwrite 设置是否允许覆盖下载文件

func SetAutoFileRenaming

func SetAutoFileRenaming(d bool)

SetAutoFileRenaming 设置是否自动重命名文件,新文件名在名称之后扩展名之前加上一个点和一个数字(1..9999)

func SetBody

func SetBody(d io.Reader)

SetBody 设置默认请求 Body

func SetBreakpointExt

func SetBreakpointExt(d string)

SetTempfileExt 断点文件扩展, 默认为 .temp.rain

func SetBreakpointResume

func SetBreakpointResume(d bool)

SetBreakpointResume 设置是否启用断点续传

func SetClient

func SetClient(d *http.Client)

SetClient 设置默认请求客户端

func SetCreateDir

func SetCreateDir(d bool)

SetCreateDir 设置是否可以创建目录

func SetDiskCache

func SetDiskCache(d int)

SetDiskCache 设置磁盘缓冲区大小

func SetHeader

func SetHeader(k, v string)

SetHeader 设置默认请求 Header

func SetMethod

func SetMethod(d string)

SetMethod 设置默认请求方式

func SetOptions added in v0.3.0

func SetOptions(opts []OptionFunc)

SetOptions 设置 New 时的 option

func SetOutdir

func SetOutdir(d string)

SetOutdir 设置文件默认输出目录

func SetPerm

func SetPerm(d fs.FileMode)

SetPerm 设置默认输出文件权限

func SetProxy added in v0.4.0

func SetProxy(p func(*http.Request) (*url.URL, error), h ...http.Header) error

SetProxy 设置客户端代理

func SetRetryNumber

func SetRetryNumber(d int)

SetRetryNumber 设置请求重试次数

func SetRetryTime

func SetRetryTime(d time.Duration)

SetRetryNumber 设置请求重试的间隔时间

func SetRoutineCount

func SetRoutineCount(d int)

SetRoutineCount 设置协程最大数

func SetRoutineSize

func SetRoutineSize(d int64)

SetRoutineSize 设置协程下载最大字节数

func SetSpeedLimit

func SetSpeedLimit(d int)

SetSpeedLimit 设置下载速度限制

func SetTimeout

func SetTimeout(d time.Duration)

SetTimeout 设置下载超时时间

Types

type Bar

type Bar struct {
	// Template 进度条样式
	Template *BarTemplate
	// FriendlyFormat 使用人类友好的单位
	FriendlyFormat bool
	// FinishHide 完成后隐藏进度条,下载完成后清除掉进度条
	FinishHide bool
	// Hide 是否隐藏进度条
	Hide bool
	// Stdout 进度条输出, 默认为 os.Stdout
	Stdout io.Writer
}

Bar 提供一个简单的进度条

func NewBar

func NewBar() *Bar

func (*Bar) Change

func (bar *Bar) Change(stat *EventExtend)

Change 进度变化

func (*Bar) Close added in v0.2.0

func (bar *Bar) Close(stat *EventExtend)

Close 中途暂停

func (*Bar) Error added in v0.2.0

func (bar *Bar) Error(stat *EventExtend)

Error 出现错误

func (*Bar) Finish added in v0.2.0

func (bar *Bar) Finish(stat *EventExtend)

Finish 下载成功

type BarStatString

type BarStatString struct {
	// TotalLength 文件总大小
	TotalLength string
	// CompletedLength 已下载大小
	CompletedLength string
	// DownloadSpeed 文件每秒下载速度
	DownloadSpeed string
	// EstimatedTime 预计下载完成还需要的时间
	EstimatedTime string
	// Progress 下载进度, 长度为 100
	Progress string
	// Saucer 进度条
	Saucer string
}

BarStatString 注入到模版中的字符串结构 {{.CompletedLength}} / {{.TotalLength}} {{.Saucer}} {{.Progress}}% {{.DownloadSpeed}} {{.EstimatedTime}}

type BarTemplate

type BarTemplate struct {
	// Template 模版
	Template *template.Template
	// NoSizeTemplate 获取不到文件大小时的模板
	NoSizeTemplate *template.Template
	// Saucer 进度字符, 默认为 =
	Saucer string
	// SaucerHead 进度条头, 使用场景 =====> , 其中的 > 就是进度条头, 默认为 >
	SaucerHead string
	// SaucerPadding 进度空白字符, 默认为 -
	SaucerPadding string
	// BarStart 进度前缀, 默认为 [
	BarStart string
	// BarEnd 进度后缀, 默认为 ]
	BarEnd string
	// BarWidth 进度条宽度, 默认为 80
	BarWidth int
}

BarTemplate 进度条显示内容的参数

type Block

type Block struct {
	Start int64 `json:"start"`
	End   int64 `json:"end"`
	// contains filtered or unexported fields
}

block 下载块

type Breakpoint

type Breakpoint struct {
	// filesize 资源大小
	Filesize int64 `json:"filesize"`
	// etag 资源唯一标识
	Etag string `json:"etag"`
	// position 未分配任务的起始位置
	Position int64 `json:"position"`
	// tasks 已分配的未完成任务
	Tasks []*Block `json:"tasks"`
}

breakpoint 断点

type Config

type Config struct {
	// RoutineCount 多协程下载时最多同时下载一个文件的最大协程,默认为 1
	RoutineCount int
	// RoutineSize 多协程下载时每个协程下载的大小,默认为 10M
	RoutineSize int64
	// diskCache 磁盘缓冲区大小,默认为 1M
	DiskCache int
	// speedLimit 下载速度限制,默认为 0 无限制
	SpeedLimit int
	// createDir 当需要创建目录时,是否创建目录,默认为 true
	CreateDir bool
	// allowOverwrite 是否允许覆盖文件,默认为 false
	AllowOverwrite bool
	// autoFileRenaming 文件自动重命名,新文件名在名称之后扩展名之前加上一个点和一个数字(1..9999)。默认:true
	AutoFileRenaming bool
	// AutoFilterFilename 自动过滤掉文件名称中的非法字符
	AutoFilterFilename bool
	// breakpointResume 是否启用断点续传,默认为 true
	BreakpointResume bool
	// timeout 下载总超时时间,默认为 10 分钟
	Timeout time.Duration
	// retryNumber 最多重试次数,默认为 5
	RetryNumber int
	// retryTime 重试时的间隔时间,默认为 0
	RetryTime time.Duration
	// BreakpointExt 断点文件扩展, 默认为 .temp.rain
	BreakpointExt string
}

Config 配置

func NewConfig

func NewConfig() *Config

NewConfig 创建默认配置

func (*Config) Clone added in v0.4.0

func (cfg *Config) Clone() *Config

Clone 拷贝数据

type EventExtend added in v0.2.0

type EventExtend struct {
	// Stat 信息
	*Stat
	// DownloadSpeed 每秒下载字节数
	DownloadSpeed int64
	// EstimatedTime 预计下载完成还需要的时间
	EstimatedTime time.Duration
	// contains filtered or unexported fields
}

func (*EventExtend) AddEvent added in v0.2.0

func (se *EventExtend) AddEvent(e ...ProgressEventExtend)

AddEvent 新增事件

func (*EventExtend) Change added in v0.2.0

func (se *EventExtend) Change(stat *Stat)

Change 检查更新

type MultiReadable added in v0.4.0

type MultiReadable struct {
	// contains filtered or unexported fields
}

MultiReadable 重复读取 reader

func NewMultiReadable added in v0.4.0

func NewMultiReadable(reader io.Reader) *MultiReadable

func (*MultiReadable) Close added in v0.4.0

func (mr *MultiReadable) Close() error

func (*MultiReadable) Read added in v0.4.0

func (mr *MultiReadable) Read(p []byte) (int, error)

func (*MultiReadable) Reset added in v0.4.0

func (mr *MultiReadable) Reset() error

type OptionFunc

type OptionFunc func(ctl *control)

OptionFunc 参数

func WithAllowOverwrite

func WithAllowOverwrite(d bool) OptionFunc

WithAllowOverwrite 设置是否允许覆盖下载文件

func WithAutoFileRenaming

func WithAutoFileRenaming(d bool) OptionFunc

WithAutoFileRenaming 设置是否自动重命名文件,新文件名在名称之后扩展名之前加上一个点和一个数字(1..9999)

func WithAutoFilterFilename

func WithAutoFilterFilename(d bool) OptionFunc

WithAutoFilterFilename 设置是否自动过滤掉文件名称中的非法字符

func WithBar added in v0.2.0

func WithBar(bars ...*Bar) OptionFunc

WithBar 进度条

func WithBody

func WithBody(d io.Reader) OptionFunc

WithBody 设置默认请求 Body

func WithBreakpointExt

func WithBreakpointExt(d string) OptionFunc

WithBreakpointExt 断点文件扩展, 默认为 .temp.rain

func WithBreakpointResume

func WithBreakpointResume(d bool) OptionFunc

WithBreakpointResume 设置是否启用断点续传

func WithClient

func WithClient(d *http.Client) OptionFunc

WithClient 设置默认请求客户端

func WithCreateDir

func WithCreateDir(d bool) OptionFunc

WithCreateDir 设置是否可以创建目录

func WithDebug added in v0.4.0

func WithDebug(d bool) OptionFunc

WithDebug 设置 debug 调试信息开关

func WithDiskCache

func WithDiskCache(d int) OptionFunc

WithDiskCache 设置磁盘缓冲区大小

func WithEvent

func WithEvent(e ...ProgressEvent) OptionFunc

WithEvent 事件监听

func WithEventExtend added in v0.2.0

func WithEventExtend(e ...ProgressEventExtend) OptionFunc

WithEventExtend 事件监听

func WithHeader

func WithHeader(d func(h http.Header)) OptionFunc

WithHeader 设置默认请求 Header

func WithMethod

func WithMethod(d string) OptionFunc

WithMethod 设置默认请求方式

func WithOutdir

func WithOutdir(outdir string) OptionFunc

WithOutdir 文件输出目录

func WithOutname

func WithOutname(outname string) OptionFunc

WithOutname 文件输出名称

func WithOutpath added in v0.4.5

func WithOutpath(outpath string) OptionFunc

WithOutpath 文件输出路径

func WithPerm

func WithPerm(d fs.FileMode) OptionFunc

WithPerm 设置默认输出文件权限

func WithRetryNumber

func WithRetryNumber(d int) OptionFunc

WithRetryNumber 设置请求重试次数

func WithRetryTime

func WithRetryTime(d time.Duration) OptionFunc

WithRetryNumber 设置请求重试的间隔时间

func WithRoutineCount

func WithRoutineCount(d int) OptionFunc

WithRoutineCount 设置协程最大数

func WithRoutineSize

func WithRoutineSize(d int64) OptionFunc

WithRoutineSize 设置协程下载最大字节数

func WithSpeedLimit

func WithSpeedLimit(d int) OptionFunc

WithSpeedLimit 设置下载速度限制

func WithTimeout

func WithTimeout(d time.Duration) OptionFunc

WithTimeout 设置下载超时时间

type ProgressEvent

type ProgressEvent interface {
	Change(stat *Stat)
}

ProgressEvent 进度事件

func NewEventExtend added in v0.2.0

func NewEventExtend(e ...ProgressEventExtend) ProgressEvent

type ProgressEventExtend added in v0.2.0

type ProgressEventExtend interface {
	// Change 进度变化
	Change(stat *EventExtend)
	// Close 中途暂停
	Close(stat *EventExtend)
	// Error 出现错误
	Error(stat *EventExtend)
	// Finish 下载成功
	Finish(stat *EventExtend)
}

ProgressEventExtend 进度事件扩展

type Rain

type Rain struct {
	// contains filtered or unexported fields
}

Rain 下载器

func NewRain

func NewRain() *Rain

NewRain 创建一个新的下载器

func (*Rain) AddOptions added in v0.3.0

func (rain *Rain) AddOptions(opt ...OptionFunc)

AddOptions 添加 New 时的 option

func (*Rain) New

func (rain *Rain) New(uri string, opts ...OptionFunc) *RainControl

New 创建下载控制器

func (*Rain) ReplaceHeader

func (rain *Rain) ReplaceHeader(h http.Header)

ReplaceHeader 替换默认请求的 Header

func (*Rain) SetAllowOverwrite

func (rain *Rain) SetAllowOverwrite(d bool)

SetAllowOverwrite 设置是否允许覆盖下载文件

func (*Rain) SetAutoFileRenaming

func (rain *Rain) SetAutoFileRenaming(d bool)

SetAutoFileRenaming 设置是否自动重命名文件,新文件名在名称之后扩展名之前加上一个点和一个数字(1..9999)

func (*Rain) SetAutoFilterFilename

func (rain *Rain) SetAutoFilterFilename(d bool)

SetAutoFilterFilename 设置是否自动过滤掉文件名称中的非法字符

func (*Rain) SetBody

func (rain *Rain) SetBody(d io.Reader)

SetBody 设置默认请求 Body

func (*Rain) SetBreakpointExt

func (rain *Rain) SetBreakpointExt(d string)

SetBreakpointExt 断点文件扩展, 默认为 .temp.rain

func (*Rain) SetBreakpointResume

func (rain *Rain) SetBreakpointResume(d bool)

SetBreakpointResume 设置是否启用断点续传

func (*Rain) SetClient

func (rain *Rain) SetClient(d *http.Client)

SetClient 设置默认请求客户端

func (*Rain) SetCreateDir

func (rain *Rain) SetCreateDir(d bool)

SetCreateDir 设置是否可以创建目录

func (*Rain) SetDiskCache

func (rain *Rain) SetDiskCache(d int)

SetDiskCache 设置磁盘缓冲区大小

func (*Rain) SetHeader

func (rain *Rain) SetHeader(k, v string)

SetHeader 设置默认请求 Header

func (*Rain) SetMethod

func (rain *Rain) SetMethod(d string)

SetMethod 设置默认请求方式

func (*Rain) SetOptions added in v0.3.0

func (rain *Rain) SetOptions(opt []OptionFunc)

SetOptions 设置 New 时的 option

func (*Rain) SetOutdir

func (rain *Rain) SetOutdir(d string)

SetOutdir 设置文件默认输出目录

func (*Rain) SetPerm

func (rain *Rain) SetPerm(d fs.FileMode)

SetPerm 设置默认输出文件权限

func (*Rain) SetProxy added in v0.4.0

func (rain *Rain) SetProxy(p func(*http.Request) (*url.URL, error), h ...http.Header) error

SetProxy 设置客户端代理

func (*Rain) SetRetryNumber

func (rain *Rain) SetRetryNumber(d int)

SetRetryNumber 设置请求重试次数

func (*Rain) SetRetryTime

func (rain *Rain) SetRetryTime(d time.Duration)

SetRetryNumber 设置请求重试的间隔时间

func (*Rain) SetRoutineCount

func (rain *Rain) SetRoutineCount(d int)

SetRoutineCount 设置协程最大数

func (*Rain) SetRoutineSize

func (rain *Rain) SetRoutineSize(d int64)

SetRoutineSize 设置协程下载最大字节数

func (*Rain) SetSpeedLimit

func (rain *Rain) SetSpeedLimit(d int)

SetSpeedLimit 设置下载速度限制

func (*Rain) SetTimeout

func (rain *Rain) SetTimeout(d time.Duration)

SetTimeout 设置下载超时时间

type RainControl

type RainControl struct {
	// contains filtered or unexported fields
}

RainControl 下载控制器

func New

func New(uri string, opts ...OptionFunc) *RainControl

New 创建下载控制器

func (*RainControl) Close

func (rc *RainControl) Close()

Close 关闭下载

func (*RainControl) Error

func (rc *RainControl) Error() error

Error 获取错误

func (*RainControl) Outpath

func (rc *RainControl) Outpath() string

Outpath 获取输出位置

func (*RainControl) Run

func (rc *RainControl) Run() (*RainControl, error)

Run 阻塞运行下载

func (*RainControl) RunContext

func (rc *RainControl) RunContext(ctx context.Context) (*RainControl, error)

RunContext 基于 Context 阻塞运行下载

func (*RainControl) SetSpeedLimit added in v0.3.0

func (rc *RainControl) SetSpeedLimit(d int)

SetSpeedLimit 设置下载限速,0 为不限速

func (*RainControl) Start

func (rc *RainControl) Start() (*RainControl, error)

Start 非阻塞运行下载

func (*RainControl) StartContext

func (rc *RainControl) StartContext(ctx context.Context) (*RainControl, error)

StartContext 基于 Context 非阻塞运行下载

func (*RainControl) Status added in v0.4.1

func (rc *RainControl) Status() Status

Status 获取下载状态

func (*RainControl) Wait

func (rc *RainControl) Wait() error

Wait 阻塞

func (*RainControl) WaitChan added in v0.4.0

func (rc *RainControl) WaitChan() <-chan error

WaitChan 阻塞返回 channel

type Stat

type Stat struct {
	// Status 状态
	Status Status
	// TotalLength 文件总大小
	TotalLength int64
	// CompletedLength 已下载的文件大小
	CompletedLength int64
	// Progress 进度
	Progress int
	// Outpath 文件输出路径
	Outpath string
	// Error 下载错误信息
	Error error
}

Stat 下载进行中的信息

type Status

type Status int

Status 运行状态

func (Status) Is added in v0.4.0

func (s Status) Is(ss ...Status) bool

Is 列表中是否有相同值

Directories

Path Synopsis
example

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL