From 53f659e1136a3cff2bbee6a0d314e184a8fd40ed Mon Sep 17 00:00:00 2001 From: ShukeBta <272197458+ShukeBta@users.noreply.github.com> Date: Sat, 27 Jun 2026 13:01:22 +0800 Subject: [PATCH] split douban response parsing helpers --- internal/service/douban.go | 58 ----------------------------- internal/service/douban_parse.go | 64 ++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 58 deletions(-) create mode 100644 internal/service/douban_parse.go diff --git a/internal/service/douban.go b/internal/service/douban.go index aed792d..5eb6770 100644 --- a/internal/service/douban.go +++ b/internal/service/douban.go @@ -234,64 +234,6 @@ func (d *DoubanProvider) GetEpisodeCountByID(ctx context.Context, doubanID strin return 0, nil } -func firstStringFromMap(values map[string]any, keys ...string) string { - for _, key := range keys { - switch v := values[key].(type) { - case string: - if strings.TrimSpace(v) != "" { - return strings.TrimSpace(v) - } - case map[string]any: - if s := firstStringFromMap(v, "normal", "large", "small", "url"); s != "" { - return s - } - } - } - return "" -} - -func float32FromMap(values map[string]any, keys ...string) float32 { - for _, key := range keys { - switch v := values[key].(type) { - case float64: - return float32(v) - case string: - var out float32 - if _, err := fmt.Sscanf(strings.TrimSpace(v), "%f", &out); err == nil { - return out - } - case map[string]any: - if out := float32FromMap(v, "value", "score"); out > 0 { - return out - } - } - } - return 0 -} - -func doubanEpisodeCountFromValue(value any) int { - switch v := value.(type) { - case float64: - if v > 0 { - return int(v) - } - case int: - if v > 0 { - return v - } - case string: - var n int - if _, err := fmt.Sscanf(strings.TrimSpace(v), "%d", &n); err == nil && n > 0 { - return n - } - case []any: - if len(v) > 0 { - return len(v) - } - } - return 0 -} - func (d *DoubanProvider) setHeaders(req *http.Request) { req.Header.Set("User-Agent", userAgents[secureRandomIntn(len(userAgents))]) req.Header.Set("Referer", "https://movie.douban.com/") diff --git a/internal/service/douban_parse.go b/internal/service/douban_parse.go new file mode 100644 index 0000000..b5aa564 --- /dev/null +++ b/internal/service/douban_parse.go @@ -0,0 +1,64 @@ +package service + +import ( + "fmt" + "strings" +) + +func firstStringFromMap(values map[string]any, keys ...string) string { + for _, key := range keys { + switch v := values[key].(type) { + case string: + if strings.TrimSpace(v) != "" { + return strings.TrimSpace(v) + } + case map[string]any: + if s := firstStringFromMap(v, "normal", "large", "small", "url"); s != "" { + return s + } + } + } + return "" +} + +func float32FromMap(values map[string]any, keys ...string) float32 { + for _, key := range keys { + switch v := values[key].(type) { + case float64: + return float32(v) + case string: + var out float32 + if _, err := fmt.Sscanf(strings.TrimSpace(v), "%f", &out); err == nil { + return out + } + case map[string]any: + if out := float32FromMap(v, "value", "score"); out > 0 { + return out + } + } + } + return 0 +} + +func doubanEpisodeCountFromValue(value any) int { + switch v := value.(type) { + case float64: + if v > 0 { + return int(v) + } + case int: + if v > 0 { + return v + } + case string: + var n int + if _, err := fmt.Sscanf(strings.TrimSpace(v), "%d", &n); err == nil && n > 0 { + return n + } + case []any: + if len(v) > 0 { + return len(v) + } + } + return 0 +}