aboutsummaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorBobby <[email protected]>2025-05-09 03:56:20 +0530
committerBobby <[email protected]>2025-05-09 03:56:20 +0530
commitee0af834ab9ccd9954a37f76b1595b88f1bbcb51 (patch)
tree4112015236b484eddb846741a6bc252f37ecd56c /services
parent6869a86c26793622f6018b0cf49e1e6b046dffc4 (diff)
downloadmetachan-ee0af834ab9ccd9954a37f76b1595b88f1bbcb51.tar.xz
metachan-ee0af834ab9ccd9954a37f76b1595b88f1bbcb51.zip
added anime cache
Diffstat (limited to 'services')
-rw-r--r--services/anime/service.go47
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
}