diff options
| author | Bobby <[email protected]> | 2026-02-24 14:17:57 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-02-24 14:17:57 +0530 |
| commit | 569273e5549e56ddc8ed52a0022193cb254cd4b3 (patch) | |
| tree | e67ef0860a5867ab01174cd8d1c036b03ada59c6 /services | |
| parent | de0c8e5b052342bc7aaa3e8e3795ce432208af61 (diff) | |
| download | metachan-569273e5549e56ddc8ed52a0022193cb254cd4b3.tar.xz metachan-569273e5549e56ddc8ed52a0022193cb254cd4b3.zip | |
Add anime stub retrieval and enhance anime sync logic with force refresh capability
Diffstat (limited to 'services')
| -rw-r--r-- | services/anime.go | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/services/anime.go b/services/anime.go index eba303b..6efd81e 100644 --- a/services/anime.go +++ b/services/anime.go @@ -15,6 +15,7 @@ import ( "metachan/utils/api/tvdb" "metachan/utils/logger" "strings" + "time" ) func GetAnime(mapping *entities.Mapping) (*entities.Anime, error) { @@ -26,13 +27,42 @@ func GetAnime(mapping *entities.Mapping) (*entities.Anime, error) { malID := mapping.MAL logger.Infof("AnimeService", "Fetching anime data for MAL ID: %d", malID) - var anime *entities.Anime existingAnime, err := repositories.GetAnime(enums.MAL, malID) if err == nil { - logger.Infof("AnimeService", "Found existing anime in database, will update with fresh data") - anime = &existingAnime + if time.Since(existingAnime.UpdatedAt) < 7*24*time.Hour { + logger.Infof("AnimeService", "Returning cached anime (MAL ID: %d, age: %v)", malID, time.Since(existingAnime.UpdatedAt).Round(time.Second)) + return &existingAnime, nil + } + logger.Infof("AnimeService", "Cached anime is stale, refreshing (MAL ID: %d)", malID) + return fetchAnime(mapping, &existingAnime) + } + + logger.Infof("AnimeService", "Anime not found in database, creating new") + return fetchAnime(mapping, nil) +} + +func ForceRefreshAnime(mapping *entities.Mapping) (*entities.Anime, error) { + if mapping == nil { + logger.Errorf("AnimeService", "Mapping is nil") + return nil, fmt.Errorf("mapping is nil") + } + + logger.Infof("AnimeService", "Force refreshing anime data for MAL ID: %d", mapping.MAL) + + existingAnime, err := repositories.GetAnime(enums.MAL, mapping.MAL) + if err == nil { + return fetchAnime(mapping, &existingAnime) + } + return fetchAnime(mapping, nil) +} + +func fetchAnime(mapping *entities.Mapping, existing *entities.Anime) (*entities.Anime, error) { + malID := mapping.MAL + + var anime *entities.Anime + if existing != nil { + anime = existing } else { - logger.Infof("AnimeService", "Anime not found in database, creating new") anime = &entities.Anime{ MALID: malID, Mapping: mapping, @@ -56,6 +86,15 @@ func GetAnime(mapping *entities.Mapping) (*entities.Anime, error) { logger.Warnf("AnimeService", "Failed to fetch characters from Jikan: %v", err) } + // Reset all slice fields so re-fetching doesn't double-append onto existing DB data + anime.Episodes = nil + anime.Characters = nil + anime.Genres = nil + anime.Producers = nil + anime.Studios = nil + anime.Licensors = nil + anime.Schedule = nil + applyJikanData(anime, jikanAnime, jikanEpisodes, jikanCharacters) if mapping.Anilist > 0 { |
