first commit
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
//go:build manual
|
||||
|
||||
// 手动验证:连真实站点抓一个真画廊并下载前若干张图。
|
||||
//
|
||||
// 不进常规测试(依赖网络 + 会拖慢 CI),用下面这条命令跑:
|
||||
//
|
||||
// $env:PATH = "$env:USERPROFILE\.local\go\bin;$env:PATH"
|
||||
// go test -tags manual -run TestRealSiteDownload -timeout 300s -v ./internal/hd4k/
|
||||
//
|
||||
// 参数用环境变量:
|
||||
//
|
||||
// HD4K_URL=https://migmg.ssuu.uk/content/09/xxx.html
|
||||
// HD4K_N=5
|
||||
// HD4K_OUT=<临时目录>
|
||||
package hd4k
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestRealSiteDownload(t *testing.T) {
|
||||
raw := os.Getenv("HD4K_URL")
|
||||
if raw == "" {
|
||||
t.Skip("设 HD4K_URL 指向一个真画廊页再跑")
|
||||
}
|
||||
n := 3
|
||||
if v := os.Getenv("HD4K_N"); v != "" {
|
||||
n = atoiSafe(v)
|
||||
}
|
||||
out := os.Getenv("HD4K_OUT")
|
||||
if out == "" {
|
||||
out = t.TempDir()
|
||||
}
|
||||
|
||||
sites := DefaultSites()
|
||||
ref, err := ParseGalleryURL(raw, sites)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Logf("归一后 URL = %s", ref.URL)
|
||||
if ref.URL != raw {
|
||||
t.Logf("(输入域名与主域名不同,已归一;ID=%s)", ref.ID)
|
||||
}
|
||||
|
||||
c := NewClient(30*time.Second, "", "off", sites)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 4*time.Minute)
|
||||
defer cancel()
|
||||
|
||||
g, err := c.FetchGallery(ctx, ref, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Logf("标题 = %s", g.Title)
|
||||
t.Logf("总页数 = %d", g.TotalPages)
|
||||
t.Logf("图片数 = %d", len(g.Images))
|
||||
if len(g.Images) == 0 {
|
||||
t.Fatal("一张图都没解析到")
|
||||
}
|
||||
|
||||
if n > len(g.Images) {
|
||||
n = len(g.Images)
|
||||
}
|
||||
referer := OriginOf(g.URL) + "/"
|
||||
// 目录名复用 core 层的清洗规则,这里只做最小可用处理
|
||||
dir := filepath.Join(out, sanitizeForManual(g.Title))
|
||||
if err := os.MkdirAll(dir, 0o755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
im := g.Images[i]
|
||||
dst := filepath.Join(dir, im.Filename)
|
||||
start := time.Now()
|
||||
if _, err := c.DownloadImage(ctx, im.URL, dst, referer, nil); err != nil {
|
||||
t.Errorf("[%d/%d] %s 下载失败: %v", i+1, n, im.Filename, err)
|
||||
continue
|
||||
}
|
||||
st, err := os.Stat(dst)
|
||||
if err != nil {
|
||||
t.Errorf("[%d/%d] 文件没落盘: %v", i+1, n, err)
|
||||
continue
|
||||
}
|
||||
t.Logf("[%d/%d] %-40s %8d 字节 %v",
|
||||
i+1, n, im.Filename, st.Size(), time.Since(start).Round(time.Millisecond))
|
||||
}
|
||||
t.Logf("下载目录: %s", dir)
|
||||
}
|
||||
|
||||
func atoiSafe(s string) int {
|
||||
n := 0
|
||||
for _, c := range s {
|
||||
if c < '0' || c > '9' {
|
||||
return n
|
||||
}
|
||||
n = n*10 + int(c-'0')
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
// sanitizeForManual 把标题变成一个能落盘的目录名(仅手动验证用)
|
||||
func sanitizeForManual(s string) string {
|
||||
repl := strings.NewReplacer(
|
||||
"/", "-", `\`, "-", ":", "-", "*", "-",
|
||||
"?", "-", `"`, "", "<", "-", ">", "-", "|", "-")
|
||||
s = repl.Replace(s)
|
||||
s = strings.Trim(strings.Join(strings.Fields(s), " "), " .")
|
||||
if s == "" {
|
||||
return "gallery"
|
||||
}
|
||||
return s
|
||||
}
|
||||
Reference in New Issue
Block a user