Files
mal/internal/jikan/recommendations.go

62 lines
1.5 KiB
Go

package jikan
import "fmt"
// RecommendationEntry represents a single recommendation
type RecommendationEntry struct {
Entry struct {
MalID int `json:"mal_id"`
URL string `json:"url"`
Images struct {
Webp struct {
LargeImageURL string `json:"large_image_url"`
} `json:"webp"`
} `json:"images"`
Title string `json:"title"`
} `json:"entry"`
Votes int `json:"votes"`
}
type RecommendationsResponse struct {
Data []RecommendationEntry `json:"data"`
}
// GetRecommendations fetches recommendations for an anime
func (c *Client) GetRecommendations(animeID int) ([]Anime, error) {
if cached, ok := c.recsCache.Get(animeID); ok {
return cached, nil
}
var result RecommendationsResponse
reqURL := fmt.Sprintf("%s/anime/%d/recommendations", c.baseURL, animeID)
if err := c.fetchWithRetry(reqURL, &result); err != nil {
return nil, err
}
// Convert to Anime slice (partial data)
animes := make([]Anime, 0, len(result.Data))
for _, rec := range result.Data {
animes = append(animes, Anime{
MalID: rec.Entry.MalID,
Title: rec.Entry.Title,
Images: struct {
Jpg struct {
LargeImageURL string `json:"large_image_url"`
} `json:"jpg"`
Webp struct {
LargeImageURL string `json:"large_image_url"`
} `json:"webp"`
}{
Webp: struct {
LargeImageURL string `json:"large_image_url"`
}{
LargeImageURL: rec.Entry.Images.Webp.LargeImageURL,
},
},
})
}
c.recsCache.Add(animeID, animes)
return animes, nil
}