aboutsummaryrefslogtreecommitdiff
path: root/anime
diff options
context:
space:
mode:
Diffstat (limited to 'anime')
-rw-r--r--anime/anime.go40
-rw-r--r--anime/anime.structs.go (renamed from anime/structs.go)0
-rw-r--r--anime/ranking.structs.go31
3 files changed, 68 insertions, 3 deletions
diff --git a/anime/anime.go b/anime/anime.go
index e9ef70f..c397d93 100644
--- a/anime/anime.go
+++ b/anime/anime.go
@@ -6,6 +6,7 @@ import (
"io/ioutil"
"log"
"net/http"
+ "errors"
)
func requestHandler(token string, endpoint string) string {
@@ -34,11 +35,12 @@ func requestHandler(token string, endpoint string) string {
return string(body)
}
+// Each anime has its own ID on MAL
func GetAnimeById(token string, animeId int) Anime {
endpoint := fmt.Sprintf("https://api.myanimelist.net/v2/anime/%d?fields=id,title,main_picture,alternative_titles,start_date,end_date,synopsis,mean,rank,popularity,num_list_users,num_scoring_users,nsfw,created_at,updated_at,media_type,status,genres,my_list_status,num_episodes,start_season,broadcast,source,average_episode_duration,rating,pictures,background,related_anime,related_manga,recommendations,studios,statistics", animeId)
- data := requestHandler(token, endpoint)
var anime Anime
+ data := requestHandler(token, endpoint)
json.Unmarshal([]byte(data), &anime)
return anime
@@ -62,8 +64,40 @@ func isValidRankingType(rankingType string) bool {
return false
}
-func GetAnimeRanking(token string, rankingType string) {
+// Ranking is a list of anime sorted by their rank
+func GetAnimeRanking(token string, rankingType string) (AnimeRanking, error) {
+ var animeRanking AnimeRanking
if !isValidRankingType(rankingType) {
- log.Fatal(fmt.Sprintf("GetAnimeRanking: Invalid Ranking Type Given (\"%s\")", rankingType))
+ return animeRanking, errors.New(fmt.Sprintf("GetAnimeRanking: Invalid Ranking Type Given (\"%s\")", rankingType))
+ }
+
+ endpoint := "https://api.myanimelist.net/v2/anime/ranking?ranking_type=all&limit=4"
+
+ // gets data from API and stores it in a struct
+ var rankingData RawRanking
+ data := requestHandler(token, endpoint)
+ json.Unmarshal([]byte(data), &rankingData)
+
+ // Adding all the animes in ranking list to a slice
+ var animeRankingTitles []AnimeRankingTitle
+ for _, element := range rankingData.Data {
+ animeRankingTitles = append(
+ animeRankingTitles,
+ AnimeRankingTitle {
+ Anime: element.Anime,
+ RankNum: element.Ranking.Rank,
+ },
+ )
}
+
+ // Finally, create the AnimeRanking object
+ animeRanking = AnimeRanking {
+ Titles: animeRankingTitles,
+ Paging: ListPaging {
+ NextPage: rankingData.Paging.NextPage,
+ PrevPage: rankingData.Paging.PrevPage,
+ },
+ }
+
+ return animeRanking, nil
}
diff --git a/anime/structs.go b/anime/anime.structs.go
index bb35ded..bb35ded 100644
--- a/anime/structs.go
+++ b/anime/anime.structs.go
diff --git a/anime/ranking.structs.go b/anime/ranking.structs.go
new file mode 100644
index 0000000..8b9b303
--- /dev/null
+++ b/anime/ranking.structs.go
@@ -0,0 +1,31 @@
+package anime
+
+// contains previous/next page for anime list
+type ListPaging struct {
+ NextPage string `json:"next"`
+ PrevPage string `json:"previous"` // might need checking
+}
+
+// this is how the API returns data (looks horrible)
+type RawRanking struct {
+ Data []struct {
+ Anime Anime `json:"node"`
+ Ranking struct {
+ Rank int `json:"rank"`
+ } `json:"ranking"`
+ } `json:"data"`
+
+ Paging ListPaging `json:"paging"`
+}
+
+// each anime has a ranking number
+type AnimeRankingTitle struct {
+ Anime Anime
+ RankNum int
+}
+
+// this is how mal2go returns data
+type AnimeRanking struct {
+ Titles []AnimeRankingTitle
+ Paging ListPaging
+}