aboutsummaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-02-24 14:17:57 +0530
committerBobby <[email protected]>2026-02-24 14:17:57 +0530
commit569273e5549e56ddc8ed52a0022193cb254cd4b3 (patch)
treee67ef0860a5867ab01174cd8d1c036b03ada59c6 /services
parentde0c8e5b052342bc7aaa3e8e3795ce432208af61 (diff)
downloadmetachan-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.go47
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 {