73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package api
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http"
|
|
"path"
|
|
)
|
|
|
|
type Genre struct {
|
|
Name string `json:"name"`
|
|
Level int `json:"level"`
|
|
}
|
|
|
|
type Anime 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"`
|
|
StartDate string `json:"start_date"`
|
|
EndDate string `json:"end_date"`
|
|
Genres []Genre `json:"genres"`
|
|
AverageDuration int `json:"average_duration"`
|
|
AnidbID int `json:"anidb_id"`
|
|
MyanimelistID int `json:"myanimelist_id"`
|
|
}
|
|
|
|
type AnimeSearch struct {
|
|
Title string `json:"title"`
|
|
}
|
|
|
|
var baseURL = "https://api.meikan.moe/v1/"
|
|
|
|
func getJSON(url string, target interface{}) error {
|
|
r, err := http.Get(url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer r.Body.Close()
|
|
|
|
return json.NewDecoder(r.Body).Decode(&target)
|
|
}
|
|
|
|
func postJSON(url string, form AnimeSearch, target interface{}) error {
|
|
b := new(bytes.Buffer)
|
|
json.NewEncoder(b).Encode(form)
|
|
|
|
r, err := http.Post(url, "application/json; charset=utf-8", b)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer r.Body.Close()
|
|
return json.NewDecoder(r.Body).Decode(target)
|
|
}
|
|
|
|
func AnimeByID(id string) (Anime, error) {
|
|
anime := Anime{}
|
|
url := baseURL + path.Join("anime", id)
|
|
err := getJSON(url, &anime)
|
|
return anime, err
|
|
}
|
|
|
|
func SearchAnime(title string) ([]Anime, error) {
|
|
anime := []Anime{}
|
|
|
|
form := AnimeSearch{Title: title}
|
|
url := baseURL + "anime"
|
|
err := postJSON(url, form, &anime)
|
|
return anime, err
|
|
}
|