bannergen/internal/datafetchers/espn/main.go

82 lines
1.9 KiB
Go
Raw Normal View History

2025-01-13 22:50:12 -06:00
package espn
import (
"encoding/json"
"fmt"
"io"
"net/http"
"git.chandlerswift.com/chandlerswift/bannergen/internal/types"
)
type ESPNDataFetcher struct{}
func (ESPNDataFetcher) Fetch() (sports []types.Sport) {
sportNames := []string{"hockey/nhl"}
type ApiResponse struct {
Sports []struct {
Name string `json:"name"`
Leagues []struct {
Teams []struct {
Team struct {
Slug string `json:"slug"`
Abbreviation string `json:"abbreviation"`
DisplayName string `json:"displayName"`
Color string `json:"color"`
AlternateColor string `json:"alternateColor"`
Logos []struct {
Href string `json:"href"`
} `json:"logos"`
} `json:"team"`
} `json:"teams"`
} `json:"leagues"`
} `json:"sports"`
}
for _, sportName := range sportNames {
res, err := http.Get(fmt.Sprintf("https://site.api.espn.com/apis/site/v2/sports/%v/teams", sportName))
if err != nil {
panic(err)
}
if res.StatusCode != 200 {
panic(res.StatusCode)
}
data, err := io.ReadAll(res.Body)
if err != nil {
panic(err)
}
var apiResponse ApiResponse
if err := json.Unmarshal([]byte(data), &apiResponse); err != nil {
panic(err)
}
if len(apiResponse.Sports) == 0 {
panic("empty apiResponse.Sports")
}
// Use the first sport
sport := types.Sport{
Name: apiResponse.Sports[0].Name,
}
// Iterate through leagues and teams
for _, league := range apiResponse.Sports[0].Leagues {
for _, t := range league.Teams {
team := types.Team{
Slug: t.Team.Slug,
Abbreviation: t.Team.Abbreviation,
DisplayName: t.Team.DisplayName,
Logo: t.Team.Logos[0].Href, // Use the first logo
Color: t.Team.Color,
AlternateColor: t.Team.AlternateColor,
}
sport.Teams = append(sport.Teams, team)
}
}
sports = append(sports, sport)
}
return
}