diff options
| author | Bobby <[email protected]> | 2025-05-09 03:56:20 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2025-05-09 03:56:20 +0530 |
| commit | ee0af834ab9ccd9954a37f76b1595b88f1bbcb51 (patch) | |
| tree | 4112015236b484eddb846741a6bc252f37ecd56c /services | |
| parent | 6869a86c26793622f6018b0cf49e1e6b046dffc4 (diff) | |
| download | metachan-ee0af834ab9ccd9954a37f76b1595b88f1bbcb51.tar.xz metachan-ee0af834ab9ccd9954a37f76b1595b88f1bbcb51.zip | |
added anime cache
Diffstat (limited to 'services')
| -rw-r--r-- | services/anime/service.go | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/services/anime/service.go b/services/anime/service.go index 63840cd..631488f 100644 --- a/services/anime/service.go +++ b/services/anime/service.go @@ -2,6 +2,7 @@ package anime import ( "fmt" + "metachan/database" "metachan/entities" "metachan/types" "metachan/utils/api/anilist" @@ -45,6 +46,24 @@ func (s *Service) GetAnimeDetails(mapping *entities.AnimeMapping) (*types.Anime, malID := mapping.MAL + // First, check if we have a valid cached version + cachedAnime, err := database.GetCachedAnimeByMALID(malID) + if err == nil && database.IsCacheValid(cachedAnime) { + logger.Log(fmt.Sprintf("Cache hit for anime (MAL ID: %d), returning cached data", malID), logger.LogOptions{ + Level: logger.Info, + Prefix: "AnimeCache", + }) + + // Convert the cached anime to the types.Anime format + return database.ConvertToTypesAnime(cachedAnime), nil + } + + // Cache miss or expired, fetch from external APIs + logger.Log(fmt.Sprintf("Cache miss for anime (MAL ID: %d), fetching fresh data", malID), logger.LogOptions{ + Level: logger.Info, + Prefix: "AnimeAPI", + }) + // Create the different types of functions for proper Go generic type inference animeFunc := func() (*jikan.JikanAnimeResponse, error) { return s.jikanClient.GetFullAnime(malID) @@ -143,12 +162,14 @@ func (s *Service) GetAnimeDetails(mapping *entities.AnimeMapping) (*types.Anime, episodeDataChan := make(chan []types.AnimeSingleEpisode, 1) subbedCountChan := make(chan int, 1) dubbedCountChan := make(chan int, 1) + tmdbErrorChan := make(chan error, 1) episodeProcessingStartTime := time.Now() go func() { defer close(episodeDataChan) defer close(subbedCountChan) defer close(dubbedCountChan) + defer close(tmdbErrorChan) basicEpisodes := generateBasicEpisodes(episodes.Data) logger.Log(fmt.Sprintf("Generated basic episodes: %d", len(basicEpisodes)), logger.LogOptions{ @@ -163,7 +184,8 @@ func (s *Service) GetAnimeDetails(mapping *entities.AnimeMapping) (*types.Anime, }) enrichStart := time.Now() - enrichedEpisodes := AttachEpisodeDescriptions(anime.Data.Title, basicEpisodes, anime.Data.TitleEnglish, mapping.TMDB) + enrichedEpisodes, tmdbErr := AttachEpisodeDescriptions(anime.Data.Title, basicEpisodes, anime.Data.TitleEnglish, mapping.TMDB) + tmdbErrorChan <- tmdbErr // Get subbed and dubbed episode counts in bulk with a single API call (much faster) subCount, dubCount := 0, 0 @@ -259,6 +281,7 @@ func (s *Service) GetAnimeDetails(mapping *entities.AnimeMapping) (*types.Anime, episodeData := <-episodeDataChan subbedCount := <-subbedCountChan dubbedCount := <-dubbedCountChan + tmdbError := <-tmdbErrorChan logger.Log(fmt.Sprintf("Episode data wait time: %s (total episode processing time: %s)", time.Since(episodeWaitStartTime), time.Since(episodeProcessingStartTime)), logger.LogOptions{ @@ -383,6 +406,28 @@ func (s *Service) GetAnimeDetails(mapping *entities.AnimeMapping) (*types.Anime, }) } + // Save the anime to cache only if TMDB didn't fail + if tmdbError == nil { + go func() { + if err := database.SaveAnimeToCache(animeDetails); err != nil { + logger.Log(fmt.Sprintf("Failed to save anime to cache: %v", err), logger.LogOptions{ + Level: logger.Error, + Prefix: "AnimeCache", + }) + } else { + logger.Log(fmt.Sprintf("Successfully saved anime (MAL ID: %d) to cache", malID), logger.LogOptions{ + Level: logger.Debug, + Prefix: "AnimeCache", + }) + } + }() + } else { + logger.Log(fmt.Sprintf("Skipping anime cache due to TMDB error: %v", tmdbError), logger.LogOptions{ + Level: logger.Warn, + Prefix: "AnimeCache", + }) + } + return animeDetails, nil } |
