feat: 视频采集等待支持最长 3600 秒 (#39)

This commit is contained in:
ila
2026-10-07 16:53:01 +08:00
parent 00cfecf746
commit d7578a3383
5 changed files with 41 additions and 12 deletions
+1 -1
View File
@@ -71,7 +71,7 @@ download:
# 仅控制视频 CDN 文件下载;淘宝页面访问保持串行。
concurrency: 2
# 商品和候选详情访问间的等待区间;降低请求量,不保证解除风控。
# 商品和候选详情访问间的等待区间(0—3600 秒);降低请求量,不保证解除风控。
# 默认 10—20 秒是降低负载的起点,不是平台公布的安全阈值。
wait_seconds_min: 10
wait_seconds_max: 20
+3 -3
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Business-Rules-and-Glossary
wiki_url: https://git.ilapage.cn/chengma/cmsp/wiki/Business-Rules-and-Glossary.-
wiki_revision: 3f8176505ad472eb9c7899fb032a41b1b5fa28b4
synchronized_at: 2026-10-07T08:26:24Z
wiki_revision: fdb09a1e0c414d6e4463ae31aa34b7b4970a06d3
synchronized_at: 2026-10-07T08:51:30Z
<!-- gitea-wiki-mirror:end -->
# 业务规则与术语
@@ -122,7 +122,7 @@ MTOP 搜索方式、签名与请求参数保持现状。商品原链接以实际
12. 每个商品下载的视频数量有上限,可在参数设置中调整。
13. 下载先写入临时文件,经 `ffprobe` 校验通过后才改名为正式文件;校验失败视为下载失败。
14. 已存在且非空的目标文件视为已完成,跳过重复下载。
15. 商品及新候选详情之间插入可取消等待,等待区间可配置,用于降低访问负载。
15. 商品及新候选详情之间插入可取消等待,最短和最长等待均可配置为 0—3600 秒,最长不得小于最短;两者相同时使用固定间隔。此等待用于降低访问负载,不保证解除平台限制。
### 货憨憨
+3 -3
View File
@@ -314,10 +314,10 @@ onUnmounted(() => {
</n-form-item>
</div>
<div class="two">
<n-form-item label="商品及候选间等待秒数">
<n-input-number v-model:value="cfg.download.waitSecondsMin" :min="0" style="width: 90px" />
<n-form-item label="商品及候选间等待秒数(0—3600)">
<n-input-number v-model:value="cfg.download.waitSecondsMin" :min="0" :max="3600" style="width: 90px" />
<span class="dash">—</span>
<n-input-number v-model:value="cfg.download.waitSecondsMax" :min="0" style="width: 90px" />
<n-input-number v-model:value="cfg.download.waitSecondsMax" :min="0" :max="3600" style="width: 90px" />
</n-form-item>
</div>
</n-form>
+5 -5
View File
@@ -219,11 +219,11 @@ func (c Config) Validate() error {
if err := checkIntRange(d.Concurrency, 1, 8, "下载并发数"); err != nil {
return err
}
if d.WaitSecondsMin < 0 || d.WaitSecondsMin > 60 {
return fmt.Errorf("商品间最短等待秒数不合法,允许范围 0—60")
if d.WaitSecondsMin < 0 || d.WaitSecondsMin > 3600 {
return fmt.Errorf("商品间最短等待秒数不合法,允许范围 0—3600")
}
if d.WaitSecondsMax < 0 || d.WaitSecondsMax > 120 {
return fmt.Errorf("商品间最长等待秒数不合法,允许范围 0—120")
if d.WaitSecondsMax < 0 || d.WaitSecondsMax > 3600 {
return fmt.Errorf("商品间最长等待秒数不合法,允许范围 0—3600")
}
if d.WaitSecondsMax < d.WaitSecondsMin {
return fmt.Errorf("商品间最长等待秒数不能小于最短等待秒数")
@@ -386,7 +386,7 @@ download:
# 仅控制视频 CDN 文件下载;淘宝页面访问保持串行。
concurrency: %d
# 商品和候选详情访问间的等待区间;降低请求量,不保证解除风控。
# 商品和候选详情访问间的等待区间(0—3600 秒);降低请求量,不保证解除风控。
# 默认 10—20 秒是降低负载的起点,不是平台公布的安全阈值。
wait_seconds_min: %s
wait_seconds_max: %s
+29
View File
@@ -119,6 +119,35 @@ func TestValidateRejectsBadValues(t *testing.T) {
}
}
func Test商品间等待允许一小时并拒绝超限(t *testing.T) {
cfg := Default()
cfg.Download.WaitSecondsMin = 3600
cfg.Download.WaitSecondsMax = 3600
if err := cfg.Validate(); err != nil {
t.Fatalf("固定等待 3600 秒应当有效:%v", err)
}
path := filepath.Join(t.TempDir(), "config.yaml")
if err := Save(path, cfg); err != nil {
t.Fatalf("保存固定等待 3600 秒失败:%v", err)
}
loaded, err := Load(path)
if err != nil || loaded.Download.WaitSecondsMin != 3600 || loaded.Download.WaitSecondsMax != 3600 {
t.Fatalf("固定等待 3600 秒未正确读回:min=%v max=%v err=%v", loaded.Download.WaitSecondsMin, loaded.Download.WaitSecondsMax, err)
}
for _, field := range []string{"min", "max"} {
invalid := cfg
if field == "min" {
invalid.Download.WaitSecondsMin = 3601
invalid.Download.WaitSecondsMax = 3601
} else {
invalid.Download.WaitSecondsMax = 3601
}
if err := invalid.Validate(); err == nil {
t.Fatalf("%s 超过 3600 秒应被拒绝", field)
}
}
}
func TestLegacyHuohanhanFieldsDoNotBlockERPGo(t *testing.T) {
cfg := Default()
cfg.Huohanhan.BaseURL = ""