Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
3b208aeeaf | |||
![]() |
bfc0e5c417 | ||
![]() |
e6183ddfa3 | ||
![]() |
1591816684 | ||
![]() |
8ce29414f4 | ||
![]() |
faa5474d22 | ||
![]() |
de98e6f444 | ||
![]() |
07d1f0962a | ||
![]() |
e5e717f3e1 | ||
![]() |
79d24f2ba0 | ||
![]() |
573c398f76 |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
api_test.go
|
@ -2,7 +2,7 @@ package anilist
|
||||
|
||||
import "context"
|
||||
|
||||
func (api *Api) GetAiringSchedule(ctx context.Context, vars AiringScheduleQuery, onError func(error)) Cursor[AiringSchedule] {
|
||||
func (api *Api) GetAiringSchedule(ctx context.Context, vars AiringScheduleQuery, onError func(error)) *Cursor[AiringSchedule] {
|
||||
resp := responseObj[*page[AiringSchedule]]{}
|
||||
return requestPaged(api, ctx, getAiringScheduleQuery, vars.toMap(), &resp, onError)
|
||||
}
|
||||
|
12
api.go
12
api.go
@ -49,6 +49,10 @@ func request[T any](api *Api, query string, vars map[string]interface{}, respObj
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
return handleError(resp)
|
||||
}
|
||||
|
||||
//data, _ := ioutil.ReadAll(resp.Body)
|
||||
//fmt.Println(string(data))
|
||||
|
||||
@ -61,7 +65,7 @@ func request[T any](api *Api, query string, vars map[string]interface{}, respObj
|
||||
return nil
|
||||
}
|
||||
|
||||
func requestPaged[R any](api *Api, ctx context.Context, query string, vars map[string]interface{}, respObj *responseObj[*page[R]], onError func(error)) Cursor[R] {
|
||||
func requestPaged[R any](api *Api, ctx context.Context, query string, vars map[string]interface{}, respObj *responseObj[*page[R]], onError func(error)) *Cursor[R] {
|
||||
resp := responseObj[struct {
|
||||
Page *page[R] `json:"Page"`
|
||||
}]{}
|
||||
@ -90,6 +94,10 @@ func requestPaged[R any](api *Api, ctx context.Context, query string, vars map[s
|
||||
return
|
||||
}
|
||||
|
||||
if resp.Data.Page == nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, value := range resp.Data.Page.Data() {
|
||||
value := value
|
||||
select {
|
||||
@ -105,7 +113,7 @@ func requestPaged[R any](api *Api, ctx context.Context, query string, vars map[s
|
||||
}
|
||||
}()
|
||||
|
||||
return Cursor[R]{
|
||||
return &Cursor[R]{
|
||||
Chan: out,
|
||||
ctx: ctx,
|
||||
cancelFunc: cancelFunc,
|
||||
|
32
api_error.go
Normal file
32
api_error.go
Normal file
@ -0,0 +1,32 @@
|
||||
package anilist
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type apiError struct {
|
||||
Message string `json:"message"`
|
||||
Status int `json:"status"`
|
||||
}
|
||||
|
||||
type apiErrResp struct {
|
||||
Errors []apiError `json:"errors"`
|
||||
}
|
||||
|
||||
func handleError(resp *http.Response) error {
|
||||
respObj := &apiErrResp{}
|
||||
|
||||
dec := json.NewDecoder(resp.Body)
|
||||
err := dec.Decode(respObj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(respObj.Errors) == 0 {
|
||||
return errors.New("unknown API error")
|
||||
}
|
||||
|
||||
return errors.New(respObj.Errors[0].Message)
|
||||
}
|
10
cursor.go
10
cursor.go
@ -8,12 +8,16 @@ type Cursor[T any] struct {
|
||||
Chan <-chan *T
|
||||
}
|
||||
|
||||
func (c Cursor[T]) First() *T {
|
||||
func (c *Cursor[T]) First() *T {
|
||||
defer c.cancelFunc()
|
||||
return <-c.Chan
|
||||
}
|
||||
|
||||
func (c Cursor[T]) Next() (*T, bool) {
|
||||
func (c *Cursor[T]) Close() {
|
||||
c.cancelFunc()
|
||||
}
|
||||
|
||||
func (c *Cursor[T]) Next() (*T, bool) {
|
||||
if c.ctx.Err() == nil {
|
||||
value, ok := <-c.Chan
|
||||
return value, ok
|
||||
@ -22,7 +26,7 @@ func (c Cursor[T]) Next() (*T, bool) {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
func (c Cursor[T]) Slice() []T {
|
||||
func (c *Cursor[T]) Slice() []T {
|
||||
s := make([]T, 0)
|
||||
for value, ok := c.Next(); ok; value, ok = c.Next() {
|
||||
s = append(s, *value)
|
||||
|
2
go.mod
2
go.mod
@ -1,3 +1,3 @@
|
||||
module git.tordarus.net/Tordarus/anilist
|
||||
module git.tordarus.net/tordarus/anilist
|
||||
|
||||
go 1.18
|
||||
|
2
media.go
2
media.go
@ -2,7 +2,7 @@ package anilist
|
||||
|
||||
import "context"
|
||||
|
||||
func (api *Api) GetMedia(ctx context.Context, vars MediaQuery, onError func(error)) Cursor[Media] {
|
||||
func (api *Api) GetMedia(ctx context.Context, vars MediaQuery, onError func(error)) *Cursor[Media] {
|
||||
resp := responseObj[*page[Media]]{}
|
||||
return requestPaged(api, ctx, getMediaQuery, vars.toMap(), &resp, onError)
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ package anilist
|
||||
|
||||
import "context"
|
||||
|
||||
func (api *Api) GetMediaList(ctx context.Context, vars MediaListQuery, onError func(error)) Cursor[MediaList] {
|
||||
func (api *Api) GetMediaList(ctx context.Context, vars MediaListQuery, onError func(error)) *Cursor[MediaList] {
|
||||
resp := responseObj[*page[MediaList]]{}
|
||||
return requestPaged(api, ctx, getMediaListQuery, vars.toMap(), &resp, onError)
|
||||
}
|
||||
|
46
types.go
46
types.go
@ -9,8 +9,10 @@ type User struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
}
|
||||
|
||||
type MediaID int
|
||||
|
||||
type Media struct {
|
||||
ID int `json:"id"`
|
||||
ID MediaID `json:"id"`
|
||||
Title MediaTitle `json:"title"`
|
||||
Type MediaType `json:"type"`
|
||||
Format MediaFormat `json:"format"`
|
||||
@ -113,10 +115,12 @@ const (
|
||||
MediaSourcePictureBook MediaSource = "PICTURE_BOOK"
|
||||
)
|
||||
|
||||
type MediaTrailerID string
|
||||
|
||||
type MediaTrailer struct {
|
||||
ID string `json:"id"`
|
||||
Site string `json:"site"`
|
||||
Thumbnail string `json:"thumbnail"`
|
||||
ID MediaTrailerID `json:"id"`
|
||||
Site string `json:"site"`
|
||||
Thumbnail string `json:"thumbnail"`
|
||||
}
|
||||
|
||||
type MediaCoverImage struct {
|
||||
@ -126,8 +130,10 @@ type MediaCoverImage struct {
|
||||
Color string `json:"color"`
|
||||
}
|
||||
|
||||
type MediaTagID int
|
||||
|
||||
type MediaTag struct {
|
||||
ID int `json:"id"`
|
||||
MediaTagID int `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
Category string `json:"category"`
|
||||
@ -173,10 +179,12 @@ func (d Seconds) Duration() time.Duration {
|
||||
return time.Duration(d) * time.Second
|
||||
}
|
||||
|
||||
type MediaListID int
|
||||
|
||||
type MediaList struct {
|
||||
ID int `json:"id"`
|
||||
ID MediaListID `json:"id"`
|
||||
UserID int `json:"userId"`
|
||||
MediaID int `json:"mediaId"`
|
||||
MediaID MediaID `json:"mediaId"`
|
||||
Status MediaListStatus `json:"status"`
|
||||
Score float64 `json:"score"`
|
||||
Progress int `json:"progress"`
|
||||
@ -197,18 +205,20 @@ type MediaList struct {
|
||||
type MediaListStatus string
|
||||
|
||||
const (
|
||||
MediaListStatusCurrent MediaSource = "CURRENT"
|
||||
MediaListStatusPlanning MediaSource = "PLANNING"
|
||||
MediaListStatusCompleted MediaSource = "COMPLETED"
|
||||
MediaListStatusDropped MediaSource = "DROPPED"
|
||||
MediaListStatusPaused MediaSource = "PAUSED"
|
||||
MediaListStatusRepeating MediaSource = "REPEATING"
|
||||
MediaListStatusCurrent MediaListStatus = "CURRENT"
|
||||
MediaListStatusPlanning MediaListStatus = "PLANNING"
|
||||
MediaListStatusCompleted MediaListStatus = "COMPLETED"
|
||||
MediaListStatusDropped MediaListStatus = "DROPPED"
|
||||
MediaListStatusPaused MediaListStatus = "PAUSED"
|
||||
MediaListStatusRepeating MediaListStatus = "REPEATING"
|
||||
)
|
||||
|
||||
type AiringScheduleID int
|
||||
|
||||
type AiringSchedule struct {
|
||||
ID int `json:"id"`
|
||||
MediaID int `json:"mediaId"`
|
||||
AiringAt UnixTime `json:"airingAt"`
|
||||
TimeUntilAiring Seconds `json:"timeUntilAiring"`
|
||||
Episode int `json:"episode"`
|
||||
ID AiringScheduleID `json:"id"`
|
||||
MediaID MediaID `json:"mediaId"`
|
||||
AiringAt UnixTime `json:"airingAt"`
|
||||
TimeUntilAiring Seconds `json:"timeUntilAiring"`
|
||||
Episode int `json:"episode"`
|
||||
}
|
||||
|
2
user.go
2
user.go
@ -44,7 +44,7 @@ func (api *Api) GetUserByID(id int) (*User, error) {
|
||||
return resp.Data.User, nil
|
||||
}
|
||||
|
||||
func (api *Api) SearchUsers(ctx context.Context, search string, onError func(error)) Cursor[User] {
|
||||
func (api *Api) SearchUsers(ctx context.Context, search string, onError func(error)) *Cursor[User] {
|
||||
vars := map[string]interface{}{"search": search}
|
||||
resp := responseObj[*page[User]]{}
|
||||
return requestPaged(api, ctx, searchUsersQuery, vars, &resp, onError)
|
||||
|
Loading…
x
Reference in New Issue
Block a user