From 01eef81064ccb63924625bc632a468cf8b949d86 Mon Sep 17 00:00:00 2001 From: Gabe Farrell Date: Wed, 30 Apr 2025 20:11:24 -0400 Subject: [PATCH] cache jikan and anilist responses --- anilist.go | 8 +++++--- consumer.go | 26 ++++++++++++++++---------- mal.go | 8 +++++--- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/anilist.go b/anilist.go index 5534e51..6871f19 100644 --- a/anilist.go +++ b/anilist.go @@ -99,8 +99,10 @@ func handleAniListAnimeSearch(idMap *ConcurrentMap) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { opts, err := SearchOptsFromAniListRequest(r) if err != nil { - log.Printf("Error creating search options: %v", err) - return + w.WriteHeader(400) + if _, writeErr := w.Write([]byte(err.Error())); writeErr != nil { + log.Printf("Error writing error response: %v", writeErr) + } } search, err := makeApiRequest(idMap, AniList, opts) if err != nil { @@ -123,7 +125,7 @@ func SearchOptsFromAniListRequest(r *http.Request) (*SearchOpts, error) { // set default params limit, err := strconv.Atoi(q.Get("limit")) 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 diff --git a/consumer.go b/consumer.go index d26ac2f..c24aa17 100644 --- a/consumer.go +++ b/consumer.go @@ -83,9 +83,7 @@ func makeApiRequest(idMap *ConcurrentMap, target SupportedAPI, opts *SearchOpts) var result *jikan.AnimeSearch if cachedResult, found := Cache.Get(fmt.Sprint(MyAnimeList) + opts.Query.Encode()); found { result = cachedResult.(*jikan.AnimeSearch) - log.Println("Jikan cache hit!") } else { - log.Println(opts.Query.Encode()) newResult, err := jikan.GetAnimeSearch(opts.Query) if err != nil { log.Println("Error sending request to Jikan: ", err) @@ -103,10 +101,17 @@ func makeApiRequest(idMap *ConcurrentMap, target SupportedAPI, opts *SearchOpts) } hasNextPage = result.Pagination.HasNextPage } else if target == AniList { - result, err := makeAniListApiCall(opts.Query) - if err != nil { - log.Println("Error sending request to AniList: ", err) - return nil, err + var result *AniListApiResponse + if cachedResult, found := Cache.Get(fmt.Sprint(AniList) + opts.Query.Encode()); found { + result = cachedResult.(*AniListApiResponse) + } 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 { 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)) 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 { log.Printf("MyAnimeList ID %d (%s) is a duplicate, skipping...\n", item.MalId, FullAnimeTitle(item.Title, item.TitleEng)) 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))) { log.Printf("MyAnimeList ID %d (%s) is set to always skip, skipping...\n", item.MalId, FullAnimeTitle(item.Title, item.TitleEng)) continue @@ -147,6 +152,7 @@ func makeApiRequest(idMap *ConcurrentMap, target SupportedAPI, opts *SearchOpts) usedIds[item.MalId] = true usedTvdbIds[item.TvdbId] = true } + apiItems = make([]*ResponseItem, 0) if count > opts.Limit { break } diff --git a/mal.go b/mal.go index 476e015..770e7f2 100644 --- a/mal.go +++ b/mal.go @@ -11,8 +11,10 @@ func handleMalAnimeSearch(idMap *ConcurrentMap) http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { opts, err := SearchOptsFromMalRequest(r) if err != nil { - log.Printf("Error creating search options: %v", err) - return + w.WriteHeader(400) + if _, writeErr := w.Write([]byte(err.Error())); writeErr != nil { + log.Printf("Error writing error response: %v", writeErr) + } } search, err := makeApiRequest(idMap, MyAnimeList, opts) if err != nil { @@ -34,7 +36,7 @@ func SearchOptsFromMalRequest(r *http.Request) (*SearchOpts, error) { limit, err := strconv.Atoi(q.Get("limit")) 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")