downloader/anilist.go
2022-08-21 21:14:44 +02:00

70 lines
1.7 KiB
Go

package main
import (
"context"
"git.milar.in/milarin/anilist"
"git.milar.in/milarin/channel"
"git.milar.in/milarin/slices"
)
type Pair[A, B any] struct {
First A
Second B
}
func GetAnimesToDownloadByAnimeID() (map[anilist.MediaID]*anilist.MediaList, error) {
watchingAnimesChannel, err := GetCurrentlyWatchingAnimes()
if err != nil {
return nil, err
}
toMapFunc := func(entry *anilist.MediaList) (anilist.MediaID, *anilist.MediaList) { return entry.MediaID, entry }
return channel.ToMap(watchingAnimesChannel, toMapFunc), nil
}
func GetCurrentlyWatchingAnimes() (<-chan *anilist.MediaList, error) {
token, err := GetAnilistAccessToken()
if err != nil {
return nil, ErrAnimeListNotObtainable.Wrap(err, "access token acquisition failed")
}
media := slices.Map(AnimeStatus, func(status anilist.MediaListStatus) <-chan *anilist.MediaList {
return anilist.NewApi(token).GetMediaList(context.Background(), anilist.MediaListQuery{
UserName: AnilistUsername,
Type: anilist.MediaTypeAnime,
Status: status,
}, nil).Chan
})
return channel.Merge(media...), nil
}
var (
animeByTitleCache = map[string]Pair[*anilist.Media, error]{}
)
func SearchAnimeByTitle(title string) (anime *anilist.Media, err error) {
// caching
if cacheEntry, ok := animeByTitleCache[title]; ok {
return cacheEntry.First, cacheEntry.Second
}
defer func() { animeByTitleCache[title] = Pair[*anilist.Media, error]{anime, err} }()
token, err := GetAnilistAccessToken()
if err != nil {
return nil, err
}
anime = anilist.NewApi(token).GetMedia(context.Background(), anilist.MediaQuery{
Search: title,
Type: anilist.MediaTypeAnime,
}, nil).First()
if anime == nil {
return nil, ErrAnimeNotFound.New(title)
}
return anime, nil
}