From e72166bbe9669abe81e093ab398af066341c4ad7 Mon Sep 17 00:00:00 2001 From: Bobby <30593201+luciferreeves@users.noreply.github.com> Date: Fri, 16 Jan 2026 12:03:10 +0530 Subject: Enhance anime data retrieval and storage by adding comprehensive preload and save functionality for images, logos, covers, scores, airing status, broadcast info, genres, producers, studios, licensors, and seasons in GetAnimeByMALID and SaveAnimeToDatabase functions. --- database/anime.go | 387 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 386 insertions(+), 1 deletion(-) (limited to 'database') diff --git a/database/anime.go b/database/anime.go index e210b62..e2da1f9 100644 --- a/database/anime.go +++ b/database/anime.go @@ -12,12 +12,30 @@ import ( func GetAnimeByMALID(malID int) (*types.Anime, error) { var anime entities.Anime - result := DB.Preload("Episodes"). + result := DB.Preload("Images"). + Preload("Logos"). + Preload("Covers"). + Preload("Scores"). + Preload("AiringStatus"). + Preload("AiringStatus.From"). + Preload("AiringStatus.To"). + Preload("Broadcast"). + Preload("Genres"). + Preload("Producers"). + Preload("Studios"). + Preload("Licensors"). + Preload("Episodes"). Preload("Episodes.Titles"). Preload("Characters"). Preload("Characters.VoiceActors"). Preload("AiringSchedule"). Preload("NextAiringEpisode"). + Preload("Seasons"). + Preload("Seasons.Images"). + Preload("Seasons.Scores"). + Preload("Seasons.AiringStatus"). + Preload("Seasons.AiringStatus.From"). + Preload("Seasons.AiringStatus.To"). Where("mal_id = ?", malID).First(&anime) if result.Error != nil { @@ -74,6 +92,178 @@ func SaveAnimeToDatabase(animeData *types.Anime) error { LastUpdated: time.Now(), } + // Save images + if animeData.Images.Small != "" || animeData.Images.Large != "" || animeData.Images.Original != "" { + anime.Images = &entities.AnimeImages{ + Small: animeData.Images.Small, + Large: animeData.Images.Large, + Original: animeData.Images.Original, + } + } + + // Save logos + if animeData.Logos.Small != "" || animeData.Logos.Medium != "" || animeData.Logos.Large != "" { + anime.Logos = &entities.AnimeLogos{ + Small: animeData.Logos.Small, + Medium: animeData.Logos.Medium, + Large: animeData.Logos.Large, + XLarge: animeData.Logos.XLarge, + Original: animeData.Logos.Original, + } + } + + // Save covers + if animeData.Covers.Small != "" || animeData.Covers.Large != "" || animeData.Covers.Original != "" { + anime.Covers = &entities.AnimeCovers{ + Small: animeData.Covers.Small, + Large: animeData.Covers.Large, + Original: animeData.Covers.Original, + } + } + + // Save scores + if animeData.Scores.Score > 0 || animeData.Scores.ScoredBy > 0 { + anime.Scores = &entities.AnimeScores{ + Score: animeData.Scores.Score, + ScoredBy: animeData.Scores.ScoredBy, + Rank: animeData.Scores.Rank, + Popularity: animeData.Scores.Popularity, + Members: animeData.Scores.Members, + Favorites: animeData.Scores.Favorites, + } + } + + // Save airing status + if animeData.AiringStatus.String != "" { + airingStatus := &entities.AiringStatus{ + String: animeData.AiringStatus.String, + } + + if animeData.AiringStatus.From.Year > 0 { + airingStatus.From = &entities.AiringStatusDates{ + Day: animeData.AiringStatus.From.Day, + Month: animeData.AiringStatus.From.Month, + Year: animeData.AiringStatus.From.Year, + String: animeData.AiringStatus.From.String, + } + } + + if animeData.AiringStatus.To.Year > 0 { + airingStatus.To = &entities.AiringStatusDates{ + Day: animeData.AiringStatus.To.Day, + Month: animeData.AiringStatus.To.Month, + Year: animeData.AiringStatus.To.Year, + String: animeData.AiringStatus.To.String, + } + } + + anime.AiringStatus = airingStatus + } + + // Save broadcast info + if animeData.Broadcast.String != "" { + anime.Broadcast = &entities.AnimeBroadcast{ + Day: animeData.Broadcast.Day, + Time: animeData.Broadcast.Time, + Timezone: animeData.Broadcast.Timezone, + String: animeData.Broadcast.String, + } + } + + // Save genres + if len(animeData.Genres) > 0 { + anime.Genres = make([]entities.AnimeGenre, len(animeData.Genres)) + for i, genre := range animeData.Genres { + anime.Genres[i] = entities.AnimeGenre{ + Name: genre.Name, + GenreID: genre.GenreID, + URL: genre.URL, + } + } + } + + // Save producers + if len(animeData.Producers) > 0 { + anime.Producers = make([]entities.AnimeProducer, len(animeData.Producers)) + for i, producer := range animeData.Producers { + anime.Producers[i] = entities.AnimeProducer{ + Name: producer.Name, + ProducerID: producer.ProducerID, + URL: producer.URL, + } + } + } + + // Save studios + if len(animeData.Studios) > 0 { + anime.Studios = make([]entities.AnimeStudio, len(animeData.Studios)) + for i, studio := range animeData.Studios { + anime.Studios[i] = entities.AnimeStudio{ + Name: studio.Name, + StudioID: studio.StudioID, + URL: studio.URL, + } + } + } + + // Save licensors + if len(animeData.Licensors) > 0 { + anime.Licensors = make([]entities.AnimeLicensor, len(animeData.Licensors)) + for i, licensor := range animeData.Licensors { + anime.Licensors[i] = entities.AnimeLicensor{ + Name: licensor.Name, + ProducerID: licensor.ProducerID, + URL: licensor.URL, + } + } + } + + // Save seasons + if len(animeData.Seasons) > 0 { + anime.Seasons = make([]entities.AnimeSeason, len(animeData.Seasons)) + for i, season := range animeData.Seasons { + animeSeason := entities.AnimeSeason{ + MALID: season.MALID, + TitleRomaji: season.Titles.Romaji, + TitleEnglish: season.Titles.English, + TitleJapanese: season.Titles.Japanese, + TitleSynonyms: strings.Join(season.Titles.Synonyms, ","), + Synopsis: season.Synopsis, + Type: string(season.Type), + Source: season.Source, + Airing: season.Airing, + Status: season.Status, + Duration: season.Duration, + Season: season.Season, + Year: season.Year, + Current: season.Current, + } + + // Save season images + if season.Images.Small != "" || season.Images.Large != "" { + animeSeason.Images = &entities.AnimeImages{ + Small: season.Images.Small, + Large: season.Images.Large, + Original: season.Images.Original, + } + } + + // Save season scores + if season.Scores.Score > 0 { + animeSeason.Scores = &entities.AnimeScores{ + Score: season.Scores.Score, + ScoredBy: season.Scores.ScoredBy, + Rank: season.Scores.Rank, + Popularity: season.Scores.Popularity, + Members: season.Scores.Members, + Favorites: season.Scores.Favorites, + } + } + + anime.Seasons[i] = animeSeason + } + } + if len(animeData.Episodes.Episodes) > 0 { anime.Episodes = make([]entities.AnimeSingleEpisode, len(animeData.Episodes.Episodes)) for i, episode := range animeData.Episodes.Episodes { @@ -193,6 +383,201 @@ func ConvertToTypesAnime(anime *entities.Anime) *types.Anime { }, } + // Convert images + if anime.Images != nil { + result.Images = types.AnimeImages{ + Small: anime.Images.Small, + Large: anime.Images.Large, + Original: anime.Images.Original, + } + } + + // Convert logos + if anime.Logos != nil { + result.Logos = types.AnimeLogos{ + Small: anime.Logos.Small, + Medium: anime.Logos.Medium, + Large: anime.Logos.Large, + XLarge: anime.Logos.XLarge, + Original: anime.Logos.Original, + } + } + + // Convert covers + if anime.Covers != nil { + result.Covers = types.AnimeImages{ + Small: anime.Covers.Small, + Large: anime.Covers.Large, + Original: anime.Covers.Original, + } + } + + // Convert scores + if anime.Scores != nil { + result.Scores = types.AnimeScores{ + Score: anime.Scores.Score, + ScoredBy: anime.Scores.ScoredBy, + Rank: anime.Scores.Rank, + Popularity: anime.Scores.Popularity, + Members: anime.Scores.Members, + Favorites: anime.Scores.Favorites, + } + } + + // Convert airing status + if anime.AiringStatus != nil { + result.AiringStatus = types.AiringStatus{ + String: anime.AiringStatus.String, + } + + if anime.AiringStatus.From != nil { + result.AiringStatus.From = types.AiringStatusDates{ + Day: anime.AiringStatus.From.Day, + Month: anime.AiringStatus.From.Month, + Year: anime.AiringStatus.From.Year, + String: anime.AiringStatus.From.String, + } + } + + if anime.AiringStatus.To != nil { + result.AiringStatus.To = types.AiringStatusDates{ + Day: anime.AiringStatus.To.Day, + Month: anime.AiringStatus.To.Month, + Year: anime.AiringStatus.To.Year, + String: anime.AiringStatus.To.String, + } + } + } + + // Convert broadcast + if anime.Broadcast != nil { + result.Broadcast = types.AnimeBroadcast{ + Day: anime.Broadcast.Day, + Time: anime.Broadcast.Time, + Timezone: anime.Broadcast.Timezone, + String: anime.Broadcast.String, + } + } + + // Convert genres + if len(anime.Genres) > 0 { + result.Genres = make([]types.AnimeGenres, len(anime.Genres)) + for i, genre := range anime.Genres { + result.Genres[i] = types.AnimeGenres{ + Name: genre.Name, + GenreID: genre.GenreID, + URL: genre.URL, + } + } + } + + // Convert producers + if len(anime.Producers) > 0 { + result.Producers = make([]types.AnimeProducer, len(anime.Producers)) + for i, producer := range anime.Producers { + result.Producers[i] = types.AnimeProducer{ + Name: producer.Name, + ProducerID: producer.ProducerID, + URL: producer.URL, + } + } + } + + // Convert studios + if len(anime.Studios) > 0 { + result.Studios = make([]types.AnimeStudio, len(anime.Studios)) + for i, studio := range anime.Studios { + result.Studios[i] = types.AnimeStudio{ + Name: studio.Name, + StudioID: studio.StudioID, + URL: studio.URL, + } + } + } + + // Convert licensors + if len(anime.Licensors) > 0 { + result.Licensors = make([]types.AnimeLicensor, len(anime.Licensors)) + for i, licensor := range anime.Licensors { + result.Licensors[i] = types.AnimeLicensor{ + Name: licensor.Name, + ProducerID: licensor.ProducerID, + URL: licensor.URL, + } + } + } + + // Convert seasons + if len(anime.Seasons) > 0 { + result.Seasons = make([]types.AnimeSeason, len(anime.Seasons)) + for i, season := range anime.Seasons { + result.Seasons[i] = types.AnimeSeason{ + MALID: season.MALID, + Titles: types.AnimeTitles{ + Romaji: season.TitleRomaji, + English: season.TitleEnglish, + Japanese: season.TitleJapanese, + Synonyms: strings.Split(season.TitleSynonyms, ","), + }, + Synopsis: season.Synopsis, + Type: types.AniSyncType(season.Type), + Source: season.Source, + Airing: season.Airing, + Status: season.Status, + Duration: season.Duration, + Season: season.Season, + Year: season.Year, + Current: season.Current, + } + + // Convert season images + if season.Images != nil { + result.Seasons[i].Images = types.AnimeImages{ + Small: season.Images.Small, + Large: season.Images.Large, + Original: season.Images.Original, + } + } + + // Convert season scores + if season.Scores != nil { + result.Seasons[i].Scores = types.AnimeScores{ + Score: season.Scores.Score, + ScoredBy: season.Scores.ScoredBy, + Rank: season.Scores.Rank, + Popularity: season.Scores.Popularity, + Members: season.Scores.Members, + Favorites: season.Scores.Favorites, + } + } + + // Convert season airing status + if season.AiringStatus != nil { + result.Seasons[i].AiringStatus = types.AiringStatus{ + String: season.AiringStatus.String, + } + + if season.AiringStatus.From != nil { + result.Seasons[i].AiringStatus.From = types.AiringStatusDates{ + Day: season.AiringStatus.From.Day, + Month: season.AiringStatus.From.Month, + Year: season.AiringStatus.From.Year, + String: season.AiringStatus.From.String, + } + } + + if season.AiringStatus.To != nil { + result.Seasons[i].AiringStatus.To = types.AiringStatusDates{ + Day: season.AiringStatus.To.Day, + Month: season.AiringStatus.To.Month, + Year: season.AiringStatus.To.Year, + String: season.AiringStatus.To.String, + } + } + } + } + } + if len(anime.Episodes) > 0 { result.Episodes.Episodes = make([]types.AnimeSingleEpisode, len(anime.Episodes)) for i, episode := range anime.Episodes { -- cgit v1.2.3