package kemonoapi import ( "context" "encoding/json" "fmt" "iter" "log/slog" "strconv" ) // FetchCreators fetch Creator list func (k *Client) FetchCreators() (creators []Creator, err error) { // k.log.Print("fetching creator list...") // url := fmt.Sprintf("https://%s/api/v1/creators", k.Site) // resp, err := k.Downloader.Get(url) // if err != nil { // return nil, fmt.Errorf("fetch creator list error: %s", err) // } // reader, err := handleCompressedHTTPResponse(resp) // if err != nil { // return nil, err // } // data, err := ioutil.ReadAll(reader) // if err != nil { // return nil, fmt.Errorf("fetch creator list error: %s", err) // } // err = json.Unmarshal(data, &creators) // if err != nil { // return nil, fmt.Errorf("unmarshal creator list error: %s", err) // } return } // FetchPosts fetch post list func (k *Client) FetchPosts(ctx context.Context, service, creator_id string) iter.Seq2[Post, error] { const perUnit = 50 return func(yield func(Post, error) bool) { page := 0 for { k.log.Info("fetching post list", slog.Int("page", page)) if err := k.ratelimit.Wait(ctx); err != nil { yield(Post{}, err) return } posts, err := k.fetchPostsPage(ctx, service, creator_id, page*perUnit) if err != nil { yield(Post{}, err) return } if len(posts) == 0 { break } for _, post := range posts { if !yield(post, nil) { return } } page++ } } } func (k *Client) fetchPostsPage(ctx context.Context, service, creator_id string, offset int) ([]Post, error) { resp, err := k.client.R(). SetContext(ctx). SetQueryParam("o", strconv.Itoa(offset)). SetPathParam("service", service). SetPathParam("creator_id", creator_id). Get("/{service}/user/{creator_id}") if err != nil { return nil, fmt.Errorf("fetch post list error: %s", err) } var posts []Post err = json.Unmarshal(resp.Body(), &posts) if err != nil { return nil, fmt.Errorf("unmarshal post list error: %s", err) } return posts, nil }