package main import ( "bytes" "encoding/json" "fmt" "git.fuyu.moe/Fuyu/router" "io/ioutil" "net/http" "strconv" ) func main() { //fmt.Println("Hello world") r := router.New() r.GET(`/`, home) r.GET(`/compare/:user`, compare) r.Start(`:8070`) } type jikanAPIUserList struct { RequestHash string `json:"request_hash"` RequestCached bool `json:"request_cached"` RequestCacheExpiry int `json:"request_cache_expiry"` Completed int `json:"completed"` Watching int `json:"watching"` Dropped int `json:"dropped"` PlanToWatch int `json:"plan_to_watch"` OnHold int `json:"on_hold"` Anime []jikanAPIAnime `json:"anime"` } type jikanAPIAnime struct { MeikanID int `json:"meikan_id"` MyanimelistID int `json:"mal_id"` Title string `json:"title"` ImageURL string `json:"image_url"` Type string `json:"type"` WatchingStatus int `json:"watching_status"` Score int `json:"score"` WatchedEpisodes int `json:"watched_episodes"` TotalEpisodes int `json:"total_episodes"` AiringStatus int `json:"airing_status"` } type meikanListItem struct { Anime meikanAnime `json:"anime"` State string `json:"state"` Episode int `json:"episode"` Rating int `json:"rating"` Hidden bool `json:"hidden"` Recommended bool `json:"recommend"` } type meikanAnime struct { ID int `json:"id"` Title string `json:"title"` Type string `json:"type"` Episodes int `json:"episodes"` State string `json:"state"` Rating string `json:"rating"` } type meikanAPIIDs struct { MeikanID int `json:"meikan"` MyanimelistID int `json:"myanimelist"` AnidbID int `json:"anidb"` } func check(e error) { if e != nil { panic(e) } } func home(c *router.Context) error { return c.String(200, "Test") } func compare(c *router.Context) error { user := c.Param(`user`) //https://api.jikan.moe/v3/user/nekomata1037/animelist/all //https://api.meikan.moe/v1/ids/anime jikanList := jikanAPIGetUserAnimelist(user) var anime []meikanListItem //fmt.Println(result) IDs := meikanAPIGetIDs() for i := 0; i < len(jikanList.Anime); i++ { //fmt.Println(result.Anime[i].Title) for d := 0; d < len(IDs); d++ { if jikanList.Anime[i].MyanimelistID == IDs[d].MyanimelistID { jikanList.Anime[i].MeikanID = IDs[d].MeikanID } } temp := meikanListItem{Anime: meikanAnime{ID: jikanList.Anime[i].MeikanID, Title: jikanList.Anime[i].Title, Type: jikanList.Anime[i].Type, Episodes: jikanList.Anime[i].TotalEpisodes}, Episode: jikanList.Anime[i].WatchedEpisodes, Rating: jikanList.Anime[i].Score} switch jikanList.Anime[i].WatchingStatus { case 1: jikanList.Completed++ temp.State = "Watching" case 2: jikanList.Completed++ temp.State = "Finished" case 3: jikanList.OnHold++ temp.State = "On Hold" case 4: jikanList.Dropped++ temp.State = "Dropped" case 6: jikanList.PlanToWatch++ temp.State = "Plan to watch" } switch jikanList.Anime[i].AiringStatus { case 2: temp.Anime.State = "Finished" } anime = append(anime, temp) } //fmt.Println(anime) //resJSON, err := json.MarshalIndent(result, "", "\t") //check(err) //jsonfile := []byte(resJSON) return c.JSON(200, jikanList) } func jikanAPIGetUserAnimelist(user string) jikanAPIUserList { var result jikanAPIUserList for i := 1; ; i++ { resp, err := http.Get("https://api.jikan.moe/v3/user/" + user + "/animelist/all/" + strconv.Itoa(i)) check(err) defer resp.Body.Close() var tempResult jikanAPIUserList body, err := ioutil.ReadAll(resp.Body) check(err) if i == 1 { _ = json.NewDecoder(bytes.NewReader(body)).Decode(&result) fmt.Println("Searching page 1") continue } else { _ = json.NewDecoder(bytes.NewReader(body)).Decode(&tempResult) result.Anime = append(result.Anime, tempResult.Anime...) fmt.Println("Searching page " + strconv.Itoa(i)) } if len(tempResult.Anime) == 0 { break } } return result } func meikanAPIGetIDs() []meikanAPIIDs { resp, err := http.Get("https://api.meikan.moe/v1/ids/anime") check(err) defer resp.Body.Close() var result []meikanAPIIDs body, err := ioutil.ReadAll(resp.Body) check(err) _ = json.NewDecoder(bytes.NewReader(body)).Decode(&result) return result }