diff options
Diffstat (limited to 'tasks/anisync.task.go')
| -rw-r--r-- | tasks/anisync.task.go | 112 |
1 files changed, 18 insertions, 94 deletions
diff --git a/tasks/anisync.task.go b/tasks/anisync.task.go index dc98d3e..0a346ac 100644 --- a/tasks/anisync.task.go +++ b/tasks/anisync.task.go @@ -1,145 +1,69 @@ package tasks import ( - "fmt" - "metachan/database" - "metachan/entities" - "metachan/services/anime" + "metachan/enums" + "metachan/repositories" + "metachan/services" "metachan/utils/logger" "time" ) -// AniSync fetches full anime details for all anime in the database func AniSync() error { - logger.Log("Starting Anime Sync - Fetching full anime details", logger.LogOptions{ - Level: logger.Info, - Prefix: "AniSync", - }) + logger.Infof("AniSync", "Starting Anime Sync - Fetching full anime details") - // Get all anime mappings - var mappings []entities.AnimeMapping - if err := database.DB.Find(&mappings).Error; err != nil { - logger.Log(fmt.Sprintf("Failed to fetch anime mappings: %v", err), logger.LogOptions{ - Level: logger.Error, - Prefix: "AniSync", - }) + mappings, err := repositories.GetAllMappings() + if err != nil { + logger.Errorf("AniSync", "Failed to fetch anime mappings: %v", err) return err } total := len(mappings) - logger.Log(fmt.Sprintf("Found %d anime mappings", total), logger.LogOptions{ - Level: logger.Info, - Prefix: "AniSync", - }) + logger.Infof("AniSync", "Found %d anime mappings", total) - // Pre-count items needing sync for accurate ETA itemsToSync := 0 for _, mapping := range mappings { if mapping.MAL == 0 { continue } - var existingAnime entities.Anime - err := database.DB.Where("mal_id = ?", mapping.MAL).First(&existingAnime).Error + _, err := repositories.GetAnime(enums.MAL, mapping.MAL) if err == nil { - var episodeCount int64 - database.DB.Model(&entities.AnimeSingleEpisode{}).Where("anime_id = ?", existingAnime.ID).Count(&episodeCount) - if episodeCount > 0 { - continue - } + continue } itemsToSync++ } - logger.Log(fmt.Sprintf("Found %d anime to sync (%d already synced)", itemsToSync, total-itemsToSync), logger.LogOptions{ - Level: logger.Info, - Prefix: "AniSync", - }) + logger.Infof("AniSync", "Found %d anime to sync (%d already synced)", itemsToSync, total-itemsToSync) - animeService := anime.NewService() synced := 0 skipped := 0 startTime := time.Now() processed := 0 for _, mapping := range mappings { - // Skip if MAL ID is 0 (invalid) if mapping.MAL == 0 { skipped++ continue } - // Check if anime already exists in DB - var existingAnime entities.Anime - err := database.DB.Where("mal_id = ?", mapping.MAL).First(&existingAnime).Error - + _, err := repositories.GetAnime(enums.MAL, mapping.MAL) if err == nil { - // Check if anime has full details (has episodes) - var episodeCount int64 - database.DB.Model(&entities.AnimeSingleEpisode{}).Where("anime_id = ?", existingAnime.ID).Count(&episodeCount) - - if episodeCount > 0 { - skipped++ - continue - } + skipped++ + continue } - // Calculate progress and ETA - progress := float64(processed+1) / float64(itemsToSync) * 100 - eta := "" - if processed >= 10 { - elapsed := time.Since(startTime) - avgTimePerItem := elapsed / time.Duration(processed) - remainingItems := itemsToSync - processed - remaining := time.Duration(remainingItems) * avgTimePerItem - eta = formatDuration(remaining) - } else { - eta = "calculating..." - } + progress, eta := calculateProgress(processed+1, itemsToSync, startTime) - // Fetch full anime details - logger.Log(fmt.Sprintf("[%d/%d] Synchronising MAL ID %d - %.1f%% | ETA: %s", processed+1, itemsToSync, mapping.MAL, progress, eta), logger.LogOptions{ - Level: logger.Info, - Prefix: "AniSync", - }) + logger.Infof("AniSync", "[%d/%d] Synchronising MAL ID %d - %.1f%% | ETA: %v", processed+1, itemsToSync, mapping.MAL, progress, eta) - _, err = animeService.GetAnimeDetailsWithSource(&mapping, "anisync") + _, err = services.GetAnime(&mapping) if err != nil { - logger.Log(fmt.Sprintf("Failed to sync anime MAL ID %d: %v", mapping.MAL, err), logger.LogOptions{ - Level: logger.Warn, - Prefix: "AniSync", - }) + logger.Warnf("AniSync", "Failed to sync anime MAL ID %d: %v", mapping.MAL, err) continue } synced++ processed++ - - // Sleep to respect rate limits (1 second between requests) - time.Sleep(1 * time.Second) } - logger.Log(fmt.Sprintf("Anime Sync completed: %d synced, %d skipped", synced, skipped), logger.LogOptions{ - Level: logger.Success, - Prefix: "AniSync", - }) - return nil } - -// formatDuration converts duration to human-readable format -func formatDuration(d time.Duration) string { - d = d.Round(time.Second) - h := d / time.Hour - d -= h * time.Hour - m := d / time.Minute - d -= m * time.Minute - s := d / time.Second - - if h > 0 { - return fmt.Sprintf("%dh %dm", h, m) - } - if m > 0 { - return fmt.Sprintf("%dm %ds", m, s) - } - return fmt.Sprintf("%ds", s) -} |
