package search import ( "context" "log/slog" "sort" googlesearch "github.com/rocketlaunchr/google-search" "gitea.stevedudenhoeffer.com/steve/answer/pkg/cache" ) type Google struct { Cache cache.Cache } var _ Search = Google{} func (g Google) Search(ctx context.Context, search string) ([]Result, error) { var res []Result key := "google:" + search err := g.Cache.GetJSON(key, &res) slog.Info("searching", "search", search, "results", res, "err", err) if err == nil { return res, nil } results, err := googlesearch.Search(ctx, search, googlesearch.SearchOptions{ UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36", }) slog.Info("searched", "search", search, "results", results, "err", err) if err != nil { return nil, err } // just in case, sort the res by rank, as the api does not mention it is sorted sort.Slice(res, func(i, j int) bool { return results[i].Rank < results[j].Rank }) for _, r := range results { res = append(res, Result{ Title: r.Title, URL: r.URL, Description: r.Description, }) } _ = g.Cache.SetJSON(key, res) return res, nil }