aboutsummaryrefslogtreecommitdiff
path: root/tasks/anisync.task.go
diff options
context:
space:
mode:
Diffstat (limited to 'tasks/anisync.task.go')
-rw-r--r--tasks/anisync.task.go112
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)
-}