handler

package
v0.0.7 Latest Latest
Warning

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

Go to latest
Published: Dec 4, 2025 License: MIT Imports: 26 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrLoginTimeout = errors.New("login_timeout")

ErrLoginTimeout 登录超时的哨兵错误

用途: - 当登录流程超时时返回此错误,有两种超时情况:

  1. UI 倒计时结束(50秒无人扫码)
  2. 轮询次数耗尽(10次轮询×5秒=50秒都失败)

处理流程:

  1. 超时发生 → UI 显示橙色"登录超时,请重试"提示
  2. qrcode.ShowQRCodeWithCallback 向 timeoutChan 发送通知(情况1) 或 pollDeviceTokenWithQRCode 的 errChan 接收到此错误(情况2)
  3. pollDeviceTokenWithQRCode 返回此错误
  4. CmdLogin 检测到此错误后返回 nil,静默退出(避免重复显示错误)

设计原因: - UI 已经显示了友好的超时提示,无需在外层再次打印 "Error: 登录超时,请重试" - 两种超时情况统一使用同一个错误,简化上层处理逻辑 - 超时时间(50秒)是轮询间隔(5秒)× 最大次数(10)的结果,与 UI 显示时间保持一致

View Source
var ErrUserCanceled = errors.New("user_canceled")

ErrUserCanceled 用户取消操作的哨兵错误

用途: - 当用户在二维码登录界面按 q、Ctrl+C 或 Esc 键主动取消登录时返回此错误 - 使用哨兵错误模式,可以通过 errors.Is() 精确识别错误类型

处理流程: 1. 用户按键 → UI 显示红色"登录已取消"提示 2. qrcode.ShowQRCodeWithCallback 向 cancelChan 发送通知 3. pollDeviceTokenWithQRCode 接收通知并返回此错误 4. CmdLogin 检测到此错误后返回 nil,静默退出(避免重复显示错误)

设计原因: - UI 已经显示了友好的取消提示,无需在外层再次打印 "Error: user_canceled" - 使用哨兵错误可以区分用户主动取消和其他真正的错误

Functions

func FormatPath

func FormatPath(path string) string

func PrintFileInfo added in v0.0.3

func PrintFileInfo(file *bdpan.FileInfo)

Types

type AuthHandler

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

func GetAuthHandler

func GetAuthHandler() *AuthHandler

func (*AuthHandler) CmdLogin

func (h *AuthHandler) CmdLogin(req *dto.LoginReq) error

func (*AuthHandler) GetPan

func (h *AuthHandler) GetPan() (*model.Pan, error)

func (*AuthHandler) GetPanFromDB

func (h *AuthHandler) GetPanFromDB() *model.Pan

func (*AuthHandler) GetUser

func (h *AuthHandler) GetUser() (*model.User, error)

func (*AuthHandler) NewPan

func (h *AuthHandler) NewPan(panInfo *bdpan.GetPanInfoRes) *model.Pan

func (*AuthHandler) RefreshPan

func (h *AuthHandler) RefreshPan() (*model.Pan, error)

type FileHandler

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

func GetFileHandler

func GetFileHandler() *FileHandler

func (*FileHandler) BatchRenameFiles added in v0.0.3

func (h *FileHandler) BatchRenameFiles(files []*model.File) (*bdpan.ManageFileRes, error)

批量重命名文件列表

func (*FileHandler) CmdBackup added in v0.0.3

func (h *FileHandler) CmdBackup(req *dto.BackupReq) error

func (*FileHandler) CmdDelete

func (h *FileHandler) CmdDelete(req *dto.DeleteReq) error

func (*FileHandler) CmdDownload

func (h *FileHandler) CmdDownload(req *dto.DownloadReq) error

执行下载命令

参数: - req: 具体字段描述见 cmd/download.ga init() 中每个 cobra.Command 初始化 usage 字段

返回: - error: 错误信息

实现逻辑:

1. 根据路径查找文件信息 2. 判断是文件夹还是文件,分别调用对应方法 3. 如果是文件夹,调用 h.DownloadDir 4. 如果是文件,调用 h.DownloadFile 5. 输出下载结果 6. 意外失败,使用 logger.Errorf 写入日志,返回友好错误信息,提示 bdpan log 查看原因

func (*FileHandler) CmdRefresh

func (h *FileHandler) CmdRefresh(req *dto.RefreshReq) error

func (*FileHandler) CmdUpload added in v0.0.3

func (h *FileHandler) CmdUpload(req *dto.UploadReq) error

func (*FileHandler) DeleteFiles

func (h *FileHandler) DeleteFiles(paths ...string) (*bdpan.ManageFileRes, error)

func (*FileHandler) DownloadDir added in v0.0.5

func (h *FileHandler) DownloadDir(file *bdpan.FileInfo, req *dto.DownloadReq) (string, error)

下载文件夹

参数: - file: 查询到的百度文件夹实例 - req: 具体字段描述见 cmd/download.ga init() 中每个 cobra.Command 初始化 usage 字段

返回: - string: 下载的文件夹路径 - error: 错误信息

实现逻辑:

1. 获取文件夹下的所有文件列表(递归) 2. 使用 `bdtools.BatchGetFileInfos` 批量获取文件详情(包含下载链接) 3. 并发下载文件,默认并发数 3 4. 显示下载进度,统计已下载/总数量 5. 任务检测(幂等):使用 `taskstore.BuildIdentitySHA1("download","dir", 源目录Path, 输出目录)` 生成稳定 identity 6. 任务领取:`taskstore.ClaimOrCreate` 若已有“运行中且仍存活”的任务则返回 attached=true 并直接退出;否则创建/接管并返回 task_id 7. 心跳与取消:循环每 5s `taskstore.Heartbeat` 更新进度,若返回 cancelRequested==true 则取消父上下文协作退出

func (*FileHandler) DownloadFile added in v0.0.5

func (h *FileHandler) DownloadFile(file *bdpan.FileInfo, req *dto.DownloadReq) (string, error)

分片断点下载文件

参数: - file: 查询到的百度文件实例 - req: 具体字段描述见 cmd/download.ga init() 中每个 cobra.Command 初始化 usage 字段

返回: - string: 下载的文件路径 - error: 错误信息

实现逻辑:

1. 确定输出文件路径(优先级: OutputPath > OutputDir + filename) 2. 处理文件名冲突(数字后缀递增) 3. 创建缓存目录(使用 config.GetCacheDir() + file.MD5),下载完成后缓存目录需要一并删除 4. 创建分片下载器,设置分片大小为 5MB 5. 设置并发数(同步模式为 1,异步模式为 4) 6. 设置进度回调函数,显示下载进度 7. 开始下载,支持断点续传 8. 进度条样式使用 https://github.com/charmbracelet/bubbletea/tree/main/examples/progress-download 9. 使用file.Dlink时,必须在请求header中设置User-Agent字段为pan.baidu.com 10. 进度条与上下文字必须左对齐,禁止在信息行和提示行前添加前导空格 11. 任务检测(幂等):使用 `taskstore.BuildIdentitySHA1("download","file", 源文件Path, 输出目录)` 生成稳定 identity,避免因目标文件重命名导致命中失败 12. 任务领取:`taskstore.ClaimOrCreate` 若已有“运行中且仍存活”的任务则返回 attached=true 并直接退出;否则创建/接管并返回 task_id 13. 心跳与取消:循环每 5s `taskstore.Heartbeat` 更新进度,若返回 cancelRequested==true 则取消下载上下文

func (*FileHandler) GetAccessToken added in v0.0.3

func (h *FileHandler) GetAccessToken() string

func (*FileHandler) GetDirAllFiles

func (h *FileHandler) GetDirAllFiles(dir string) ([]*bdpan.FileInfo, error)

func (*FileHandler) GetFileByPath

func (h *FileHandler) GetFileByPath(path string) (*bdpan.FileInfo, error)

根据地址查找文件 在文件目录中循环查找是否有该名称文件

func (*FileHandler) GetFiles

func (h *FileHandler) GetFiles(dir string, page int) ([]*model.File, error)

func (*FileHandler) GetFilesAndSave

func (h *FileHandler) GetFilesAndSave(dir string, page int) ([]*model.File, error)

func (*FileHandler) GetFilesFromDBOrReal

func (h *FileHandler) GetFilesFromDBOrReal(dir string, page int) ([]*model.File, error)

func (*FileHandler) Limit

func (h *FileHandler) Limit(l int32) *FileHandler

func (*FileHandler) MoveFiles

func (h *FileHandler) MoveFiles(dir string, paths ...string) (*bdpan.ManageFileRes, error)

func (*FileHandler) RenameFile added in v0.0.3

func (h *FileHandler) RenameFile(pathS, newName string) (*bdpan.ManageFileRes, error)

func (*FileHandler) UploadDir added in v0.0.3

func (h *FileHandler) UploadDir(req *dto.UploadReq, fromDir, toDir string) error

上传文件夹

func (*FileHandler) UploadFile added in v0.0.3

func (h *FileHandler) UploadFile(
	req *dto.UploadReq,
	fromPath, toPath string,
	toFile *bdpan.FileInfo,
	printFile bool,
	args ...any,
) error

上传文件 上传之前查看上传记录

如果有记录直接对比两次文件的远程 md5 是否相同
如果没有记录,则需要对比本地和远程记录,较慢

req.IsRewrite = true 时,直接执行覆盖上传 req.IsRewrite = false 时

如果本地文件和远程文件md5相同,打印信息直接返回
如果本地文件和远程文件md5不相同,则询问是否覆盖

上传成功后需要保存上传记录

type Request added in v0.0.4

type Request struct {
	ID        string
	GlobalReq dto.GlobalReq
}

func GetRequest added in v0.0.4

func GetRequest() *Request

func (Request) GetConfigPath added in v0.0.4

func (r Request) GetConfigPath() string

Jump to

Keyboard shortcuts

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