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"`
|
CdnServer string `json:"cdn_server"`
|
||||||
BackupCdnServer string `json:"backup_cdn_server"`
|
BackupCdnServer string `json:"backup_cdn_server"`
|
||||||
OverrideServerConfig OverrideServerConfig `json:"override_server_config"`
|
OverrideServerConfig OverrideServerConfig `json:"override_server_config"`
|
||||||
|
OverrideFileSize []OverrideFileSize `json:"override_file_size"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type OverrideServerConfig struct {
|
type OverrideServerConfig struct {
|
||||||
@@ -40,6 +41,11 @@ type OverrideFileSource struct {
|
|||||||
Size int `json:"size"`
|
Size int `json:"size"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OverrideFileSize struct {
|
||||||
|
TargetOs string `json:"target_os"`
|
||||||
|
FileName string `json:"file_name"`
|
||||||
|
}
|
||||||
|
|
||||||
func InitConfig() {
|
func InitConfig() {
|
||||||
Conf = Load("./config.json")
|
Conf = Load("./config.json")
|
||||||
}
|
}
|
||||||
@@ -51,6 +57,7 @@ func DefaultConfigs() *AppConfigs {
|
|||||||
ListenPort: "8080",
|
ListenPort: "8080",
|
||||||
CdnServer: "http://127.0.0.1:8080/static",
|
CdnServer: "http://127.0.0.1:8080/static",
|
||||||
BackupCdnServer: "",
|
BackupCdnServer: "",
|
||||||
|
OverrideFileSize: []OverrideFileSize{},
|
||||||
OverrideServerConfig: OverrideServerConfig{
|
OverrideServerConfig: OverrideServerConfig{
|
||||||
Enable: false,
|
Enable: false,
|
||||||
Android: OverrideFileSource{
|
Android: OverrideFileSource{
|
||||||
|
|||||||
@@ -30,6 +30,25 @@
|
|||||||
|
|
||||||
`size` 可选,填 `0` 会在服务端请求该 URL 自动探测文件大小;如果你已知大小,建议直接填写可减少请求开销。
|
`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 测试
|
### SIF 测试
|
||||||
|
|||||||
@@ -82,6 +82,8 @@ func update(ctx *gin.Context) {
|
|||||||
Version: config.PackageVersion,
|
Version: config.PackageVersion,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
applyOverrideFileSize(downloadReq.TargetOs, pkgList)
|
||||||
}
|
}
|
||||||
|
|
||||||
ss.Respond(downloadschema.UpdateResp{
|
ss.Respond(downloadschema.UpdateResp{
|
||||||
@@ -128,6 +130,45 @@ func getRemoteFileSize(url string) int {
|
|||||||
return int(dataLen)
|
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() {
|
func init() {
|
||||||
router.AddHandler("main.php", "POST", "/download/update", middleware.Common, update)
|
router.AddHandler("main.php", "POST", "/download/update", middleware.Common, update)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user