Documentation
¶
Index ¶
- Variables
- func FormatPath(path string) string
- func PrintFileInfo(file *bdpan.FileInfo)
- type AuthHandler
- func (h *AuthHandler) CmdLogin(req *dto.LoginReq) error
- func (h *AuthHandler) GetPan() (*model.Pan, error)
- func (h *AuthHandler) GetPanFromDB() *model.Pan
- func (h *AuthHandler) GetUser() (*model.User, error)
- func (h *AuthHandler) NewPan(panInfo *bdpan.GetPanInfoRes) *model.Pan
- func (h *AuthHandler) RefreshPan() (*model.Pan, error)
- type FileHandler
- func (h *FileHandler) BatchRenameFiles(files []*model.File) (*bdpan.ManageFileRes, error)
- func (h *FileHandler) CmdBackup(req *dto.BackupReq) error
- func (h *FileHandler) CmdDelete(req *dto.DeleteReq) error
- func (h *FileHandler) CmdDownload(req *dto.DownloadReq) error
- func (h *FileHandler) CmdRefresh(req *dto.RefreshReq) error
- func (h *FileHandler) CmdUpload(req *dto.UploadReq) error
- func (h *FileHandler) DeleteFiles(paths ...string) (*bdpan.ManageFileRes, error)
- func (h *FileHandler) DownloadDir(file *bdpan.FileInfo, req *dto.DownloadReq) (string, error)
- func (h *FileHandler) DownloadFile(file *bdpan.FileInfo, req *dto.DownloadReq) (string, error)
- func (h *FileHandler) GetAccessToken() string
- func (h *FileHandler) GetDirAllFiles(dir string) ([]*bdpan.FileInfo, error)
- func (h *FileHandler) GetFileByPath(path string) (*bdpan.FileInfo, error)
- func (h *FileHandler) GetFiles(dir string, page int) ([]*model.File, error)
- func (h *FileHandler) GetFilesAndSave(dir string, page int) ([]*model.File, error)
- func (h *FileHandler) GetFilesFromDBOrReal(dir string, page int) ([]*model.File, error)
- func (h *FileHandler) Limit(l int32) *FileHandler
- func (h *FileHandler) MoveFiles(dir string, paths ...string) (*bdpan.ManageFileRes, error)
- func (h *FileHandler) RenameFile(pathS, newName string) (*bdpan.ManageFileRes, error)
- func (h *FileHandler) UploadDir(req *dto.UploadReq, fromDir, toDir string) error
- func (h *FileHandler) UploadFile(req *dto.UploadReq, fromPath, toPath string, toFile *bdpan.FileInfo, ...) error
- type Request
Constants ¶
This section is empty.
Variables ¶
var ErrLoginTimeout = errors.New("login_timeout")
ErrLoginTimeout 登录超时的哨兵错误
用途: - 当登录流程超时时返回此错误,有两种超时情况:
- UI 倒计时结束(50秒无人扫码)
- 轮询次数耗尽(10次轮询×5秒=50秒都失败)
处理流程:
- 超时发生 → UI 显示橙色"登录超时,请重试"提示
- qrcode.ShowQRCodeWithCallback 向 timeoutChan 发送通知(情况1) 或 pollDeviceTokenWithQRCode 的 errChan 接收到此错误(情况2)
- pollDeviceTokenWithQRCode 返回此错误
- CmdLogin 检测到此错误后返回 nil,静默退出(避免重复显示错误)
设计原因: - UI 已经显示了友好的超时提示,无需在外层再次打印 "Error: 登录超时,请重试" - 两种超时情况统一使用同一个错误,简化上层处理逻辑 - 超时时间(50秒)是轮询间隔(5秒)× 最大次数(10)的结果,与 UI 显示时间保持一致
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 PrintFileInfo ¶ added in v0.0.3
Types ¶
type AuthHandler ¶
type AuthHandler struct {
// contains filtered or unexported fields
}
func GetAuthHandler ¶
func GetAuthHandler() *AuthHandler
func (*AuthHandler) GetPanFromDB ¶
func (h *AuthHandler) GetPanFromDB() *model.Pan
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) 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) GetFilesAndSave ¶
func (*FileHandler) GetFilesFromDBOrReal ¶
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不相同,则询问是否覆盖
上传成功后需要保存上传记录