cache jikan and anilist responses

main
Gabe Farrell 7 months ago
parent 2c9911983c
commit 01eef81064

@ -99,8 +99,10 @@ func handleAniListAnimeSearch(idMap *ConcurrentMap) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
opts, err := SearchOptsFromAniListRequest(r) opts, err := SearchOptsFromAniListRequest(r)
if err != nil { if err != nil {
log.Printf("Error creating search options: %v", err) w.WriteHeader(400)
return if _, writeErr := w.Write([]byte(err.Error())); writeErr != nil {
log.Printf("Error writing error response: %v", writeErr)
}
} }
search, err := makeApiRequest(idMap, AniList, opts) search, err := makeApiRequest(idMap, AniList, opts)
if err != nil { if err != nil {
@ -123,7 +125,7 @@ func SearchOptsFromAniListRequest(r *http.Request) (*SearchOpts, error) {
// set default params // set default params
limit, err := strconv.Atoi(q.Get("limit")) limit, err := strconv.Atoi(q.Get("limit"))
if err != nil { if err != nil {
return nil, errors.New(" Required parameter \"limit\" not specified") return nil, errors.New("required parameter \"limit\" not specified")
} }
// dont include limit in the AniList api call as its already hard coded at 20 per page // dont include limit in the AniList api call as its already hard coded at 20 per page

@ -83,9 +83,7 @@ func makeApiRequest(idMap *ConcurrentMap, target SupportedAPI, opts *SearchOpts)
var result *jikan.AnimeSearch var result *jikan.AnimeSearch
if cachedResult, found := Cache.Get(fmt.Sprint(MyAnimeList) + opts.Query.Encode()); found { if cachedResult, found := Cache.Get(fmt.Sprint(MyAnimeList) + opts.Query.Encode()); found {
result = cachedResult.(*jikan.AnimeSearch) result = cachedResult.(*jikan.AnimeSearch)
log.Println("Jikan cache hit!")
} else { } else {
log.Println(opts.Query.Encode())
newResult, err := jikan.GetAnimeSearch(opts.Query) newResult, err := jikan.GetAnimeSearch(opts.Query)
if err != nil { if err != nil {
log.Println("Error sending request to Jikan: ", err) log.Println("Error sending request to Jikan: ", err)
@ -103,10 +101,17 @@ func makeApiRequest(idMap *ConcurrentMap, target SupportedAPI, opts *SearchOpts)
} }
hasNextPage = result.Pagination.HasNextPage hasNextPage = result.Pagination.HasNextPage
} else if target == AniList { } else if target == AniList {
result, err := makeAniListApiCall(opts.Query) var result *AniListApiResponse
if err != nil { if cachedResult, found := Cache.Get(fmt.Sprint(AniList) + opts.Query.Encode()); found {
log.Println("Error sending request to AniList: ", err) result = cachedResult.(*AniListApiResponse)
return nil, err } else {
newResult, err := makeAniListApiCall(opts.Query)
if err != nil {
log.Println("Error sending request to AniList: ", err)
return nil, err
}
result = newResult
Cache.Set(fmt.Sprint(AniList)+opts.Query.Encode(), newResult, cache.DefaultExpiration)
} }
for _, item := range result.Data.Page.Media { for _, item := range result.Data.Page.Media {
respItem := ResponseItemFromAPI(AniList, item) respItem := ResponseItemFromAPI(AniList, item)
@ -127,14 +132,14 @@ func makeApiRequest(idMap *ConcurrentMap, target SupportedAPI, opts *SearchOpts)
log.Printf("MyAnimeList ID %d (%s) has no associated TVDB ID, skipping...\n", item.MalId, FullAnimeTitle(item.Title, item.TitleEng)) log.Printf("MyAnimeList ID %d (%s) has no associated TVDB ID, skipping...\n", item.MalId, FullAnimeTitle(item.Title, item.TitleEng))
continue continue
} }
if usedTvdbIds[item.TvdbId] && opts.MergeSeasons {
log.Printf("MyAnimeList ID %d (%s) is season of an already included anime, skipping...\n", item.MalId, FullAnimeTitle(item.Title, item.TitleEng))
continue
}
if usedIds[item.MalId] && !opts.AllowDuplicates { if usedIds[item.MalId] && !opts.AllowDuplicates {
log.Printf("MyAnimeList ID %d (%s) is a duplicate, skipping...\n", item.MalId, FullAnimeTitle(item.Title, item.TitleEng)) log.Printf("MyAnimeList ID %d (%s) is a duplicate, skipping...\n", item.MalId, FullAnimeTitle(item.Title, item.TitleEng))
continue continue
} }
if usedTvdbIds[item.TvdbId] && opts.MergeSeasons {
log.Printf("MyAnimeList ID %d (%s) is season of an already included anime, skipping...\n", item.MalId, FullAnimeTitle(item.Title, item.TitleEng))
continue
}
if slices.Contains(PermaSkipIds, strconv.Itoa(idMap.GetByMalId(item.MalId))) { if slices.Contains(PermaSkipIds, strconv.Itoa(idMap.GetByMalId(item.MalId))) {
log.Printf("MyAnimeList ID %d (%s) is set to always skip, skipping...\n", item.MalId, FullAnimeTitle(item.Title, item.TitleEng)) log.Printf("MyAnimeList ID %d (%s) is set to always skip, skipping...\n", item.MalId, FullAnimeTitle(item.Title, item.TitleEng))
continue continue
@ -147,6 +152,7 @@ func makeApiRequest(idMap *ConcurrentMap, target SupportedAPI, opts *SearchOpts)
usedIds[item.MalId] = true usedIds[item.MalId] = true
usedTvdbIds[item.TvdbId] = true usedTvdbIds[item.TvdbId] = true
} }
apiItems = make([]*ResponseItem, 0)
if count > opts.Limit { if count > opts.Limit {
break break
} }

@ -11,8 +11,10 @@ func handleMalAnimeSearch(idMap *ConcurrentMap) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
opts, err := SearchOptsFromMalRequest(r) opts, err := SearchOptsFromMalRequest(r)
if err != nil { if err != nil {
log.Printf("Error creating search options: %v", err) w.WriteHeader(400)
return if _, writeErr := w.Write([]byte(err.Error())); writeErr != nil {
log.Printf("Error writing error response: %v", writeErr)
}
} }
search, err := makeApiRequest(idMap, MyAnimeList, opts) search, err := makeApiRequest(idMap, MyAnimeList, opts)
if err != nil { if err != nil {
@ -34,7 +36,7 @@ func SearchOptsFromMalRequest(r *http.Request) (*SearchOpts, error) {
limit, err := strconv.Atoi(q.Get("limit")) limit, err := strconv.Atoi(q.Get("limit"))
if err != nil { if err != nil {
return nil, errors.New(" Required parameter \"limit\" not specified") return nil, errors.New("required parameter \"limit\" not specified")
} }
skipDedup := parseBoolParam(q, "allow_duplicates") skipDedup := parseBoolParam(q, "allow_duplicates")

Loading…
Cancel
Save