67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/PuerkitoBio/goquery"
|
|
"github.com/caarlos0/log"
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
func main() {
|
|
repos, err := trending("rust", []string{"daily", "weekly", "monthly"})
|
|
if err != nil {
|
|
log.WithError(err).Fatal("could not get trending repositories")
|
|
}
|
|
for _, repo := range repos {
|
|
log.Info(repo)
|
|
}
|
|
}
|
|
|
|
func trending(lang string, timeframes []string) ([]string, error) {
|
|
repoMap := make(map[string]struct{})
|
|
for _, timeframe := range timeframes {
|
|
rs, err := trendingFrame(lang, timeframe)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, r := range rs {
|
|
repoMap[r] = struct{}{}
|
|
}
|
|
}
|
|
var repos []string
|
|
for repo := range repoMap {
|
|
repos = append(repos, repo)
|
|
}
|
|
return repos, nil
|
|
}
|
|
|
|
func trendingFrame(lang, timeframe string) ([]string, error) {
|
|
u := fmt.Sprintf("https://github.com/trending/%s?since=%s", lang, timeframe)
|
|
res, err := http.Get(u)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
doc, err := goquery.NewDocumentFromReader(res.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var repos []string
|
|
doc.Find(".Box-row").Each(func(_ int, s *goquery.Selection) {
|
|
// TODO Only do this once per lang
|
|
rlcStyle, _ := s.Find(".repo-language-color").Attr("style")
|
|
rlc := strings.Fields(rlcStyle)[1]
|
|
log.Styles[log.InfoLevel] = lipgloss.NewStyle().Foreground(lipgloss.Color(rlc)).Bold(true)
|
|
|
|
e := s.Find("h1 a")
|
|
repo := strings.Join(strings.Fields(e.Text()), "")
|
|
repos = append(repos, repo)
|
|
})
|
|
return repos, nil
|
|
}
|