Add support for package size override
Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
@@ -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{
|
||||
|
||||
@@ -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 测试
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user