Skip to content

feat(guangyapan): add GuangYaPan driver and offline download support#2583

Open
zjhcx wants to merge 8 commits into
OpenListTeam:mainfrom
zjhcx:guangyapan
Open

feat(guangyapan): add GuangYaPan driver and offline download support#2583
zjhcx wants to merge 8 commits into
OpenListTeam:mainfrom
zjhcx:guangyapan

Conversation

@zjhcx
Copy link
Copy Markdown

@zjhcx zjhcx commented Jun 5, 2026

Summary / 摘要

  • Add GuangYaPan driver integration with listing, upload, move, copy, rename, delete, and root folder support.

  • Add GuangYaPan offline download integration and wire it into the existing offline download entrypoints and routes.

  • Support custom GuangYaPan root folder path resolution, expose sorting options, and add batch copy rate limiting to avoid API flooding.

  • Remove the OnlyLocal offline config usage in GuangYaPan and add the required go-cache dependency.

  • This PR has breaking changes.
    / 此 PR 包含破坏性变更。

  • This PR changes public API, config, storage format, or migration behavior.
    / 此 PR 修改了公开 API、配置、存储格式或迁移行为。

  • This PR requires corresponding changes in related repositories.
    / 此 PR 需要关联仓库同步修改。

Related repository PRs / 关联仓库 PR:

  • OpenList-Frontend:
  • OpenList-Docs:

Related Issues / 关联 Issue

#170
#2398 #2278 #2386 #2385 #2417 #2410 #2424 #2367 #2449

Testing / 测试

  • go test ./...
    Fails in unrelated existing packages because of repository-wide build/test issues, including non-constant format string errors in multiple non-GuangYaPan packages and pkg/aria2/rpc tests requiring a local service on 127.0.0.1:6800.
  • Manual test / 手动测试:
    Not run in this PR flow.

Checklist / 检查清单

  • I have read CONTRIBUTING.
    / 我已阅读 CONTRIBUTING
  • I confirm this contribution follows the repository license, contribution policy, and code of conduct.
    / 我确认此贡献符合仓库许可证、贡献规范和行为准则。
  • I have formatted the changed code with gofmt, go fmt, or prettier where applicable.
    / 我已按适用情况使用 gofmtgo fmtprettier 格式化变更代码。
  • I have requested review from relevant maintainers or code owners where applicable.
    / 我已在适用情况下请求相关维护者或代码所有者审查。

AI Disclosure / AI 使用声明

  • This PR includes AI-assisted content.
    / 此 PR 包含 AI 辅助内容。

Tools used / 使用工具:

  • ChatGPT
  • Codex
  • GitHub Copilot
  • Claude
  • Gemini
  • Other (please specify) / 其他(请注明):

Usage scope / 使用范围:

  • Code generation / 代码生成

  • Refactoring / 重构

  • Documentation / 文档

  • Tests / 测试

  • Translation / 翻译

  • Review assistance / 审查辅助

  • I have reviewed and validated all AI-assisted content included in this PR.
    / 我已审核并验证此 PR 中的所有 AI 辅助内容。

  • I have ensured that all AI-assisted commits include Co-Authored-By attribution.
    / 我已确保所有 AI 辅助提交都包含 Co-Authored-By 归属信息。

  • I can reproduce all AI-assisted content included in this PR without any AI tools.
    / 我可以在没有任何 AI 工具的情况下重现此 PR 中包含的所有 AI 辅助内容。

okatu-loli and others added 8 commits June 5, 2026 22:18
Implement GuangYaPan storage adapter and register driver.

Includes:
- SMS/captcha login flow with token refresh
- list/link operations
- mkdir/rename/remove/move/copy
- upload via res_center token + OSS multipart + task polling
- compatibility fixes for provider type, endpoint normalization, and upload status codes

(cherry picked from commit 06cb5ee555e6c0936d7b0780bf9a563e9aba8ea8)
fix #9493
allow users to mount a guangyapan subfolder

(cherry picked from commit dba5c279ca72faa322cde125cc0b62566a39153b)
(cherry picked from commit 4a23e6a506b191d702ebb56ac5cdae53e0378a4e)
(cherry picked from commit 6af0b4958a8010d0597ea8af1ef698ae3e285393)
(cherry picked from commit de56968a2d59d1cdd67cdafd68cfa1ee7024d6ea)
Every GuangYaPan API call funnels through postAPI with no throttling, so
copying many files cross-storage fired unthrottled Link/copy/list requests
and overwhelmed the upstream API. Other Chinese pan drivers (123,
aliyundrive_open) self-throttle; guangya did not.

Add a per-endpoint rate.Limiter (one request per 500ms, applied in postAPI),
mirroring the 123 driver's APIRateLimit pattern, so concurrent copy tasks are
paced instead of flooding.

(cherry picked from commit 15f6380b127fc27f7885b47d873608f81d4c4a42)
@jyxjjj
Copy link
Copy Markdown
Member

jyxjjj commented Jun 5, 2026

@zjhcx
Copy link
Copy Markdown
Author

zjhcx commented Jun 5, 2026

怎么了

Comment thread go.sum
Comment on lines +68 to +69
github.com/Xhofe/go-cache v0.0.0-20240804043513-b1a71927bc21 h1:h6q5E9aMBhhdqouW81LozVPI1I+Pu6IxL2EKpfm5OjY=
github.com/Xhofe/go-cache v0.0.0-20240804043513-b1a71927bc21/go.mod h1:sSBbaOg90XwWKtpT56kVujF0bIeVITnPlssLclogS04=
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

Comment thread go.mod
github.com/ProtonMail/go-srp v0.0.7 // indirect
github.com/PuerkitoBio/goquery v1.10.3 // indirect
github.com/RoaringBitmap/roaring/v2 v2.4.5 // indirect
github.com/Xhofe/go-cache v0.0.0-20240804043513-b1a71927bc21 // indirect
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

)

type Addition struct {
RootPath string `json:"root_path" help:"光鸭云盘中的完整路径"`
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

help字段不要出现中文

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

工具类函数不要放driver.go里面

const (
accountBaseURL = "https://account.guangyapan.com"
apiBaseURL = "https://api.guangyapan.com"
defaultClient = "aMe-8VSlkrbQXpUR"
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不要包含逆向参数

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

未实现 GetDetails

func (d *GuangYaPan) GetDetails(ctx context.Context) (*model.StorageDetails, error) {
	var resp assetsInfoResp

	if err := d.postAPI(ctx, "/nd.bizassets.s/v1/get_assets", nil, &resp); err != nil {
		return nil, err
	}
	if resp.Data.TotalSpaceSize <= 0 {
		return nil, errors.New("invalid total space size")
	}
	return &model.StorageDetails{
		DiskUsage: model.DiskUsage{
			TotalSpace: resp.Data.TotalSpaceSize,
			UsedSpace:  resp.Data.UsedSpaceSize,
		},
	}, nil
}

// types.go
type assetsInfoResp struct {
	Msg  string `json:"msg"`
	Data struct {
		TotalSpaceSize int64 `json:"totalSpaceSize"`
		UsedSpaceSize  int64 `json:"usedSpaceSize"`
		// VipStatus      int   `json:"vipStatus"`
		// VipLeftTime    int   `json:"vipLeftTime"`
		// SvipStatus     int   `json:"svipStatus"`
		// VipExpireTime  int   `json:"vipExpireTime"`
		// SystemTime     int   `json:"systemTime"`
	} `json:"data"`
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants