Renamed the Go module to align with the updated repository path for better clarity and organization. This ensures consistency across the project and prevents potential import conflicts.
60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
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
|
|
}
|