From 897851a2ebb57808447475f427899f9bff8ee118 Mon Sep 17 00:00:00 2001 From: Sean Du Date: Mon, 1 Jun 2026 19:22:22 +0800 Subject: [PATCH] Add support for package size override Signed-off-by: Sean Du --- config/config.go | 13 ++++++--- doc/4.md | 19 +++++++++++++ internal/handler/download/update.go | 41 +++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/config/config.go b/config/config.go index 3769003..4d187ca 100644 --- a/config/config.go +++ b/config/config.go @@ -27,6 +27,7 @@ type Settings struct { CdnServer string `json:"cdn_server"` BackupCdnServer string `json:"backup_cdn_server"` OverrideServerConfig OverrideServerConfig `json:"override_server_config"` + OverrideFileSize []OverrideFileSize `json:"override_file_size"` } type OverrideServerConfig struct { @@ -40,6 +41,11 @@ type OverrideFileSource struct { Size int `json:"size"` } +type OverrideFileSize struct { + TargetOs string `json:"target_os"` + FileName string `json:"file_name"` +} + func InitConfig() { Conf = Load("./config.json") } @@ -48,9 +54,10 @@ func DefaultConfigs() *AppConfigs { return &AppConfigs{ AppName: "honoka-chan", Settings: Settings{ - ListenPort: "8080", - CdnServer: "http://127.0.0.1:8080/static", - BackupCdnServer: "", + ListenPort: "8080", + CdnServer: "http://127.0.0.1:8080/static", + BackupCdnServer: "", + OverrideFileSize: []OverrideFileSize{}, OverrideServerConfig: OverrideServerConfig{ Enable: false, Android: OverrideFileSource{ diff --git a/doc/4.md b/doc/4.md index 9f8a964..8696738 100644 --- a/doc/4.md +++ b/doc/4.md @@ -30,6 +30,25 @@ `size` 可选,填 `0` 会在服务端请求该 URL 自动探测文件大小;如果你已知大小,建议直接填写可减少请求开销。 +如果第三方 CDN 上某些包实际文件大小与数据库 `pkg_size` 不一致(例如 `99_0_113.zip`),可以使用 `settings.override_file_size` 覆盖返回给客户端的大小(不改数据库): + +```json +{ + "settings": { + "override_file_size": [ + { + "target_os": "Android", + "file_name": "99_0_113.zip" + } + ] + } +} +``` + +`target_os` 可留空,留空表示对所有系统生效。 + +命中后会按该文件最终下发的 `url` 自动探测大小,并覆盖 `size` 返回值。 + 登录方式为 `手机号密码登录`,都可以随便输。第一次使用的手机号会自动生成账号并记住登录的密码,以及后续的游戏内设置都会保存。 ### SIF 测试 diff --git a/internal/handler/download/update.go b/internal/handler/download/update.go index 206349c..b514e5f 100644 --- a/internal/handler/download/update.go +++ b/internal/handler/download/update.go @@ -82,6 +82,8 @@ func update(ctx *gin.Context) { Version: config.PackageVersion, }) } + + applyOverrideFileSize(downloadReq.TargetOs, pkgList) } ss.Respond(downloadschema.UpdateResp{ @@ -128,6 +130,45 @@ func getRemoteFileSize(url string) int { return int(dataLen) } +func applyOverrideFileSize(targetOs string, pkgList []downloadschema.UpdateData) { + urlSizeCache := map[string]int{} + + for i := range pkgList { + fileName := getFileNameFromURL(pkgList[i].URL) + if fileName == "" { + continue + } + + for _, override := range config.Conf.Settings.OverrideFileSize { + overrideOs := strings.TrimSpace(override.TargetOs) + if overrideOs != "" && !strings.EqualFold(overrideOs, strings.TrimSpace(targetOs)) { + continue + } + if strings.EqualFold(strings.TrimSpace(override.FileName), fileName) { + size, ok := urlSizeCache[pkgList[i].URL] + if !ok { + size = getRemoteFileSize(pkgList[i].URL) + urlSizeCache[pkgList[i].URL] = size + } + + if size > 0 { + pkgList[i].Size = size + } + break + } + } + } +} + +func getFileNameFromURL(rawURL string) string { + urlNoQuery := strings.Split(rawURL, "?")[0] + parts := strings.Split(urlNoQuery, "/") + if len(parts) == 0 { + return "" + } + return strings.TrimSpace(parts[len(parts)-1]) +} + func init() { router.AddHandler("main.php", "POST", "/download/update", middleware.Common, update) }