Add support for package size override

Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
2026-06-01 21:48:41 +08:00
parent 8a7d7ccb93
commit 897851a2eb
3 changed files with 70 additions and 3 deletions
+7
View File
@@ -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")
}
@@ -51,6 +57,7 @@ func DefaultConfigs() *AppConfigs {
ListenPort: "8080",
CdnServer: "http://127.0.0.1:8080/static",
BackupCdnServer: "",
OverrideFileSize: []OverrideFileSize{},
OverrideServerConfig: OverrideServerConfig{
Enable: false,
Android: OverrideFileSource{
+19
View File
@@ -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 测试
+41
View File
@@ -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)
}