diff options
| author | Bobby <[email protected]> | 2026-01-20 18:13:48 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-01-20 18:13:48 +0530 |
| commit | ed36e0308c7cd3a6197c899cb16bfe65cc5194b4 (patch) | |
| tree | 4c0edabf651fc9b28648760920982c938fdf3d19 /tasks | |
| parent | df6cf3edcbb560e7615ad13d8daf4843507eb11e (diff) | |
| download | metachan-ed36e0308c7cd3a6197c899cb16bfe65cc5194b4.tar.xz metachan-ed36e0308c7cd3a6197c899cb16bfe65cc5194b4.zip | |
Implement genre synchronization from MAL via Jikan API and add genre retrieval endpoint
Diffstat (limited to 'tasks')
| -rw-r--r-- | tasks/genre_sync.task.go | 82 | ||||
| -rw-r--r-- | tasks/tasks.go | 14 |
2 files changed, 96 insertions, 0 deletions
diff --git a/tasks/genre_sync.task.go b/tasks/genre_sync.task.go new file mode 100644 index 0000000..e240833 --- /dev/null +++ b/tasks/genre_sync.task.go @@ -0,0 +1,82 @@ +package tasks + +import ( + "fmt" + "metachan/database" + "metachan/entities" + "metachan/utils/api/jikan" + "metachan/utils/logger" +) + +// GenreSync synchronizes genre data from MAL via Jikan API +func GenreSync() error { + logger.Log("Starting Genre Sync from MAL", logger.LogOptions{ + Level: logger.Info, + Prefix: "GenreSync", + }) + + // Create Jikan client + client := jikan.NewJikanClient() + + // Wait for rate limit + client.WaitForRateLimit() + + // Fetch genres from Jikan API + genresResponse, err := client.GetAnimeGenres() + if err != nil { + logger.Log(fmt.Sprintf("Failed to fetch genres from MAL: %v", err), logger.LogOptions{ + Level: logger.Error, + Prefix: "GenreSync", + }) + return err + } + + logger.Log(fmt.Sprintf("Fetched %d genres from MAL", len(genresResponse.Data)), logger.LogOptions{ + Level: logger.Info, + Prefix: "GenreSync", + }) + + // Update or create genres in database + for _, genre := range genresResponse.Data { + // Create a genre entry with AnimeID = 0 to indicate it's a master genre + genreEntity := entities.AnimeGenre{ + AnimeID: 0, // Master genre, not tied to specific anime + GenreID: genre.MALID, + Name: genre.Name, + URL: genre.URL, + Count: genre.Count, + } + + // Update or create + var existing entities.AnimeGenre + result := database.DB.Where("genre_id = ? AND anime_id = 0", genre.MALID).First(&existing) + + if result.Error == nil { + // Update existing + existing.Name = genre.Name + existing.URL = genre.URL + existing.Count = genre.Count + if err := database.DB.Save(&existing).Error; err != nil { + logger.Log(fmt.Sprintf("Failed to update genre %s: %v", genre.Name, err), logger.LogOptions{ + Level: logger.Warn, + Prefix: "GenreSync", + }) + } + } else { + // Create new + if err := database.DB.Create(&genreEntity).Error; err != nil { + logger.Log(fmt.Sprintf("Failed to create genre %s: %v", genre.Name, err), logger.LogOptions{ + Level: logger.Warn, + Prefix: "GenreSync", + }) + } + } + } + + logger.Log("Genre Sync completed successfully", logger.LogOptions{ + Level: logger.Success, + Prefix: "GenreSync", + }) + + return nil +} diff --git a/tasks/tasks.go b/tasks/tasks.go index 29054e8..b6b913a 100644 --- a/tasks/tasks.go +++ b/tasks/tasks.go @@ -47,4 +47,18 @@ func init() { Prefix: "TaskManager", }) } + + // Register GenreSync task (every 7 days) + err = GlobalTaskManager.RegisterTask(types.Task{ + Name: "GenreSync", + Interval: 7 * 24 * time.Hour, + Execute: GenreSync, + }) + + if err != nil { + logger.Log(fmt.Sprintf("Failed to register GenreSync task: %v", err), logger.LogOptions{ + Level: logger.Error, + Prefix: "TaskManager", + }) + } } |
