package main import ( "fmt" "net/http" "strings" "github.com/PuerkitoBio/goquery" "github.com/caarlos0/log" "github.com/charmbracelet/lipgloss" ) var Version = "develop" func main() { languages := []string{"go", "rust"} for _, lang := range languages { l, err := trendingLang(lang, []string{"daily", "weekly", "monthly"}) if err != nil { log.WithError(err).Fatal("could not get trending repositories") } log.Styles[log.InfoLevel] = lipgloss.NewStyle().Foreground(lipgloss.Color(l.color)).Bold(true) log.Info(lang) log.IncreasePadding() for _, repo := range l.repositories { log.WithField("link", repo.link()).Info(repo.name) } log.ResetPadding() } } func trendingLang(lang string, timeframes []string) (language, error) { l := language{ repositories: make([]repository, 0), } repoMap := make(map[repository]struct{}) for _, timeframe := range timeframes { la, err := trendingRepos(lang, timeframe) if err != nil { return la, err } l.color = la.color for _, r := range la.repositories { repoMap[r] = struct{}{} } } for repo := range repoMap { l.repositories = append(l.repositories, repo) } return l, nil } func trendingRepos(lang, timeframe string) (language, error) { u := fmt.Sprintf("https://github.com/trending/%s?since=%s", lang, timeframe) res, err := http.Get(u) if err != nil { return language{}, err } defer res.Body.Close() doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { return language{}, err } var l language doc.Find(".Box-row").Each(func(_ int, s *goquery.Selection) { if l.color == "" { rlcStyle, _ := s.Find(".repo-language-color").Attr("style") l.color = strings.Fields(rlcStyle)[1] } e := s.Find("h1 a") repo := strings.Join(strings.Fields(e.Text()), "") l.repositories = append(l.repositories, repository{name: repo}) }) return l, nil } type language struct { color string repositories []repository } type repository struct { name string } func (r repository) link() string { return fmt.Sprintf("https://github.com/%s", r.name) }