package srv_seopush import ( "context" "fmt" "net/url" "strings" "videoweb/pub/common/log" "videoweb/pub/common/srvdef" "videoweb/pub/common/utils" "videoweb/pub/models/playletthememod" seoindexnow "videoweb/pub/seo/indexnow" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo/options" ) // BulkIndexNowResult 批量提交结果,包含提交的 URL 列表和 IndexNow 原始回执。 type BulkIndexNowResult struct { URLs []string `json:"urls"` SubmitInfo *seoindexnow.BatchResult `json:"submitInfo"` } // SubmitHomeAndThemes 组装主页 + 前 N 个专题(按 Rank 降序)URL,批量提交 IndexNow。 // limit 为 URL 总数(包含主页),默认 10;小于等于 1 时视为仅主页。 // hostOverride 非空时覆盖 sys_cfg.webAddr,用于把同一批内容推到新域名(支持带 scheme 或裸域名)。 func SubmitHomeAndThemes(ctx context.Context, limit int, hostOverride string) (*BulkIndexNowResult, *srvdef.SrvErr) { if limit <= 0 { limit = 10 } webAddr := strings.TrimRight(strings.TrimSpace(hostOverride), "/") if webAddr == "" { webAddr = SEOBaseURL(ctx) } else if !strings.HasPrefix(webAddr, "http://") && !strings.HasPrefix(webAddr, "https://") { webAddr = "https://" + webAddr } if webAddr == "" { return nil, srvdef.New(srvdef.ErrNoData, "WebAddr 未配置", "") } root := strings.TrimRight(webAddr, "/") urls := make([]string, 0, limit) urls = append(urls, root+"/") if remain := limit - 1; remain > 0 { themes, err := playletthememod.FindManyPlayletTheme(ctx, bson.M{playletthememod.FN.PlayletTheme.Status: true}, options.Find(). SetSort(bson.M{playletthememod.FN.PlayletTheme.Rank: -1}). SetLimit(int64(remain))) if err == nil { for _, t := range themes { if t == nil || t.Id <= 0 { continue } seg := url.PathEscape(utils.PathSegment(t.Slug, t.Id)) if seg == "" { continue } urls = append(urls, root+"/collection/"+seg) } } else { log.Warn("seopush bulk: list themes failed", log.Any("err", err)) } } config, cerr := seoindexnow.BuildConfig(webAddr) if cerr != nil { return nil, srvdef.New(srvdef.Failure, fmt.Sprintf("构造 IndexNow 配置失败: %v", cerr), "") } result := seoindexnow.NewBatchIndexNowSubmitter(config).SubmitBatch(urls) log.Info("seopush bulk: indexnow submitted", log.Any("urls", urls), log.Any("statusCodes", result.StatusCodes), log.Any("success", result.SuccessCount), log.Any("fail", result.FailCount)) return &BulkIndexNowResult{URLs: urls, SubmitInfo: result}, nil }